DirectShow 采集是 OBS Studio 的一个插件,它支持从网络摄像头、采集卡以及其他在 Windows 上支持 DirectShow API 的视频输入设备进行采集。该模块负责设备发现、配置、视频和音频采集、格式转换以及对支持格式的硬件加速解码。
有关游戏采集的信息,请参阅游戏采集。有关窗口和显示器采集的信息,请参阅窗口与显示器采集。
DirectShow 采集的实现围绕一个核心的 DShowInput 类构建,该类管理采集设备的生命周期并处理视频和音频数据。它在专用线程中运行 DirectShow 操作,以避免阻塞 OBS 主 UI 线程。
来源:plugins/win-dshow/win-dshow.cpp30-294 plugins/win-dshow/win-dshow.cpp675-695
该插件枚举所有可用的 DirectShow 设备,并将其呈现给用户进行选择。每个设备通过名称和路径标识,这些信息被编码成设备 ID 字符串。
来源:plugins/win-dshow/win-dshow.cpp675-695
每个 DirectShow 设备支持不同的分辨率、格式和帧率。该插件处理所有这些配置。
| 配置类型 | 选项 |
|---|---|
| 分辨率类型 | 设备默认, 自定义 |
| 视频格式 | 任意, NV12, YUY2, UYVY, HDYC, MJPEG 等 |
| 帧率 | 匹配输出, 最高, 或特定帧率 |
| 色彩空间 | 默认, Rec. 709, Rec. 601, Rec. 2100 (PQ/HLG) |
| 缓冲 | 自动检测, 启用, 禁用 |
来源:plugins/win-dshow/win-dshow.cpp858-975 plugins/win-dshow/data/locale/en-US.ini1-42
当从 DirectShow 设备捕获帧时,它遵循此处理路径:
来源:plugins/win-dshow/win-dshow.cpp479-608 plugins/win-dshow/ffmpeg-decode.c268-414
该插件支持 DirectShow 设备的各种视频格式:
处理编码格式时,插件使用 FFmpeg 解码视频帧,然后将其传递给 OBS。
来源:plugins/win-dshow/win-dshow.cpp410-438 plugins/win-dshow/win-dshow.cpp516-540
对于编码视频格式,如果可用,插件可以利用硬件解码来提高性能。
来源:plugins/win-dshow/ffmpeg-decode.c25-67 plugins/win-dshow/ffmpeg-decode.c268-414
DirectShow 采集通过以下几种方式支持音频:
音频管道与视频管道类似,支持 AAC、AC3 和 MPGA 等格式的解码。
来源:plugins/win-dshow/win-dshow.cpp610-674 plugins/win-dshow/win-dshow.cpp976-1045
缓冲系统有助于管理具有可变帧时间设备的流畅播放。
来源:plugins/win-dshow/win-dshow.cpp828-854
DirectShow 操作在专用线程中运行,以避免阻塞 OBS 的主线程。这提高了响应性和稳定性。
来源:plugins/win-dshow/win-dshow.cpp183-381 plugins/win-dshow/win-dshow.cpp1047-1152
DirectShow 采集源具有由插件管理的定义生命周期:
该插件包含一个选项,可在设备不在当前场景中显示时自动停用设备,这有助于节省系统资源。
来源:plugins/win-dshow/win-dshow.cpp1154-1206 plugins/win-dshow/win-dshow.cpp230-258
该插件还包含作为 DirectShow 虚拟摄像头源的功能,其他应用程序可以使用它。这在 win-dshow 插件中作为独立功能实现。
来源:plugins/win-dshow/virtualcam-module/virtualcam-module.cpp1-285 plugins/win-dshow/virtualcam-module/virtualcam-filter.cpp1-352
该插件包含广泛的错误处理功能,以管理设备断开连接、格式不兼容以及采集过程中可能出现的其他问题。
必要时,插件会在不同像素格式之间进行转换,以确保与 OBS 内部处理管道的兼容性。
来源:plugins/win-dshow/win-dshow.cpp476-510 plugins/win-dshow/ffmpeg-decode.c47-67 plugins/win-dshow/win-dshow.cpp841-854