之前的文章《测试.net开源音频库NAudio》中介绍了基于NAudio模块中的WaveInEvent和WaveFileWriter类实现基本的录音功能,但存在一个问题:本来想录制视频中的声音,但录音过程中会把麦克风中的杂音(挪动物品的声音、说话声音等)一并录进去。
NAudio模块中提供有WasapiLoopbackCapture类,能够获取特定输出设备的音频播放数据,再配合WaveFileWriter类即可避免出现杂音。使用比较简单,根据参考文献1中的介绍,直接将录音程序中的WaveInEvent类替换为WasapiLoopbackCapture类,不需要做其它改动,实际测试过程中也确实如此,采用WasapiLoopbackCapture类录制的网页中的视频播放声音,就算是在电脑的麦克风前大声说话或者播放手机声音,都不会被录进去。
WasapiLoopbackCapture类继承自WasapiCapture类,使用默认构造函数时获取的是默认的音频播放设备(默认应该为获取声卡数据),也可以调用MMDeviceEnumerator可举当前电脑中的所有音频设备,然后用MMDevice类对象实例作为输入参数传入WasapiLoopbackCapture类的构造函数,以录制指定设备的声音。
为了凑一下篇幅,再把使用的WasapiLoopbackCapture发一下:
private WaveFileWriter m_waveFileWriter;
private WasapiLoopbackCapture m_capture = new WasapiLoopbackCapture();
private void btnStartRecord_Click(object sender, EventArgs e)
{
m_waveFileWriter = new WaveFileWriter(Path.Combine(txtOutputDir.Text, String.Format("{0}.wav", txtOutputFileName.Text)), m_capture.WaveFormat);
m_capture.DataAvailable += (s, a) =>
{
m_waveFileWriter.Write(a.Buffer, 0, a.BytesRecorded);
};
m_capture.StartRecording();
}
private void btnEndRecord_Click(object sender, EventArgs e)
{
m_capture.StopRecording();
m_waveFileWriter.Dispose();
m_capture.Dispose();
}
参考文献:
[1]https://github.com/naudio/NAudio/blob/master/Docs/WasapiLoopbackCapture.md
[2]https://github.com/naudio/NAudio
[3]https://baike.baidu.com/item/WASAPI/8114771?fr=ge_ala