使用 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 到目前为止播放的字节数,是可用的最准确选项。
我正在使用 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 到目前为止播放的字节数,是可用的最准确选项。