NAudio Asio 录制和播放

Posted

技术标签:

【中文标题】NAudio Asio 录制和播放【英文标题】:NAudio Asio Record and Playback 【发布时间】:2014-05-17 20:05:17 【问题描述】:

我正在尝试编写自己的 VST 主机,为此我需要录制和播放来自 Asio 驱动程序的音频(在我的情况下是音频接口)。这就是我尝试使用 NAudio 的 AsioOut 的原因。

出于测试目的,我目前只是尝试记录输入,复制并播放到输出。

我的代码如下所示:

var asioout = new AsioOut();
BufferedWaveProvider wavprov = new BufferedWaveProvider(new WaveFormat(44100, 2));
asioout.AudioAvailable += new EventHandler<AsioAudioAvailableEventArgs>(asio_DataAvailable);
asioout.InitRecordAndPlayback(wavprov, 2, 25);
asioout.Play();

...

void asio_DataAvailable(object sender, AsioAudioAvailableEventArgs e)

    Array.Copy(e.InputBuffers, e.OutputBuffers, e.InputBuffers.Length);
    e.WrittenToOutputBuffers = true;

这样我就听不到任何输出了。我也试过这样:

void asio_DataAvailable(object sender, AsioAudioAvailableEventArgs e)

    byte[] buf = new byte[e.SamplesPerBuffer];
    for (int i = 0; i < e.InputBuffers.Length; i++)
    
        //Marshal.Copy(e.InputBuffers[i], e.OutputBuffers, 0, e.InputBuffers.Length);
        //also tried to upper one but this way i also couldn't hear anything
        Marshal.Copy(e.InputBuffers[i], buf, 0, e.SamplesPerBuffer);
        Marshal.Copy(buf, 0, e.OutputBuffers[i], e.SamplesPerBuffer);
    
    e.WrittenToOutputBuffers = true;

这样我可以听到输入音量中的声音,但声音非常失真。

我在这里做错了什么?

PS:我知道how to record and playback.... 存在,但我无法从这个帖子中得到完整的答案,只是想用 Marshall.Copy 尝试一下......

【问题讨论】:

【参考方案1】:

您的第二次尝试比第一次更正确:必须单独复制每个输入缓冲区。然而,复制方法的最后一个参数应该是字节数,而不是缓冲区中的样本数。这通常是每个样本 3 或 4 个字节,具体取决于您的 ASIO 位深度。

【讨论】:

非常感谢您的回答。使用 e.SamplesPerBuffer*4 而不仅仅是样本量解决了这个问题。 一个小的后续问题:咬数组中的字节是什么格式的。我知道 WaveIn 的一次是 16 位单声道,所以它是:AABBCCDDEEFF 定位在数组内,但 asioout 似乎有点不同...... ASIO 支持多种不同的采样模式,并且字节可以以几种不同的方式打包(例如 4 字节中的 24 位、大端、小端等),您需要找出您的驱动程序是哪一种使用。 所以我仍然有如何使用这个字节数组的问题。它们似乎是小端模式,例如:0(某个数字)(250 到 253 之间的某个数字)255 使用 WaveIn 我得到 16 位数据。因此,我将两个字节对转换为 Int16 并通过 Int16.MaxValue 将它们划分为从-1 到 1 的浮点数(然后我将其泵入 VST 插件)。有了输出,我反其道而行之。现在我遇到的问题是 Int16 的值太高了,它想要 byte[2] 而不是 4。而 Int32 对它来说太大了。这可能是24位吗? 是的,ASIO 有多种可能的音频位表示。事件 args 中有一个枚举,它会告诉你正在使用什么

以上是关于NAudio Asio 录制和播放的主要内容,如果未能解决你的问题,请参考以下文章

NAudio Asio 录制播放和保存(仅限噪音)

Naudio Asio 在多个通道上同时录制和播放

NAudio:使用 ASIO 录制音频并用吉他输出

使用 NAudio 录制和播放音频

C# NAudio:录制的文件无法播放

无法播放用 naudio 录制的音频流