如何自动识别PC音频输出录制可用设备并解决枚举失败问题
解决FFmpeg录制桌面内录音频的设备识别问题
核心问题
你要捕获的是PC输出音频(内录),但当前代码枚举的是「麦克风类输入捕获设备」——这类设备本来就无法捕获系统播放的声音。Windows默认不会把内录设备(如立体声混音)显示在常规捕获设备列表里,需要手动启用或借助虚拟设备。
具体解决方案
1. 启用系统自带的「立体声混音」设备
这是Windows原生的内录设备,默认隐藏,步骤如下:
- 右键任务栏音量图标 → 声音设置 → 更多声音设置 → 切换到「录制」标签页
- 右键空白区域 → 勾选「显示禁用的设备」和「显示已断开的设备」
- 找到「立体声混音」(或英文
Stereo Mix),右键选择「启用」 - 启用后,该设备会出现在音频捕获设备列表中,可直接用来录制系统输出声音
2. 修正设备枚举代码
用MMDeviceEnumerator筛选内录设备
修改枚举逻辑,直接筛选名称包含「立体声混音」的设备,或枚举所有设备查看类型:
public Form1() { InitializeComponent(); InitializeRecordingIndicator(); MMDeviceEnumerator enumerator = new MMDeviceEnumerator(); // 枚举所有音频设备(包含播放/捕获类型) foreach (MMDevice device in enumerator.EnumerateAudioEndPoints(DataFlow.All, DeviceState.All)) { using (StreamWriter w = new StreamWriter(@"d:\audiodev.txt", true)) { string deviceInfo = $"名称: {device.FriendlyName}, 类型: {device.DataFlow}, 状态: {device.State}"; cmbAudioDevices.Items.Add(deviceInfo); w.WriteLine(deviceInfo); } } }
从输出的audiodev.txt中,找到类型为Capture且名称含「立体声混音」的设备即可。
用FFmpeg正确枚举内录设备
替换原命令为wasapi协议(更适配Windows音频设备),避免dshow的兼容性问题:
public static class FFmpegHelper { public static string[] GetAudioCaptureDevices() { string ffmpegPath = @"C:\path\to\ffmpeg.exe"; Process process = new Process(); // 使用wasapi枚举所有音频设备 process.StartInfo.Arguments = "-list_devices true -f wasapi -i dummy"; process.StartInfo.FileName = ffmpegPath; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardError = true; process.StartInfo.CreateNoWindow = true; process.Start(); // 先读取输出再等待退出,防止死锁 string output = process.StandardError.ReadToEnd(); process.WaitForExit(); string[] lines = output.Split('\n'); // 筛选有效音频设备,排除dummy占位符 var devices = lines.Where(line => line.Contains("audio") && !line.Contains("dummy")) .Select(line => line.Trim()) .ToArray(); return devices; } }
运行后会输出类似内容,其中「立体声混音」就是目标设备:
[wasapi @ 0000022a7f8f0fc0] WASAPI audio devices [wasapi @ 0000022a7f8f0fc0] "立体声混音 (Realtek Audio)" [wasapi @ 0000022a7f8f0fc0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{8E7B96A8-5225-4F10-90E6-5A455AB7E6DA}"
3. FFmpeg录制桌面+内录音频的最终命令
找到目标设备后,用以下命令完成录制(以「立体声混音」为例):
ffmpeg -f gdigrab -framerate 30 -i desktop -f dshow -i audio="立体声混音 (Realtek Audio)" -c:v libx264 -crf 23 -c:a aac -b:a 192k output.mp4
如果用wasapi协议,命令改为:
ffmpeg -f gdigrab -framerate 30 -i desktop -f wasapi -i audio="立体声混音 (Realtek Audio)" -c:v libx264 -crf 23 -c:a aac -b:a 192k output.mp4
4. 若声卡不支持立体声混音:安装虚拟音频设备
如果你的硬件声卡没有立体声混音选项,可安装VB-Cable虚拟音频设备:
- 安装后会生成「CABLE Output」和「CABLE Input」两个设备
- 将系统音频输出设置为「CABLE Output」,再用FFmpeg捕获「CABLE Input」的音频即可实现内录
- 如需同时监听声音,可在VB-Cable设置中开启监听功能
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

