c#/.NET - 录制当前正在播放的音频

Posted

技术标签:

【中文标题】c#/.NET - 录制当前正在播放的音频【英文标题】:c#/.NET - Recording the current audio being played 【发布时间】:2017-07-27 14:52:39 【问题描述】:

c#/.net 中有没有办法记录当前正在播放的音频?我在互联网上搜索了很多,但我能找到的唯一结果是使用麦克风录音。

我不想使用麦克风输入进行录制,我想在单击录制按钮时录制计算机上正在播放的内容。

谢谢

【问题讨论】:

【参考方案1】:

你有两个选择:

    硬件环回设备 - 虚拟“立体声混音”音频设备,充当常规音频捕获设备,同时生成通过系统默认音频输出设备播放的混合音频馈送的副本。由于此类设备显示为真正的音频输入设备,因此您可以使用标准 API、库甚至现有应用程序从此类设备进行录制。

    以编程方式访问虚拟环回设备,就像它是类似麦克风的设备一样。后台的 API 将复制播放的音频内容,并使其在播放时可供回读。好消息是您可以访问您感兴趣的设备的混合音频源。

这两个选项在 MSDN 上的 Loopback Recording 文章中进行了详细描述,并可通过标准音频 API,特别是 WASAPI 获得。

对于 C# 开发,您可能会使用 NAudio 之类的包装器。

对于选项 1,您会在 *** 上找到很多问题,对于另一个选项,关键字是 AUDCLNT_STREAMFLAGS_LOOPBACK

【讨论】:

太好了,谢谢!我会有一场戏,让你知道我的进展如何。【参考方案2】:

能够从另一个应用程序接收数据的唯一方法是开发者提供一个访问点,通常是通过一些 SDK、API 或其他方式。没有这个,您的应用程序代码就无法从其他应用程序接收字节。

麦克风工作的原因是因为它从应用程序接收声音输出字节并将这些声波字节发送回您的 PC 以呈现和输出声音。由于您可以从麦克风访问这些字节,因此您可以捕获声音。

查看您尝试从中获取声音的应用程序的开发人员是否提供 API 或 SDK。

【讨论】:

OP 是在谈论 audio 而不是 "data"。录制音频不需要直接访问源应用程序 @MickyD 所有电子信号,无论音频是否为数据。它是通过电流传递的比特流。所以我相信我将音频流称为数据的术语是有效的。 它太通用了,没用,更不用说错过了明显的解决方案,而不需要应用程序的直接 API

以上是关于c#/.NET - 录制当前正在播放的音频的主要内容,如果未能解决你的问题,请参考以下文章

用于播放/录制音频(.wav、.ogg)的 C++ 多平台库

带有原始音频记录和播放示例的跨平台 C/C++ 库

在不同的计算机上同步播放和录制

来自麦克风的实时音频播放。 C#

播放流后音频队列无法录制音频

如何延迟音频播放以与 FFT 同步