FFmpeg + DirectShow:Windows 采集音视频的“深水区说明书”
目录先给一张“世界观表”dshow 在 FFmpeg 里的真实链路第一步永远先从 list 开始别靠猜第二步看设备“到底支持什么格式”一个“能打”的音视频同时采集命令为什么这样写才是“懂 dshow”的人摄像头 独立声卡推荐写法dshow 最反直觉的 5 件事血泪版1️. dshow 不支持“软改分辨率”2️. 延迟不是 FFmpeg 的锅是 BufferTime3️. 音频采样率 ≠ 设备真实 clock4️. 虚拟摄像头基本都残5️. 摄像头被占用 ≠ 报错而是 RUN 不起来C 代码视角dshow 到底给你什么调试 dshow 的“作弊键”看 SampleGrabber 实际进了啥用 GraphEdit / GraphStudioNext 对照什么时候不该用 dshow总结觉得有用就请您帮忙点赞转发收藏吧您的鼓励是我创作的动力多谢看官。由于能力水平有限文中的错误或不严谨的地方在所难免还请批评指正。FFmpeg 与 DirectShow 在 Windows 平台上主要通过两种方式进行交互一是利用 FFmpeg 的dshow输入格式直接调用 DirectShow 接口采集音视频设备数据二是使用基于 FFmpeg 核心库开发的 ‌LAV Filters‌ 组件作为 DirectShow 过滤器来提升媒体播放和解码能力。很多人第一次用 FFmpeg 采摄像头都是这一句ffmpeg -f dshow -i videoIntegrated Camera out.mp4然后黑屏报Could not run filter graph帧率低得像 PPT麦克风有声、摄像头没图于是你得到一个错误印象dshow 是 FFmpeg 的玩具模块事实正好相反FFmpeg 的 dshow 是 libavdevice 里最“Win32 味儿”的一个设备后端​它不是 wrapper它是CoCreateInstance → FilterGraph → SampleGrabber 的手写封装这篇不教你怎么敲命令教你dshow 在 Windows 下到底在摸什么。先给一张“世界观表”你以为实际-f dshow是 FFmpeg 专用协议❌ DirectShow Filter Graphvideo后面是设备名✅ FriendlyNameFFmpeg 直接读驱动❌ 走系统注册表 CLSID分辨率随便写❌ 只认 Pin 的 MediaType采集卡 免驱❌ 没 AM_MEDIA_TYPE 就跪dshow 在 FFmpeg 里的真实链路avdevice_register_all() ↓ dshow_read_header() ↓ CoCreateInstance(CLSID_FilterGraph) ↓ FindCaptureDevice(FriendlyName) ↓ BindFilter → AddFilter ↓ SampleGrabber (视频) / Audio Capture Source ↓ IMediaControl::Run() ↓ Callback → AVPacketFFmpeg 根本没有“驱动层代码”​它只是把 DS 回调里来的 Sample 打成AVPacket.data第一步永远先从 list 开始别靠猜ffmpeg -list_devices true -f dshow -i dummy输出长这样DirectShow video devices: [0] HD Pro Webcam C920 [1] OBS Virtual Camera DirectShow audio devices: [0] Microphone (Realtek Audio) [1] C920 Microphone坑点中文名有空格 →一定要引号OBS Cam 是虚拟 Filter不支持某些 MEDIASUBTYPE第二步看设备“到底支持什么格式”90% 的黑屏是因为Pin 不接受 MJPEG / RGB24ffmpeg -f dshow -list_options true ^ -video_device_number 0 ^ -i videoHD Pro Webcam C920你会看到pin Capture subtype: {MJPG} 1280x720 30.00 fps subtype: {YUY2} 640x480 30.00 fps结论UVC 摄像头 → 优先 MJPGUSB2.0 硬扛 YUY2 → 必卡一个“能打”的音视频同时采集命令ffmpeg -f dshow ^ -video_size 1280x720 ^ -framerate 30 ^ -pixel_format mjpeg ^ -i videoHD Pro Webcam C920:audioMicrophone (Realtek Audio) ^ -c:v libx264 -preset ultrafast -g 30 ^ -c:a aac ^ -y out.mp4为什么这样写才是“懂 dshow”的人参数意义pixel_format mjpeg绕开 USB 带宽墙video_size framerate直接命中 Pin MediaType:audio拼同一个 graph少一个时钟源ultrafast采集不做慢编码摄像头 独立声卡推荐写法不要迷信 audiovideo 一个 dshowffmpeg -y ^ -f dshow -video_size 1280x720 -framerate 30 -pixel_format mjpeg ^ -i videoC920 ^ -f dshow -sample_rate 48000 -channels 2 ^ -i audioRME Babyface ^ -map 0:v -map 1:a ^ -c:v libx264 -c:a aac out.mkv好处两个 graph 不打架音频延迟可控录屏软件通用方案dshow 最反直觉的 5 件事血泪版1️. dshow 不支持“软改分辨率”-video_size 1920x1080 # 摄像头没 Pin → 直接 failFFmpeg 不会 scale只会拒绝。2️. 延迟不是 FFmpeg 的锅是 BufferTime-rtbufsize 1Mdshow 默认 buffer 很大推流时必加-f dshow -rtbufsize 50M -i videoxxx采集 OK推流越小越好10~30M3️. 音频采样率 ≠ 设备真实 clockWindows 混音器 44.1kFilter 实际 48k→ FFmpeg 报resample glitch强制一致-sample_rate 44100 -channel_layout stereo4️. 虚拟摄像头基本都残虚拟源dshow 兼容性OBS Cam✅ MJPG 不行ManyCam⚠️ 只出 RGB24Unity Capture❌NVIDIA Broadcast✅ 但独占5️. 摄像头被占用 ≠ 报错而是 RUN 不起来DirectShow 返回VFW_E_NOT_RUNNINGFFmpeg 只给你一句Could not run filter graph关 Zoom / Teams / Edge 再试C 代码视角dshow 到底给你什么AVFormatContext* fmt avformat_alloc_context(); AVDictionary* opts NULL; av_dict_set(opts, video_size, 1280x720, 0); av_dict_set(opts, framerate, 30, 0); av_dict_set(opts, pixel_format, mjpeg, 0); avformat_open_input(fmt, videoHD Pro Webcam C920, av_find_input_format(dshow), opts);FFmpeg 内部干了这些事你看不到ICreateDevEnumIMoniker::BindToObjectIGraphBuilder::ConnectSampleGrabberCB::SampleCBmemcpy→AVPacket所以dshow 是 FFmpeg 里极少数“COM 感”很重的模块调试 dshow 的“作弊键”看 SampleGrabber 实际进了啥ffmpeg -debug dshow -f dshow -i videoxxx用 GraphEdit / GraphStudioNext 对照FFmpeg 打不开 → GraphStudio 也打不开GraphStudio 能跑 → FFmpeg 缺 subtype什么时候不该用 dshow场景建议游戏录制❌ Desktop Duplication多路同采❌ Media Foundation超低延迟推流❌ 专用 SDKUSB 采集卡 4K⚠️ MJPG 赌命工业相机❌ GenICam✅dshow 的最佳定位“快速接入消费级摄像头 麦克风”总结FFmpeg libavdevice 在 Windows 上的音视频采集后端本质COM / DirectShow FilterGraph 的薄封装数据路径摄像头/麦克风驱动 → DS Filter → SampleGrabber → AVPacket不碰驱动、不解码、不缩放、不混音

相关新闻

实战:用 LangGraph 搭建「数据搜集员+撰稿人」协作团队

实战:用 LangGraph 搭建「数据搜集员+撰稿人」协作团队

单 Agent 把查资料、写稿、审校全塞进一个 prompt。多 Agent 把任务拆成有向图,每个节点只干一件事,产出物在共享状态里接力。这篇把协作落成能跑的代码。 实战:用 LangGraph 搭建「数据搜集员撰稿人」协作团队 同一个选题,让一个…

2026/10/17 1:12:03 阅读更多 →
如何快速掌握Sketchfab模型下载神器:Firefox专属脚本的完整指南

如何快速掌握Sketchfab模型下载神器:Firefox专属脚本的完整指南

如何快速掌握Sketchfab模型下载神器:Firefox专属脚本的完整指南 【免费下载链接】sketchfab sketchfab download userscipt for Tampermonkey by firefox only 项目地址: https://gitcode.com/gh_mirrors/sk/sketchfab 还在为Sketchfab上精美的3D模型无法下载…

2026/10/20 19:08:54 阅读更多 →
RAG的Top K取3条还是10条?我用20个问题跑了一遍

RAG的Top K取3条还是10条?我用20个问题跑了一遍

RAG 调参数时,Top K 往往是最先被改的那个数字。 答案漏了,就从 3 调到 10;还不放心,再改成 20。看起来很合理:多拿几段资料,正确答案总该在里面。 可检索结果真的越多越好吗? 我做了一个 20…

2026/10/17 17:14:39 阅读更多 →

最新新闻

车载Android音频HAL Server启动全流程拆解:从init到AudioFlinger

车载Android音频HAL Server启动全流程拆解:从init到AudioFlinger

车载Android项目里,音频问题占了启动阶段很大一部分工作量。一开机没声音、开机声音卡顿、语音助手唤醒失败、电话切音区不生效,追到最底层,几乎都会汇聚到一个进程:Audio HAL Server。很多同学知道有这么一个vendor进程&#xff…

2026/10/20 23:15:44 阅读更多 →
diagram-design 实战:用约束型规范让技术图会说话

diagram-design 实战:用约束型规范让技术图会说话

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题第一次看到 “diagram-design” 这个标题,很多人会以为它只是教你怎么把图画得好看一点。但真正做过技术方案、写过设计文档、给团队讲过架构的人都知道,画图这件事从来不只是“美…

2026/10/20 23:15:44 阅读更多 →
令牌桶算法详解:从QoS限速原理到Linux tc与双桶三色标记实战

令牌桶算法详解:从QoS限速原理到Linux tc与双桶三色标记实战

1. 从一个真实场景说起:为什么你的视频会议总是卡 你有没有遇到过这种情况:家里宽带明明是500M,测速也跑得满,但只要一开视频会议,画面就开始糊,声音断断续续,与此同时后台的下载任务还在疯狂抢…

2026/10/20 23:15:44 阅读更多 →
单相全桥逆变器Simulink仿真:从SPWM调制到LC滤波参数设计与THD分析

单相全桥逆变器Simulink仿真:从SPWM调制到LC滤波参数设计与THD分析

做电力电子这块的人,大概都有过类似经历:理论上把单相全桥逆变器背得滚瓜烂熟,四个开关管怎么换流、SPWM怎么调制,画个拓扑图加几条波形就能交差;可真到了课程设计或项目里需要看到实际电性能时,才发现手边…

2026/10/20 23:15:44 阅读更多 →
PCA人脸识别实战:从零搭建特征脸系统与避坑指南

PCA人脸识别实战:从零搭建特征脸系统与避坑指南

人脸识别这个词听起来挺唬人,但真动手做起来,最经典的那套入门方案反而没那么玄乎。我最早接触这个方向的时候,以为非得搞个深度网络、跑上几十万张图才能出效果,后来发现用PCA(主成分分析)这套老方法&…

2026/10/20 23:15:44 阅读更多 →
context-mode设计模式:如何让同一套核心逻辑适配多种运行上下文

context-mode设计模式:如何让同一套核心逻辑适配多种运行上下文

1. 从"context-mode"这个词说起:它到底在解决什么问题第一次看到"context-mode"这个标题,很多人会下意识地把它当成某个框架里的配置项,或者某个库的开关参数。但如果你真的在工程一线待过几年,就会意识到这个…

2026/10/20 23:14:43 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →