菜单

DirectShow 捕获

相关源文件

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 设备的各种视频格式:

  1. 原始格式:NV12, YUY2, YVYU, UYVY, I420, YV12, XRGB, ARGB 等。
  2. 编码格式:MJPEG, H.264, HEVC (启用时)

处理编码格式时,插件使用 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 采集通过以下几种方式支持音频:

  1. 设备音频:直接使用视频采集设备中的音频
  2. 独立音频滤镜:适用于具有独立音频滤镜组件的设备
  3. 自定义音频设备:完全使用不同的音频设备
  4. 音频输出模式:采集、DirectSound 或 WaveOut

音频管道与视频管道类似,支持 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 采集源具有由插件管理的定义生命周期:

  1. 创建:当用户添加 DirectShow 采集源时
  2. 配置:当设置更改时
  3. 激活:当源变为活动状态时
  4. 停用:当源被停用时
  5. 销毁:当源被移除时

该插件包含一个选项,可在设备不在当前场景中显示时自动停用设备,这有助于节省系统资源。

来源: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