首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NAudio:用BufferedWaveProvider初始化WaveOut时的WaveBadFormat异常

NAudio:用BufferedWaveProvider初始化WaveOut时的WaveBadFormat异常
EN

Stack Overflow用户
提问于 2022-07-21 16:09:03
回答 1查看 34关注 0票数 0

我正在尝试用NAudio回放音频,使用用BufferedWaveProvider初始化的WaveOutUdpClient接收分离线程中的音频数据包,并通过AddSamples()将它们写入BufferedWaveProvider

到目前为止,一切都按其应有的方式运作。

不幸的是,当切换设备(根据所选设备设置DeviceId属性并重新初始化WaveOut)时,会发生MmException

不知何故,当WaveFormat of BufferedWaveProvider设置为任意A-或ULawFormat (例如,使用WaveFormat.CreateALawFormat(8000, 1))时,错误才会发生。当将其设置为new WaveFormat(8000, 8, 1)时,音频设备工作正常,但是接收到的音频没有得到正确的播放(因为它是与G711A Codec => ALawFormat一起发送的)。

下面是示例代码(为了演示目的,这里使用的是WaveFileReader而不是UdpClient ):

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-07-30 15:22:57

您不能直接使用u-law或a-law打开输出设备。您需要转换为16位PCM。幸运的是,在NAudio中这样做非常容易--只需使用MuLawDecoderALawDecoder类即可。您还可以在NAudio GitHub repo中找到一个网络聊天演示,它显示了一个与您试图实现的非常相似的用例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73069466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档