尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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不碰驱动、不解码、不缩放、不混音
RELATED

相关推荐

基于PLC的自动上料分拣装置的设计与工业应用研究|毕设答辩|PLC项目|毕设项目|自动化项目

基于PLC的自动上料分拣装置的设计与工业应用研究|毕设答辩|PLC项目|毕设项目|自动化项目

题目:基于PLC的自动上料分拣装置的设计与工业应用研究 一、项目介绍 摘 要 针对工业生产中传统分拣方式效率低、精度差、人工成本高的问题,本文开展基于PLC的自动上料分拣装置的设计与工业应用研究。以西门子S7-1200 PLC为控制核心,完成装置…

📅 2026/9/21 5:37:29
跨马翻译:批量图片翻译与视频字幕工具,跨境电商高效助手

跨马翻译:批量图片翻译与视频字幕工具,跨境电商高效助手

一、问题引入:当多语言营销成为刚需,效率却成了瓶颈从事跨境电商的卖家都清楚,产品要走向全球市场,语言本地化是第一道门槛。一位主攻欧美市场的亚马逊卖家,上架新品时往往需要将产品图上的中文或英文信息翻译成德语、…

📅 2026/9/21 7:23:01
TikTok Shop卖家必备:批量图片翻译工具免费试用,智能抠图与视频字幕一键搞定

TikTok Shop卖家必备:批量图片翻译工具免费试用,智能抠图与视频字幕一键搞定

一、问题引入:跨境卖家的“多语言”困境 作为TikTok Shop卖家,你是否经常面临这样的窘境:精心拍摄的产品视频和主图,因为语言问题无法直接投放到东南亚、欧美等不同国家市场?为了开拓新站点,你需要将几十上…

📅 2026/9/22 11:31:31
MORE NEWS

更多资讯

📰

OpenFeign自定义Encoder/Decoder:从JSON到XML、Protobuf与私有协议

刚开始接触 OpenFeign 的时候,我一直觉得它就是个 JSON 客户端:“定义接口、贴注解、注入依赖、调方法”,剩下的交给 Spring Cloud 魔法去处理。直到我被一个对接老系统 XML 接口的需求逼到墙角,才发现这个认知有多坑:…

📰

Context Menu Manager Plus 详细编辑功能完整指南:精细管理 7-Zip、Bandizip 等软件的右键菜单选项

Context Menu Manager Plus 详细编辑功能完整指南:精细管理 7-Zip、Bandizip 等软件的右键菜单选项 【免费下载链接】ContextMenuMgr Context Menu Manager Plus 是一个强大的实用程序,它可帮助您管理 Windows 上的右键菜单,并避免第三方向你…

📰

Python图片转Base64:PIL与base64完整实践指南

先说我平时处理得最多的一件事:网页里内嵌小图标。以前要么外链一张图片文件,多一次HTTP请求;要么把图片以二进制形式硬编码到代码里,维护起来都是麻烦。后来发现直接用一串以data:image/png;base64,开头的文本就能把整张图塞进HT…

📰

C++符号混淆实战:从名字泄露到二进制加固

1. 符号与名字:为什么C项目的“名字”会暴露信息1.1 C的符号是怎么进到二进制里的C符号混淆技术,说白了就是围绕“名字”做文章。许多人在写C项目时,脑子里装的是算法、类结构、内存管理,很少想到等编译链接完成之后,你…

📰

拒绝拖延:一文搞懂规则网站建设技术栈选型

拒绝拖延:一文搞懂规则网站建设技术栈选型 改个需求建站公司拖一周,这种憋屈事你是不是也干过?明明只是改个导航栏颜色,对方却以“排期太满”为由,让你再等三天。别怪对方,怪只怪你当初没把底层架构和规则引擎选对。很多新手入行做网站,上来就找外包,…

📰

FDE现场部署工程师崛起:AI时代方案落地的关键工程岗

最近被问得最多的一个词,就是FDE。年前刷招聘软件,满屏都是“FDE解决方案工程师(高级)”“FDE部署工程师”;年后再看热搜,腾讯FDE课程、FDE证书、FDE工程师学习路线已经铺天盖地。很多朋友的第一反应都一样…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬