chi*_*mar 5 c# audio naudio wasapi
以下是我录制来自演讲者的音频的示例代码.它工作正常.但是只有当某些音频从扬声器发出时才录制音频.如果没有音频则不记录.实际上我正在用系统的声音进行屏幕录制.由wasapiloop录制的音频长度与屏幕录制长度不匹配,因为wasapiloop仅在有来自扬声器的声音时才录制音频.
WasapiCapture waveLoop = new WasapiLoopbackCapture();
waveLoop.Initialize();
waveLoop.DataAvailable += waveLoop_DataAvailable;
waveLoop.Stopped += waveLoop_Stopped;
waveLoop.Start();
Run Code Online (Sandbox Code Playgroud)
我已经看到一个类似的堆栈流量问题,但我完全不理解它.
任何帮助是极大的赞赏.
根据设计,WASAPI 环回捕获仅在实际播放时产生数据 - 您已经弄清楚了这一点。如果您的目标是产生连续的数据流,您有责任为环回捕获生成的数据之间的间隙生成静音音频字节。环回捕获数据带有时间戳和不连续性标志,因此您可以应用简单的数学计算并确定要添加的零/静音字节数。
更新。检查了 NAudio 代码(尤其是此处)后,我发现事件中静默字节计算的精确数学存在问题DataAvailable:NAudio 忽略DataDiscontinuity也称为AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY环回捕获报告的标志。
当端点上有播放数据时,环回捕获将产生特定持续时间(例如10毫秒长)的音频数据包。这些数据包暴露给您通过WasapiLoopbackCapture接口读取。没有缓冲,只要您读取的数据是连续的,GetBuffer调用就不会引发DataDiscontinuity标志。也就是说,您的第一个数据包带有标志,然后直到您下次看到它为止,您将数据视为连续的。
当播放停止并且环回捕获停止产生数据时,没有来自 的新数据GetBuffer。但是,您知道数据包的大小/持续时间,并且在没有数据的情况下,您的计时器需要用静默字节替换此丢失的数据(使用静默数据包的相应大小来处理序列中部分填充的最后一个数据包也是一个好主意)。您将注入静默字节,直到GetBuffer调用成功并获得新的可用数据。您将DataDiscontinuity在那里有标志来指示新的数据序列。
从那时起,您应该停止沉默并再次使用读取捕获的数据。此外,由于您知道不涉及缓冲,因此最好使用不连续数据包来更新您的计时记录:当您拥有该数据包时,您可以假设其最后一个字节对应于GetBuffer成功时的时刻。从那里您可以导出用于填充组合流的完美连续性的静音字节数。
因此,我们的想法是DataDiscontinuity从 NAudio 获取标志,以便它不会丢失,添加一个计时器以及时生成静音字节,并将所有内容放在一起检查连续性,在计时器回调中添加静音字节并将所有内容组合到连续馈送中。
| 归档时间: |
|
| 查看次数: |
595 次 |
| 最近记录: |