【发布时间】:2014-04-24 18:13:34
【问题描述】:
我正在尝试获取声音输入并直接发送输出,使用 C# 可能会减少延迟。
我正在使用支持 ASIO 的库 NAudio 以获得更好的延迟。
特别是,我使用 AsioOut 对象进行录制,另一个用于播放,并使用 BufferedWaveProvider 进行初始化,该对象填充了一个回调函数:OnAudioAvailable,它允许我使用 ASIO 缓冲区。
问题是我听到的声音有各种毛刺和有点延迟。我认为问题出在函数 OnAudioAvailable 中,其中缓冲区填充了从声卡输入的数据。
声明:
NAudio.Wave.AsioOut playAsio;
NAudio.Wave.AsioOut recAsio;
NAudio.Wave.BufferedWaveProvider buffer;
播放过程:
if (sourceList.SelectedItems.Count == 0) return;
int deviceNumber = sourceList.SelectedItems[0].Index;
recAsio = new NAudio.Wave.AsioOut(deviceNumber);
recAsio.InitRecordAndPlayback(null, 2, 44100); //rec channel = 1
NAudio.Wave.WaveFormat formato = new NAudio.Wave.WaveFormat();
buffer = new NAudio.Wave.BufferedWaveProvider(formato);
recAsio.AudioAvailable += new EventHandler<NAudio.Wave.AsioAudioAvailableEventArgs>(OnAudioAvailable);
//Collego l'output col buffer
playAsio = new NAudio.Wave.AsioOut(deviceNumber);
playAsio.Init(buffer);
//Registro
recAsio.Play();
//Playback
playAsio.Play();
OnAudioAvailable():
//Callback
private unsafe void OnAudioAvailable(object sender, NAudio.Wave.AsioAudioAvailableEventArgs e)
{
//Copio tutti gli elementi di InputBuffers in buf e li aggiungo in coda al buffer
byte[] buf = new byte[e.SamplesPerBuffer];
for (int i = 0; i < e.InputBuffers.Length; i++)
{
Marshal.Copy(e.InputBuffers[i], buf, 0, e.SamplesPerBuffer);
//Aggiungo in coda al buffer
buffer.AddSamples(buf, 0, buf.Length);
}
}
AsioAudioAvailableEventArgs 定义:
public AsioAudioAvailableEventArgs(IntPtr[] inputBuffers, int samplesPerBuffer, AsioSampleType asioSampleType);
public float[] GetAsInterleavedSamples();
有人知道怎么解决吗? 谢谢大家。
【问题讨论】:
标签: c# audio-recording playback naudio asio