DirectShow 是 DirectX 家族里管多媒体的那套框架,九十年代末就有了。现在新项目基本不用它,但工业相机、采集卡、老视频软件里还大量存在,维护的时候绕不开。
它的核心是 Filter Graph 模型。一个 Filter 负责一段处理,Source Filter 从设备或者文件拿数据,Transform Filter 做解码、色彩空间转换这类处理,Renderer Filter 负责显示或者输出。Filter 之间用 Pin 连接,上游的输出 Pin 连下游的输入 Pin,媒体类型要在连接时协商,分辨率、帧率、像素格式都得对得上。
写代码的时候一般是先用 GraphBuilder 拼图,再调 IMediaControl 的 Run、Pause、Stop 控制播放,用 IAMStreamConfig 设置采集格式,用 SampleGrabber 从数据流里抓单帧做处理。这些接口都是 COM,C++里要处理引用计数和智能指针,C#那边靠封装库调用,坑更多。
它的优点是延迟低、硬件加速路径成熟,兼容市面上绝大多数 USB 摄像头和采集卡。工业检测里经常用它取图,因为帧率和时间戳相对稳定。缺点是 API 老、文档少、COM 调试痛苦,出问题的时候错误码往往只有一句"未指定的错误"。
微软后来推 Media Foundation,本意是替代 DirectShow,但生态没完全接上,很多老设备驱动只提供 DirectShow 接口。所以现在的局面是两套并存,采集卡厂商的 SDK 里常常两套都封一层。
如果是新项目,建议直接用 FFmpeg 或者 GStreamer,跨平台、资料多、社区活跃。只有必须对接老采集卡、或者要维护已有的 DirectShow 代码时,才值得花时间啃这套东西。真要学,重点理解 Filter Graph 的数据流和 Pin 协商,比背接口名有用得多。
下一篇:没有了