繁体   English   中英

从Memorystream播放,播放结束后停止播放,然后重新开始录制

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM