You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用NAudio WasapiLoopbackCapture录制时静音仍有字节数问题咨询

WasapiLoopbackCapture静音时仍有BytesRecorded的原因分析

我之前也碰到过类似的问题,其实这是由几个常见的音频系统或NAudio的工作特性导致的,具体来说:

  • WASAPI音频帧的传输机制:WASAPI回环捕获是基于音频设备的输出帧来运作的——哪怕扬声器被静音,大多数音频设备并不会停止输出数据,而是持续发送全0值的音频帧。这时候BytesRecorded对应的是这个固定大小的帧的字节数,并不是说有实际的声音信号。你可以检查捕获到的字节数组,大概率里面全是0。
  • 设备或系统的残留信号:部分音频硬件在静音状态下可能会有极微弱的底噪,或者系统音频栈中存在一些残留的静默数据,这些都会被捕获到,导致BytesRecorded不为0,但实际播放时听不到任何声音。
  • NAudio的事件触发逻辑WasapiLoopbackCaptureDataAvailable事件只要设备有数据缓冲区传递过来就会触发,不管缓冲区里的内容是不是静音。这里的BytesRecorded指的是缓冲区的有效字节数,而非“包含有效声音的字节数”——哪怕全是0值,只要缓冲区有数据,这个数值就会等于缓冲区的大小。

如果你想验证是不是静音帧,可以在DataAvailable事件里加一段检查逻辑:

private void OnDataAvailable(object sender, WaveInEventArgs e)
{
    // 判断当前捕获的帧是否为静音帧
    bool isSilentFrame = true;
    foreach (byte b in e.Buffer.AsSpan(0, e.BytesRecorded))
    {
        if (b != 0)
        {
            isSilentFrame = false;
            break;
        }
    }

    if (isSilentFrame)
    {
        Console.WriteLine("捕获到静音帧,字节数:" + e.BytesRecorded);
    }
    // 写入文件(如果不需要保存静音帧,可以在这里跳过写入)
    _writer.Write(e.Buffer, 0, e.BytesRecorded);
}

内容的提问来源于stack exchange,提问作者VIRIYALA NARESH

火山引擎 最新活动