首页 > 解决方案 > BufferedWaveProvider 的问题

问题描述

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

        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#.netaudiobuffernaudio

解决方案


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 生成静音

来自谷歌翻译的英语


推荐阅读