C# 从Memorystream播放,到达结束时停止,然后再次开始录制

C# 从Memorystream播放,到达结束时停止,然后再次开始录制,c#,playback,naudio,memorystream,C#,Playback,Naudio,Memorystream,我正在使用NAudio,我现在正在玩 现在,我有个问题 我把麦克风录成记忆流 当我点击一个按钮时,它停止录制(防止同时写入和读取) 从记忆流中演奏 但是我不知道该怎么说,当它结束的时候,我们是否应该重新开始 这样,在它播放后,它会再次录制我的麦克风,我可以重做这个过程 谢谢 private void play_Click(object sender, EventArgs e) { StreamReader streamu = new StreamReade

我正在使用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中的循环流,并将您的RawSourceWaveStream传递给该循环流。(可能可以简化一点,但演示了基本思想)

class LoopStream:WaveStream
{
波流源流;
公共环流(波流源)
{
this.sourceStream=source;
}
公共覆盖波格式
{
获取{return sourceStream.WaveFormat;}
}
公共覆盖长长度
{
获取{return long.MaxValue/32;}
}
公众优先多头仓位
{
得到
{
返回sourceStream.Position;
}
设置
{
sourceStream.Position=值;
}
}
公共覆盖布尔HasData(整数计数)
{
//无限循环
返回true;
}
公共重写整型读取(字节[]缓冲区、整型偏移量、整型计数)
{
int read=0;
while(读取<计数)
{
int required=计数-读取;
int readThisTime=sourceStream.Read(缓冲区,偏移量+读取,必需);
如果(ReadThistTime<必需)
{
sourceStream.Position=0;
}
if(sourceStream.Position>=sourceStream.Length)
{
sourceStream.Position=0;
}
read+=readthist;
}
返回读取;
}
受保护的覆盖无效处置(布尔处置)
{
Dispose();
基地。处置(处置);
}
}

有没有一种编写起来更简单的方法?这是很难做到的;我不能检测它何时播放到最后,清除memstream,然后再次录制吗?感谢没有太多,只需将代码剪切并粘贴到项目中,然后调用waveOut.Init(newloopstream(playWave));事实上,我想我可能误解了你的问题。要检测播放结束,请使用PlaybackStopped事件。然后你可以开始另一个记录。我甚至不知道如何使用类,需要查看一下。但是我会尝试播放后挡板,如果它像(当音频可用时录制音频),那么我希望能解决一些问题。谢谢
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);
    }
}