WasapiLoopbackCapture.DataAvailable读取静默字节

时间:2018-04-04 14:44:37

标签: c# naudio

我试图通过编写可用的字节流,使用NAudio的WasapiLoopbackCapture将扬声器声音录制到波形文件中。 WasapiLoopbackCapture.DataAvailable BytesRecorded 将为0,没有声音。但是在我的情况下,即使说话者保持沉默,我也会在 BytesRecorded 中获得字节数。你能告诉我这里有什么不对吗?

class CallResponse
{
    private WaveFileWriter _writer;
    private WasapiLoopbackCapture _waveIn;
    private string _inFile;
    private string _inFileCompressed;
    private int _duration;
    public bool _isRecording;
    public bool _speechDetected;

    public CallResponse()
    {
        _inFile = @"C:\Naresh\test.wav";
        _inFileCompressed = @"C:\Naresh\test16Hz.wav";
        _waveIn = new WasapiLoopbackCapture();

        _waveIn.DataAvailable += (s, e) =>
        {

            Console.WriteLine(e.BytesRecorded);
            _writer.Write(e.Buffer, 0, e.BytesRecorded);
            if (_writer.Position > _waveIn.WaveFormat.AverageBytesPerSecond * _duration)
            {
                Console.Write("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bRecording stopped...");
                _waveIn.StopRecording();
            }
        };

        _waveIn.RecordingStopped += (s, e) =>
        {
            if (_writer != null)
            {
                _writer.Close();
                _writer.Dispose();
                _writer = null;
            }
            Console.Write("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bCompressing Audio...");
            using (var reader = new AudioFileReader(_inFile))
            {
                var resampler = new WdlResamplingSampleProvider(reader, 16000);
                WaveFileWriter.CreateWaveFile16(_inFileCompressed, resampler);
            }
            _isRecording = false;
        };
    }

    public void DisposeObjects()
    {

        if (_waveIn != null)
        {
            _waveIn.Dispose();
            _waveIn = null;
        }
    }

    public void StartRecording(int duration = 5)
    {
        _writer = new WaveFileWriter(_inFile, _waveIn.WaveFormat);
        this._duration = duration;
        _speechDetected = false;
        _isRecording = true;
        Console.WriteLine("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bRecording....");
        _waveIn.StartRecording();
    }
}

1 个答案:

答案 0 :(得分:1)

如果正在播放音频,那么WasapiLoopbackCapture将捕获该音频,即使它包含静音。因此,您获得非零BytesRecorded值并没有特别的错误或令人惊讶。事实上,如果没有应用程序向正在捕获的设备发送音频,那么通常会发生的事情是您根本没有获得任何DataAvailable回调。