我正在尝试用NAudio回放音频,使用用BufferedWaveProvider初始化的WaveOut。UdpClient接收分离线程中的音频数据包,并通过AddSamples()将它们写入BufferedWaveProvider。
到目前为止,一切都按其应有的方式运作。
不幸的是,当切换设备(根据所选设备设置DeviceId属性并重新初始化WaveOut)时,会发生MmException。
不知何故,当WaveFormat of BufferedWaveProvider设置为任意A-或ULawFormat (例如,使用WaveFormat.CreateALawFormat(8000, 1))时,错误才会发生。当将其设置为new WaveFormat(8000, 8, 1)时,音频设备工作正常,但是接收到的音频没有得到正确的播放(因为它是与G711A Codec => ALawFormat一起发送的)。
下面是示例代码(为了演示目的,这里使用的是WaveFileReader而不是UdpClient ):
public class MainViewModel {
private BufferedWaveProvider _WaveProvider;
private WaveOut _WaveOut;
public ObservableCollection<string> AllAudioDevices { get; set; }
private string _SelectedAudioDevice;
public string SelectedAudioDevice {
get => _SelectedAudioDevice;
set {
_SelectedAudioDevice = value;
OnSelectedAudioDeviceChanged(value);
}
}
public MainViewModel() {
_WaveProvider = new BufferedWaveProvider(new WaveFormat(8000, 1));
_WaveOut = new WaveOut();
AllAudioDevices = LoadAllAudioDevices();
SelectedAudioDevice = AllAudioDevices[0];
}
private ObservableCollection<string> LoadAllAudioDevices() {
var allAudioDevices = new ObservableCollection<string>();
for (int i = 0; i < WaveOut.DeviceCount; i++) {
allAudioDevices.Add(WaveOut.GetCapabilities(i).ProductName);
}
return allAudioDevices;
}
private void OnSelectedAudioDeviceChanged(string newAudioDevice) {
_WaveOut.Stop();
_WaveOut = new WaveOut();
_WaveOut.DeviceNumber = AllAudioDevices.IndexOf(newAudioDevice);
_WaveOut.Init(_WaveProvider);
_WaveOut.Play();
new Thread(ReceiveAudio).Start();
}
private void ReceiveAudio() {
var reader = new WaveFileReader(@"D:\temp\test.wav");
byte[] readBytes;
int readCount;
do {
readBytes = new byte[1000];
readCount = reader.Read(readBytes, 0, readBytes.Length);
if (readCount == 0) {
break;
}
_WaveProvider.AddSamples(readBytes, 0, readBytes.Length);
Thread.Sleep(100);
} while (true);
}
}发布于 2022-07-30 15:22:57
您不能直接使用u-law或a-law打开输出设备。您需要转换为16位PCM。幸运的是,在NAudio中这样做非常容易--只需使用MuLawDecoder或ALawDecoder类即可。您还可以在NAudio GitHub repo中找到一个网络聊天演示,它显示了一个与您试图实现的非常相似的用例。
https://stackoverflow.com/questions/73069466
复制相似问题