【问题标题】:Issues with BufferedWaveProviderBufferedWaveProvider 的问题
【发布时间】:2020-06-26 14:08:15
【问题描述】:

我已经为此绞尽脑汁已经有一段时间了。我已经查看了所有内容,但在这里找不到任何问题的答案。我试图完成的是一个功能,它允许我选择麦克风的输入卡和输出卡去收音机。此代码在初次尝试时有效,但是一旦我停止“传输”,您就会听到听起来像是双倍音频流的声音,并且它变得迟钝并最终因缓冲区满异常而崩溃。我不确定我在这里做错了什么。

        public WaveOutEvent outputDevice = new WaveOutEvent() { DeviceNumber = -1 };
        public WaveInEvent inputDevice = new WaveInEvent() { DeviceNumber = -1 };
        public bool transmit = false;
        public bool markerActive = false;
        public bool alert1Active = false;
    
        public SerialPort port = new SerialPort();
        public string[] ports = SerialPort.GetPortNames();

        private BufferedWaveProvider bufferedWaveProvider;
        
        public string keyTransmitter()
        {
            
            string label;
            if (transmit)
            {
                transmit = false;
                port.DtrEnable = false;
                port.RtsEnable = false;
                label = "Transmit";
                bufferedWaveProvider.ClearBuffer();
                
                inputDevice.StopRecording();
                inputDevice.Dispose();

                outputDevice.Dispose();
                outputDevice.Stop();
                
               
            }
            else
            {
                transmit = true;
                port.DtrEnable = true;
                port.RtsEnable = true;
                label = "Transmitting";
             
                bufferedWaveProvider = new BufferedWaveProvider(inputDevice.WaveFormat);
                inputDevice.DataAvailable += OnDataAvailable;
                inputDevice.StartRecording();

                outputDevice.Init(bufferedWaveProvider);
                outputDevice.Play();
            


            }

            return label;
        }

        public void OnDataAvailable(object sender, WaveInEventArgs args)
        {
            bufferedWaveProvider.AddSamples(args.Buffer, 0, args.BytesRecorded);
            //bufferedWaveProvider.DiscardOnBufferOverflow = true;
 
        }

【问题讨论】:

    标签: c# .net audio buffer naudio


    【解决方案1】:

    BufferedWaveProvider 有大小限制,如果它想要更多音频就必须更改它,但它最终会过载,所以我们将使用“DiscardOnBufferOverflow”,所以这里是代码示例:

    注意:如果您使用的是单次复制,则无需将 BufferedWaveProvider 更改为新的。

    BufferedWaveProvider waveChannel = new BufferedWaveProvider(INFO HERE);
    waveChannel.BufferDuration = new TimeSpan(0, 1, 0); //BufferDuration, 1 minute
    waveChannel.DiscardOnBufferOverflow = true; //The name says
    

    没有必要再次使用“init”或“play”,因为BufferedWaveProvider,当没有缓冲时,它会为WaveOut产生静音

    来自谷歌翻译的英语

    【讨论】:

    • 这根本没有很好地回答我的问题。
    • 您是否尝试过激活“DiscardOnBufferOverflow”并使用“WaveOut”和“WaveIn”而不是“WaveOutEvent”和“WaveInEvent”?开发人员建议在这些情况下使用它们以获得更大的兼容性。我还注意到您一直在重新创建“bufferedWave Provider”,这不是必需的,如果更改了“WaveFormat”,只需更改它即可。
    • 至于再现的延迟,总会有,但是可以在“WaveIn”的“BufferMilliseconds”属性中减少,如果减少毫秒会减少等待新缓冲区的时间,但是那有一些缺点,我用naudio做udp流,20毫秒似乎比较理想,推荐在50到100之间
    猜你喜欢
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2022-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多