如何捕捉正在播放的音频?
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】:您必须启用设备立体声混音。如果你这样做,直接声音找到这个设备。
【讨论】:
以上是关于如何捕捉正在播放的音频?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 linux USB 捕获设备与 ffmpeg 同时捕获音频和视频