[英]Play from Memorystream, stop when reached end and start recording again
我正在使用NAudio,目前正在玩耍。
而现在,我有一个问题。
我将麦克风录制到记忆流中。
当我单击一个按钮时,它将停止录制(以防止同时写入和读取)并从该记忆流中播放。
但是我不知道该怎么说,当它到达终点时是否应该重新开始。
这样,在播放后,它将再次录制我的麦克风,并且我可以重做该过程。
谢谢
private void play_Click(object sender, EventArgs e)
{
StreamReader streamu = new StreamReader(waveStream);
//waveWriter.Close();
sourceStream.StopRecording();
// Wasout.Dispose();
waveStream.Seek(0, SeekOrigin.Begin);
//waveStream.Read(bytes, 0, waveStream.Length);
playwave = new NAudio.Wave.RawSourceWaveStream(@waveStream, sourceStream.WaveFormat);
waveOut2.Init(playwave);
//Aut.InitRecordAndPlayback(playwave, 2, 48000);
waveOut2.Play();
if (streamu.EndOfStream)
{
waveOut2.Dispose();
waveOut2 = new NAudio.Wave.DirectSoundOut();
sourceStream.StartRecording();
Wasout.Init(waveIn);
Wasout.Play();
}
}
这就是我现在正在做的,并且您可以看到,我正在四处乱逛。 嗯,这不起作用; P
从NAudioDemo创建一个LoopStream,就像这样,然后将RawSourceWaveStream传递到其中。 (可能可以简化一些,但演示了基本思想)
class LoopStream : WaveStream
{
WaveStream sourceStream;
public LoopStream(WaveStream source)
{
this.sourceStream = source;
}
public override WaveFormat WaveFormat
{
get { return sourceStream.WaveFormat; }
}
public override long Length
{
get { return long.MaxValue / 32; }
}
public override long Position
{
get
{
return sourceStream.Position;
}
set
{
sourceStream.Position = value;
}
}
public override bool HasData(int count)
{
// infinite loop
return true;
}
public override int Read(byte[] buffer, int offset, int count)
{
int read = 0;
while (read < count)
{
int required = count - read;
int readThisTime = sourceStream.Read(buffer, offset + read, required);
if (readThisTime < required)
{
sourceStream.Position = 0;
}
if (sourceStream.Position >= sourceStream.Length)
{
sourceStream.Position = 0;
}
read += readThisTime;
}
return read;
}
protected override void Dispose(bool disposing)
{
sourceStream.Dispose();
base.Dispose(disposing);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.