1

別のクラスによってイベントで返された PCM オーディオ サンプルを再生しようとしています。それらをファイルに保存してからストリームとして再生すると、すべて問題ありません。しかし、リアルタイム再生では何も起こりません。PlaybackState は Stopped に設定されます。コードは次のとおりです。

WaveFormat wf = new WaveFormat(8000, 1);
    MemoryStream ms;
    WaveStream blockAlignedStream;
    WaveOut waveOut;
    short[] PCMSamples = new short[320];

    void StartPlayback()
    {
        ms = new MemoryStream();

        blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(new NAudio.Wave.RawSourceWaveStream(ms[1], wf)));

        waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback());
        waveOut.Init(blockAlignedStream);
        waveOut.Play();
    }

    public void PCMStreamEventHandler(byte[] data)
    {
        this.Invoke((MethodInvoker)delegate
        {
            var pos = ms.Position;
            codec.Convert(data, PCMSamples);
            ms.Position = ms.Length;
            byte[] buffer = new byte[PCMSamples.Length * 2];
            Buffer.BlockCopy(PCMSamples, 0, buffer, 0, buffer.Length);
            ms.Write(buffer, 0, buffer.Length);
            ms.Position = pos;
        });
    }

リアルタイム PCM 再生に関するヘルプをいただければ幸いです。ありがとう。

4

1 に答える 1

1

これには を使用しBufferedWaveProviderます。BufferedWaveProvider受信したバイトを、到着したときに に入れるだけです。また、 は必要ありませんBlockAlignReductionStream。関数のコールバックを避けることを強くお勧めします。WaveOutEvent代わりに使用してください。

于 2013-06-10T13:34:16.757 に答える