使用 Naudio 的 RawSourceWaveStream 音量控制和播放时间估计

RawSourceWaveStream volume control and playback time estimation with Naudio

我正在使用 Naudio 播放内存中的音频样本。

        private RawSourceWaveStream waveStream;
        private MemoryStream ms;
        private int sampleRate = 48000;
        private IWavePlayer wavePlayer;

        //generate sine wave signal
        short[] buffer = new short[(int)Math.Round(sampleRate * 10.00)];
        double amplitude = 0.25 * short.MaxValue;
        double frequency = 1000;
        for (int n = 0; n < buffer.Length; n++)
        {
            buffer[n] = (short)(amplitude * Math.Sin((2 * Math.PI * n * frequency) / sampleRate));
        }
        byte[] byteBuffer = new byte[buffer.Length * sizeof(short)];
        Buffer.BlockCopy(buffer, 0, byteBuffer, 0, byteBuffer.Length);

        //create audio player to play samples from memory
        ms = new MemoryStream(byteBuffer);
        waveStream = new RawSourceWaveStream(ms, new WaveFormat(sampleRate, 16, 1));
        //wavePlayer = new WaveOutEvent();
        wavePlayer = new DirectSoundOut();

        wavePlayer.Init(waveStream);
        wavePlayer.PlaybackStopped += wavePlayer_PlaybackStopped;

我想分别控制每个流的 RawSourceWaveStream 的音量。 (我将播放多个流)。

1)用wavePlayer.Volume = volumeSlider1.Volume;就够了吗?它已被弃用。

2) 我看到 AudioFileReader 使用 SampleChannel 进行音量控制。如果我重写 RawSourceWaveStream 的读取方法并添加卷 属性 这应该是一个好的解决方案吗?

3) 我希望播放时间估计尽可能最好(毫秒级)。我看到 WaveOutEvent 的时间分辨率大约是百毫秒。 DirectSoundOut 的时间分辨率更好,但仍然不够。

提前致谢!

1) 是的,您可以使用 WaveOut.Volume。另一种选择是使用 VolumeSampleProvider 之类的东西在我们的信号链中而不是在设备上进行音量

2) 无需重写 - 调用 .ToSampleProvider() 扩展方法,然后通过 VolumeSampleProvider

传递

3) RawSourceStream 上的 Position 显示您读入文件的程度,但不准确显示播放位置,因为某些音频可能仍处于缓冲状态以准备播放。查看 WaveOut 上的 GetPosition(),其中 returns 到目前为止播放的字节数,是可用的最准确选项。