如何捕捉正在播放的音频?

Posted

技术标签:

【中文标题】如何捕捉正在播放的音频?【英文标题】:How do I capture the audio that is being played? 【发布时间】:2010-09-17 17:02:56 【问题描述】:

有谁知道如何以编程方式捕捉正在播放的声音(即来自声卡的所有声音,而不是麦克风等输入设备)。

【问题讨论】:

【参考方案1】:

假设您在谈论 Windows,基本上有三种方法可以做到这一点。

首先是打开音频设备的主输出作为录音源。这只有在驱动程序支持时才有可能,尽管现在大多数都这样做。虚拟设备的通用名称是“你所听到的”或“Wave Out”。您将需要使用合适的 API(请参阅 MSDN 中的 WaveIn 或 DirectSound)来进行捕获。

第二种方法是编写一个过滤器驱动程序,可以在音频流到达物理设备之前对其进行拦截。同样,此技术仅适用于具有合适驱动程序拓扑的设备,而且它肯定不适合胆小的人。

这意味着这些选项都不能保证在具有任意硬件的 PC 上工作。

最后一种选择是使用虚拟音频设备,例如Virtual Audio Cable。如果在 Windows 中将此设备设置为默认播放设备,则所有运行良好的应用程序都将通过它播放。然后,您可以从同一设备记录以捕获总和输出。只要您可以控制要录制的应用程序使用的设备,那么此选项将始终有效。

所有这些技术都有其优点和缺点 - 由您决定哪种技术最适合您的需求。

【讨论】:

这些方法是否可以保证在任何 Vista 或更高版本的 PC 上运行,因为它带有重新设计的音频子系统?还是我们仍然处于这种“可能对某些人有效但对其他人无效”的情况? 您能否给出 WaveIn 方法的示例代码。我使用了waveInGetDevCaps,但它只给了我麦克风。是否可以使用来自waveOutGetDevCaps 的设备使用waveInXXX 功能进行录制?【参考方案2】:

您可以使用 Waveform 音频接口,有一个 MSDN article 说明如何通过 PInvoke 访问它。

为了捕捉正在播放的声音,您只需要打开播放设备而不是麦克风。开放输入,当然,不输出;-)

【讨论】:

【参考方案3】:

如果您使用的是 OSX,Audio Hijack Pro from Rogue Amoeba 可能是最简单的方法。

无论如何,为什么不直接将音频循环回线路并录制呢?这是一个非常简单的解决方案。只需将电缆插入音频输出插孔和线路插孔,然后开始录音。

【讨论】:

这很简单,但由于明显的原因它非常糟糕(以防它不明显:这需要一个数字信号,将其转换为模拟然后返回,而不是直接以数字记录它) .【参考方案4】:

您必须启用设备立体声混音。如果你这样做,直接声音找到这个设备。

【讨论】:

以上是关于如何捕捉正在播放的音频?的主要内容,如果未能解决你的问题,请参考以下文章

我将如何以编程方式捕获内部音频?

使用 C 播放音频文件

如何从 linux USB 捕获设备与 ffmpeg 同时捕获音频和视频

Python在python / linux中拦截/读取音频输出级别

[C#] 使用 NAudio 实现音频可视化

捕捉当前正在播放的声音