FFmpeg6 在 Windows 打开麦克风并录成 PCM:不走 Qt Multimedia,也不碰 WASAPI

目录

[一、Windows 下 FFmpeg 抓音频的唯一正解:dshow](#一、Windows 下 FFmpeg 抓音频的唯一正解:dshow)

[二、先确认你的 FFmpeg 能行](#二、先确认你的 FFmpeg 能行)

三、最简命令行版

[四、C/C++(FFmpeg 6 API)最小录音流程](#四、C/C++(FFmpeg 6 API)最小录音流程)

核心思路

[五、完整可编译示例代码(Windows / FFmpeg 6)](#五、完整可编译示例代码(Windows / FFmpeg 6))

[六、PCM 参数是谁决定的?](#六、PCM 参数是谁决定的?)

[七、为什么不用 swr_convert?](#七、为什么不用 swr_convert?)

[八、常见坑(Windows + FFmpeg 专属)](#八、常见坑(Windows + FFmpeg 专属))

中文设备名乱码

打开成功但没数据

录出来全是杂音

九、进阶路线(你迟早会问)

十、总结


在 Windows 系统中使用 FFmpeg 录制麦克风并将其输出为 PCM(脉冲码调制)格式,你可以按照以下步骤操作。首先,确保你已经安装了 FFmpeg。如果没有安装,可以从 FFmpeg官网 下载适用于 Windows 的版本并安装。

很多人以为 FFmpeg 只能解封装、播视频,其实它原生就能抓 Windows 麦克风 ------而且不依赖 Qt Multimedia、不碰 Win32 Audio API,一条 dshow设备链就能干活。

今天这篇,目标是:

FFmpeg 6

Windows

打开默认麦克风

录 N 秒

直接写 裸 PCM(16bit / 44.1kHz / 双声道)

不整花活,能拷就能跑。


一、Windows 下 FFmpeg 抓音频的唯一正解:dshow

FFmpeg 在 Windows 支持三种音频输入:

方式 现状
dshow 主流、稳定
wasapi 更底层,采样率诡异
wavein 老古董

麦克风录音 = DirectShow = dshow


二、先确认你的 FFmpeg 能行

复制代码
ffmpeg -hide_banner -devices

看到 D后有 dshow,说明 libavdevice 编进去了:

复制代码
Devices:
 D. = Demuxer
 ---
 D  dshow           DirectShow input device

再看看有哪些麦克风:

复制代码
ffmpeg -list_devices true -f dshow -i dummy

输出里找:

复制代码
[dshow @ xxx] "麦克风阵列 (适用于数字麦克风的英特尔® 智音技术)" (audio)

名字要原样复制,中文也没事,但要引号包住。


三、最简命令行版

复制代码
ffmpeg -f dshow -i audio="Microphone (Realtek Audio)" ^
-t 5 ^
-f s16le -ar 44100 -ac 2 ^
out.pcm

用 Audacity 打开 PCM:

  • Signed 16-bit PCM

  • Little Endian

  • 44100 Hz

  • Stereo

能听 → 代码一定行


四、C/C++(FFmpeg 6 API)最小录音流程

核心思路

复制代码
av_find_input_format("dshow")
↓
avformat_open_input(audio=...)
↓
av_read_frame → AVPacket
↓
直接写 packet.data(PCM)

dshow 默认输出就是 交错 PCM packet,不用 filter 也能直接落盘。


五、完整可编译示例代码(Windows / FFmpeg 6)

复制代码
extern "C" {
#include <libavdevice/avdevice.h>
#include <libavformat/avformat.h>
}

int main()
{
    AVFormatContext* fmt_ctx = nullptr;
    AVInputFormat* ifmt = av_find_input_format("dshow");

    const char* dev_name = "audio=Microphone (Realtek Audio)";

    if (avformat_open_input(&fmt_ctx, dev_name, ifmt, nullptr) < 0) {
        printf("open mic failed\n");
        return -1;
    }

    FILE* fp = fopen("mic.pcm", "wb");

    AVPacket pkt;
    int count = 0;
    while (av_read_frame(fmt_ctx, &pkt) >= 0 && count < 220) { // ~5s @44k
        fwrite(pkt.data, 1, pkt.size, fp);
        av_packet_unref(&pkt);
        count++;
    }

    fclose(fp);
    avformat_close_input(&fmt_ctx);
    return 0;
}

六、PCM 参数是谁决定的?

dshow 默认给你:

参数 值
sample_fmt s16
rate 44100
ch 2
layout stereo
packing interleaved

packet.data 就是裸 PCM

如果你想改:

复制代码
AVDictionary* opts = nullptr;
av_dict_set(&opts, "sample_rate", "48000", 0);
av_dict_set(&opts, "channels", "1", 0);
avformat_open_input(&fmt_ctx, dev_name, ifmt, &opts);

有些声卡 只认特定组合,失败就回退默认。


七、为什么不用 swr_convert?

你现在是:

复制代码
麦克风 → dshow → PCM packet → 文件

链路里:

  • 无 resample

  • 无 latency

  • CPU ≈ 0

只有两种理由碰 swresample:

  1. 要 float / s32

  2. 重采样成 AAC / OPUS

否则:裸写文件就行


八、常见坑(Windows + FFmpeg 专属)

中文设备名乱码

UTF-8 源码 + MSVC / mingw-w64 都能过

用 audio="...",别手敲空格


打开成功但没数据

  • 麦克风被独占(Teams / Chrome)

  • 隐私设置没开"允许桌面应用访问麦克风"


录出来全是杂音

  • Audacity 声道数选错

  • 用 s32le打开 s16le


九、进阶路线

需求 下一步
边录边播 abuffer → aformat → sink
存 WAV 写 44-byte header
实时推流 encode opus → RTP
Qt UI QThread + av_read_frame
低延迟 wasapi+ exclusive

十、总结

FFmpeg 6 + Windows 麦克风 = libavdevice + dshow + avformat_open_input + av_read_frame,PCM 直接落盘;不折腾 WASAPI、不碰 WinMM,5 分钟就能录到能用的音频。

相关推荐
ITHAOGE151 小时前
下载 | Win10 2021纯净精简版,预装应用极少!(9月更新、Win10 IoT LTSC 2021版、适合老电脑)
windows·科技·物联网·微软·电脑
youdexiang1 小时前
iOS版本语音转文字工具:音频识别原理
音视频
Vex2une5 小时前
Windows 任务管理器发展史:从 80KB 救急工具到系统级监控平台
windows·进程管理·性能监控·任务管理器·winui·cpu使用率·taskmgr
Vex2une6 小时前
Windows 12 新功能展望:AI 深度融合、全新界面与下一代生产力体验
人工智能·windows·copilot·winui·新功能·ai pc
LRL_7 小时前
【实战指南】Node.js 跨平台依赖下载:如何在 Windows/Linux 环境下互跨下载目标系统的 npm/pnpm 包
linux·windows·node.js
实心儿儿7 小时前
Qt — 音视频文件
qt·音视频
言乐68 小时前
Python文字审核模型
开发语言·windows·python·django·pygame
勤劳X码农8 小时前
2026年电商视频AI配音软件怎么选?
人工智能·音视频
可乐鸡翅yeah_9 小时前
fmp4 碎片 MP4 格式 HLS 流,和传统 TS 分片有什么不一样
开发语言·javascript·ios·音视频·safari·m3u8·m3u8在线播放
释厄6239 小时前
01AB 基本元理——任何智能体的三元法理·0=1→0≠1法理跃迁为天理
人工智能·windows·算法·microsoft·机器学习