【发布时间】:2013-02-27 00:08:36
【问题描述】:
我只想听听我使用 NAudio 对麦克风说的话,这是我目前的代码,但问题是我什么都听不到。任何帮助将不胜感激。
public partial class frmMain : Form
{
private WaveIn waveIn; // Gets an audio from microphone
private WaveOut waveOut; // Sends audio to speaker
private BufferedWaveProvider waveProvider; // Gets an audio from stream
public frmMain()
{
InitializeComponent();
}
private void frmMain_Load(object sender, EventArgs e)
{
waveOut = new WaveOut();
waveIn = new WaveIn();
waveProvider = new BufferedWaveProvider(waveIn.WaveFormat);
waveOut.Init(waveProvider);
waveIn.DataAvailable += waveIn_DataAvailable;
waveOut.Play();
}
private void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
waveProvider.Read(e.Buffer, 0, e.BytesRecorded);
}
private void btnStop_Click(object sender, EventArgs e)
{
waveIn.StopRecording();
waveIn.Dispose();
}
private void btnStart_Click(object sender, EventArgs e)
{
waveIn.StartRecording();
}
}
我将在网络编程中使用这种场景,在该场景中,我将数据从麦克风发送到套接字,然后在客户端,BufferedWaveProvider 将读取数据,然后将其发送到扬声器。如果有更好的方法,请发表评论。
TIA
【问题讨论】:
-
您正在从 DataAvailable 事件中的错误流中读取数据。然后你什么也不用做。
-
您的
waveIn_DataAvailable方法正在尝试从waveProvider读取而不是写入。将waveProvider.Read更改为waveProvider.AddSamples,看看是否有帮助。此外,您对waveIn对象的初始化似乎并不完整……您还没有调用waveIn.StartRecording。 -
我在 btnStart_Click 事件上进行 StartRecording
-
延迟是 NAudio 的
WaveIn和WaveOut类访问设备和数据的方式所固有的。 NAudio 并不是真正为低延迟而设计的,但您可以通过将waveIn.BufferedMilliseconds设置为较低的值(例如10)和waveOut.DesiredLatency设置为100 左右来减少它。如果您在DesiredLatency上的设置太低,它会开始对您产生影响,所以请在此设置上放轻松。 -
@VincentDagpin NAudio 显然有一些压缩类可以使用 ACM 编解码器。我从来没有和他们一起玩过,但他们可能会给你一个合理的起点。 ACM 编解码器通常不能很好地处理低延迟的东西,因此请四处寻找一个好的音频压缩库,例如 github.com/JohnACarruthers/Opus.NET
标签: c# sockets network-programming naudio