You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动识别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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:28:09