【问题标题】:Continuous record and play audio in C# visual studio在 C# Visual Studio 中连续录制和播放音频
【发布时间】:2012-10-31 15:13:53
【问题描述】:

我一直在尝试在不使用临时 wav 文件的情况下同时录制和播放音频。后来我想创建一个VOIP聊天程序。

我使用 Naudio 库在 C# 中捕获和播放音频,它似乎工作得很好。 下面是我写的c#代码:

using System.IO.Ports;
using NAudio.Wave;
using System.IO;

namespace VOIP
{
    public partial class Form1 : Form
    {
        WaveIn wab = new WaveIn();    
        MemoryStream s;        
        int k;


        public Form1()
        {
            InitializeComponent();
            wab.BufferMilliseconds = 100;
            wab.NumberOfBuffers=5;
            wab.DataAvailable += new EventHandler<WaveInEventArgs>(wa_DataAvailable);           
        }

        void wa_DataAvailable(object sender, WaveInEventArgs e)
        {                 

            Play(e.Buffer);         

        }

        private void Play(byte[] p)
        {
            WaveOut ou = new WaveOut();
            s = new MemoryStream(p);
            RawSourceWaveStream r = new RawSourceWaveStream(s, wab.WaveFormat);
            ou.Init(r);
            ou.Play();
            ou.Stop();
            ou.Dispose();
            s.Dispose();
            r.Dispose();

        }

        private void Form1_Load(object sender, EventArgs e)
        {


        }

        private void button1_Click(object sender, EventArgs e)
        {
           if (button1.Text == "Stop")
            {
                wab.StopRecording();
                button1.Text = "Record";
            }
           else if (button1.Text == "Record")
            {
                wab.StartRecording();
                button1.Text = "Stop";
            }            
        }


    }
}

问题出在“播放”方法上。由于每次数据可用时都会创建和处理 waveout 对象:我可以听到一些点击声。有没有办法避免这种创建和处置对象的方式,而是只创建一个对象,然后用新数据进行初始化。我还观察到这个程序消耗的内存不断增加。

提前致谢。 萨纳坦

【问题讨论】:

  • 我不完全理解你在做什么,我也没有使用过 NAudio。但咔哒声表示频率非常高,通常以非零值开始或停止播放。也许类似的事情会导致您的情况下发出咔哒声?也许可以在音频流中添加某种淡入/淡出?也许您可以尝试播放您知道从零开始和停止“很好”的音频样本,它可能会让您更接近了解点击的来源
  • 我更关心你如何发送数据?是缓冲还是流式传输?

标签: c# audio voip naudio


【解决方案1】:

使用 BufferedWaveProvider,当音频到达时,将其解压缩并添加到 BufferedWaveProvider。然后从 BufferedWaveProvider 持续播放一个 WaveOut 实例。

NAudioDemo 的源代码在聊天示例中展示了如何执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多