构建OBS虚拟摄像头系统的DirectShow集成实现【免费下载链接】obs-virtual-cam项目地址: https://gitcode.com/gh_mirrors/obs/obs-virtual-camOBS虚拟摄像头是一个基于DirectShow框架的视频捕获插件通过共享内存队列技术将OBS Studio的视频输出桥接到Windows系统的虚拟摄像头接口。该项目实现了OBS视频流到系统级摄像头设备的实时转换支持最多四个独立的虚拟摄像头实例为视频会议、直播和录制软件提供专业级的视频输入源。️ 架构实现原理与模块设计OBS虚拟摄像头采用双模块架构设计通过共享内存队列实现OBS输出与DirectShow设备之间的高效数据交换。核心模块包括虚拟输出模块src/virtual-output/和虚拟源模块src/virtual-source/两者通过命名内存映射文件进行通信。虚拟输出模块作为OBS插件运行负责从OBS视频管道捕获帧数据并写入共享队列。模块使用FFmpeg的像素格式转换功能处理不同视频格式// 虚拟输出模块的主要组件 virtual_main.cpp // 插件入口点 virtual_output.cpp // 输出控制器 virtual_filter.cpp // 视频滤镜处理 share_queue_write.cpp // 共享队列写入器虚拟源模块作为DirectShow过滤器实现提供标准的摄像头接口。该模块实现了四个独立的COM类标识符CLSID对应四个虚拟摄像头实例// 虚拟源模块的核心COM类定义 EXTERN_C const GUID CLSID_OBS_VirtualV; EXTERN_C const GUID CLSID_OBS_VirtualV2; EXTERN_C const GUID CLSID_OBS_VirtualV3; EXTERN_C const GUID CLSID_OBS_VirtualV4; // DirectShow过滤器创建函数 CUnknown* WINAPI CreateInstance(LPUNKNOWN lpunk, HRESULT *phr); CUnknown* WINAPI CreateInstance2(LPUNKNOWN lpunk, HRESULT *phr); CUnknown* WINAPI CreateInstance3(LPUNKNOWN lpunk, HRESULT *phr); CUnknown* WINAPI CreateInstance4(LPUNKNOWN lpunk, HRESULT *phr); 共享内存队列的数据交换机制项目使用高效的内存映射文件实现进程间通信在src/queue/share_queue.h中定义了队列数据结构。每个虚拟摄像头对应独立的共享内存区域支持多种像素格式和分辨率配置struct queue_header { int state; // 队列状态停止、启动、就绪 int format; // 像素格式AV_PIX_FMT_* int queue_length; // 队列容量帧数 int write_index; // 当前写入位置 int header_size; // 头部大小 int element_size; // 元素大小 int element_header_size; // 元素头部大小 int delay_frame; // 延迟帧数 int recommended_width; // 推荐宽度 int recommended_height; // 推荐高度 int aspect_ratio_type; // 宽高比类型 uint64_t last_ts; // 最后时间戳 uint64_t frame_time; // 帧间隔时间 }; struct frame_header { uint64_t timestamp; // 帧时间戳 uint32_t linesize[4]; // 各行大小 int frame_width; // 帧宽度 int frame_height; // 帧高度 };队列支持多种视频格式包括YUV420P、NV12、YUYV422、RGBA等通过cal_video_buffer_size()函数动态计算不同格式所需的缓冲区大小。 配置参数与构建部署方案项目使用CMake构建系统需要配置多个依赖路径。构建前需设置以下环境变量# CMake配置参数示例 set(QTDIR C:/Qt/5.15.2/msvc2019_64) # Qt框架路径 set(DepsPath C:/obs-deps/ffmpeg) # FFmpeg依赖路径 set(LIBOBS_INCLUDE_DIR C:/obs-studio/libobs) # OBS库包含目录 set(LIBOBS_LIB C:/obs-studio/libobs/obs.lib) # OBS库文件 set(OBS_FRONTEND_LIB C:/obs-studio/UI/obs-frontend-api.lib) # 前端API库 set(PTHREAD_LIB C:/obs-deps/pthread/w32-pthread.lib) # 线程库构建过程分为两个主要目标obs-virtualoutput输出插件和obs-virtualsourceDirectShow过滤器。输出插件链接Qt5和OBS库而源模块依赖DirectShow基础库strmbase.lib和FFmpeg的swscale组件。️ DirectShow过滤器实现细节虚拟摄像头源模块实现了完整的DirectShow过滤器接口包括IAMStreamConfig和IKsPropertySet接口支持动态分辨率切换和属性配置。核心类CVCamStream继承自CSourceStream提供视频流处理功能class CVCamStream : public CSourceStream, public IAMStreamConfig, public IKsPropertySet { public: // IAMStreamConfig接口方法 HRESULT STDMETHODCALLTYPE SetFormat(AM_MEDIA_TYPE *pmt); HRESULT STDMETHODCALLTYPE GetFormat(AM_MEDIA_TYPE **ppmt); HRESULT STDMETHODCALLTYPE GetNumberOfCapabilities(int *piCount, int *piSize); HRESULT STDMETHODCALLTYPE GetStreamCaps(int iIndex, AM_MEDIA_TYPE **pmt, BYTE *pSCC); // 视频帧填充方法 HRESULT FillBuffer(IMediaSample *pms); // 媒体类型处理 HRESULT CheckMediaType(const CMediaType *pMediaType); HRESULT GetMediaType(int iPosition, CMediaType *pmt); HRESULT SetMediaType(const CMediaType *pmt); };过滤器支持的分辨率范围从320×240到4096×3072帧率通过AvgTimePerFrame参数控制最小帧间隔为166,666纳秒约6FPS最大为1,000,000纳秒1FPS。 视频格式转换与同步机制系统使用FFmpeg的swscale库进行像素格式转换支持从OBS内部格式如NV12、YUV420P转换为DirectShow兼容的YUYV422格式。转换上下文在SetConvertContext()方法中初始化void CVCamStream::SetConvertContext() { VIDEOINFOHEADER *pvi (VIDEOINFOHEADER *)(m_mt.Format()); scale_info.dst_format AV_PIX_FMT_YUYV422; scale_info.dst_width pvi-bmiHeader.biWidth; scale_info.dst_height pvi-bmiHeader.biHeight; scale_info.dst_linesize[0] pvi-bmiHeader.biWidth * 2; }时间同步机制确保视频播放的流畅性。SetSyncTimeout()方法根据队列长度和帧时间计算同步超时而SetGetTimeout()根据当前帧率调整获取帧的超时时间void CVCamStream::SetSyncTimeout() { if (queue.header) { sync_timeout queue.header-queue_length * queue.header-frame_time / 100; } else { sync_timeout 10 * ((VIDEOINFOHEADER*)m_mt.pbFormat)-AvgTimePerFrame; } } void CVCamStream::SetGetTimeout() { get_timeout ((VIDEOINFOHEADER*)m_mt.pbFormat)-AvgTimePerFrame * 3 / (SLEEP_DURATION * 10000); } 注册表配置与系统集成虚拟摄像头通过Windows注册表集成到系统中。安装过程需要注册32位和64位版本的DirectShow过滤器# 注册32位版本 regsvr32 C:\Program Files\obs-studio\bin\32bit\obs-virtualsource.dll # 注册64位版本 regsvr32 C:\Program Files\obs-studio\bin\64bit\obs-virtualsource.dll # 注册特定数量的虚拟摄像头最多4个 regsvr32 /u C:\Program Files\obs-studio\bin\64bit\obs-virtualsource.dll regsvr32 /n /i:2 C:\Program Files\obs-studio\bin\64bit\obs-virtualsource.dll项目包含完整的NSIS安装脚本installer/installer.nsi支持自定义安装路径和虚拟摄像头数量配置。注册表配置存储在util/reg_path.reg和util/unreg_path.reg中便于手动部署和卸载。 多语言支持与界面本地化系统提供完整的国际化支持语言文件位于locale/目录en-US.ini- 英语美国zh-CN.ini- 简体中文zh-TW.ini- 繁体中文fr-FR.ini- 法语ru-RU.ini- 俄语本地化件使用INI格式包含所有用户界面字符串的翻译确保在不同语言环境下的一致用户体验。⚙️ 性能优化与缓冲区管理共享队列采用环形缓冲区设计支持动态调整缓冲区大小以适应不同的性能需求。队列头部的delay_frame参数控制延迟帧数平衡延迟与流畅性。视频帧通过FillBuffer()方法从队列读取使用双缓冲机制避免数据竞争HRESULT CVCamStream::FillBuffer(IMediaSample *pms) { HRESULT hr; bool get_sample false; uint8_t *buffer; // 获取媒体样本缓冲区 hr pms-GetPointer(buffer); if (FAILED(hr)) return hr; // 从共享队列获取视频帧 int ret shared_queue_get_video_frame(queue_mode, queue, buffer, frame_width * frame_height * 2, get_timeout); // 处理获取结果 if (ret 0) { // 成功获取帧数据 get_sample true; } else if (ret 1) { // 队列为空使用上一帧 get_sample false; } // 设置时间戳 REFERENCE_TIME start prev_end_ts; REFERENCE_TIME end start ((VIDEOINFOHEADER*)m_mt.pbFormat)-AvgTimePerFrame; pms-SetTime(start, end); prev_end_ts end; return S_OK; } 系统兼容性与依赖关系项目针对Windows平台开发支持Windows 7、8、10系统需要OBS Studio 24.0.0或更高版本。依赖库包括DirectShow Base Classes- 位于dshowdeps/目录提供DirectShow框架基础FFmpeg库- 用于视频格式转换和缩放Qt5框架- 提供用户界面组件OBS库- 与OBS Studio的核心集成构建系统自动检测目标平台32位或64位并链接相应的DirectShow库版本。对于64位系统使用dshowdeps/lib/x64/目录中的库文件32位系统使用dshowdeps/lib/x86/目录。 监控与调试支持系统提供多种调试机制包括视频帧统计、队列状态监控和错误处理。shared_queue_get_video_format()函数允许查询OBS端的视频配置确保格式兼容性。错误处理机制通过HRESULT返回值提供详细的错误信息便于问题诊断。虚拟摄像头支持通过IAMStreamConfig接口动态查询和修改视频属性应用程序可以枚举支持的分辨率和帧率组合选择最适合其需求的配置。 扩展开发与自定义功能开发者可以通过修改以下关键文件添加新功能视频滤镜扩展- 修改src/virtual-output/virtual_filter.cpp添加新的视频处理效果格式支持扩展- 在src/queue/share_queue.h的cal_video_buffer_size()函数中添加新像素格式支持接口扩展- 在src/virtual-source/virtual-cam.h中实现额外的DirectShow接口配置界面- 修改src/virtual-output/virtual_properties.ui调整用户界面项目采用模块化设计新增功能可以通过继承现有类或添加新的COM接口实现保持与现有系统的兼容性。️ 安全性与稳定性考量系统实现包含多个安全机制内存安全- 使用智能指针和RAII模式管理资源线程安全- 关键部分使用互斥锁保护错误恢复- 自动检测和恢复队列状态异常资源清理- 确保所有句柄和内存映射在析构时正确释放虚拟摄像头在OBS进程异常退出时自动清理共享内存资源防止系统资源泄漏。DirectShow过滤器实现完整的COM引用计数确保正确的生命周期管理。通过这种技术架构OBS虚拟摄像头为Windows平台提供了一个稳定、高效、可扩展的虚拟摄像头解决方案将OBS Studio的专业视频处理能力无缝集成到标准的DirectShow生态系统中。【免费下载链接】obs-virtual-cam项目地址: https://gitcode.com/gh_mirrors/obs/obs-virtual-cam创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
构建OBS虚拟摄像头系统的DirectShow集成实现
发布时间:2026/5/26 20:57:06
构建OBS虚拟摄像头系统的DirectShow集成实现【免费下载链接】obs-virtual-cam项目地址: https://gitcode.com/gh_mirrors/obs/obs-virtual-camOBS虚拟摄像头是一个基于DirectShow框架的视频捕获插件通过共享内存队列技术将OBS Studio的视频输出桥接到Windows系统的虚拟摄像头接口。该项目实现了OBS视频流到系统级摄像头设备的实时转换支持最多四个独立的虚拟摄像头实例为视频会议、直播和录制软件提供专业级的视频输入源。️ 架构实现原理与模块设计OBS虚拟摄像头采用双模块架构设计通过共享内存队列实现OBS输出与DirectShow设备之间的高效数据交换。核心模块包括虚拟输出模块src/virtual-output/和虚拟源模块src/virtual-source/两者通过命名内存映射文件进行通信。虚拟输出模块作为OBS插件运行负责从OBS视频管道捕获帧数据并写入共享队列。模块使用FFmpeg的像素格式转换功能处理不同视频格式// 虚拟输出模块的主要组件 virtual_main.cpp // 插件入口点 virtual_output.cpp // 输出控制器 virtual_filter.cpp // 视频滤镜处理 share_queue_write.cpp // 共享队列写入器虚拟源模块作为DirectShow过滤器实现提供标准的摄像头接口。该模块实现了四个独立的COM类标识符CLSID对应四个虚拟摄像头实例// 虚拟源模块的核心COM类定义 EXTERN_C const GUID CLSID_OBS_VirtualV; EXTERN_C const GUID CLSID_OBS_VirtualV2; EXTERN_C const GUID CLSID_OBS_VirtualV3; EXTERN_C const GUID CLSID_OBS_VirtualV4; // DirectShow过滤器创建函数 CUnknown* WINAPI CreateInstance(LPUNKNOWN lpunk, HRESULT *phr); CUnknown* WINAPI CreateInstance2(LPUNKNOWN lpunk, HRESULT *phr); CUnknown* WINAPI CreateInstance3(LPUNKNOWN lpunk, HRESULT *phr); CUnknown* WINAPI CreateInstance4(LPUNKNOWN lpunk, HRESULT *phr); 共享内存队列的数据交换机制项目使用高效的内存映射文件实现进程间通信在src/queue/share_queue.h中定义了队列数据结构。每个虚拟摄像头对应独立的共享内存区域支持多种像素格式和分辨率配置struct queue_header { int state; // 队列状态停止、启动、就绪 int format; // 像素格式AV_PIX_FMT_* int queue_length; // 队列容量帧数 int write_index; // 当前写入位置 int header_size; // 头部大小 int element_size; // 元素大小 int element_header_size; // 元素头部大小 int delay_frame; // 延迟帧数 int recommended_width; // 推荐宽度 int recommended_height; // 推荐高度 int aspect_ratio_type; // 宽高比类型 uint64_t last_ts; // 最后时间戳 uint64_t frame_time; // 帧间隔时间 }; struct frame_header { uint64_t timestamp; // 帧时间戳 uint32_t linesize[4]; // 各行大小 int frame_width; // 帧宽度 int frame_height; // 帧高度 };队列支持多种视频格式包括YUV420P、NV12、YUYV422、RGBA等通过cal_video_buffer_size()函数动态计算不同格式所需的缓冲区大小。 配置参数与构建部署方案项目使用CMake构建系统需要配置多个依赖路径。构建前需设置以下环境变量# CMake配置参数示例 set(QTDIR C:/Qt/5.15.2/msvc2019_64) # Qt框架路径 set(DepsPath C:/obs-deps/ffmpeg) # FFmpeg依赖路径 set(LIBOBS_INCLUDE_DIR C:/obs-studio/libobs) # OBS库包含目录 set(LIBOBS_LIB C:/obs-studio/libobs/obs.lib) # OBS库文件 set(OBS_FRONTEND_LIB C:/obs-studio/UI/obs-frontend-api.lib) # 前端API库 set(PTHREAD_LIB C:/obs-deps/pthread/w32-pthread.lib) # 线程库构建过程分为两个主要目标obs-virtualoutput输出插件和obs-virtualsourceDirectShow过滤器。输出插件链接Qt5和OBS库而源模块依赖DirectShow基础库strmbase.lib和FFmpeg的swscale组件。️ DirectShow过滤器实现细节虚拟摄像头源模块实现了完整的DirectShow过滤器接口包括IAMStreamConfig和IKsPropertySet接口支持动态分辨率切换和属性配置。核心类CVCamStream继承自CSourceStream提供视频流处理功能class CVCamStream : public CSourceStream, public IAMStreamConfig, public IKsPropertySet { public: // IAMStreamConfig接口方法 HRESULT STDMETHODCALLTYPE SetFormat(AM_MEDIA_TYPE *pmt); HRESULT STDMETHODCALLTYPE GetFormat(AM_MEDIA_TYPE **ppmt); HRESULT STDMETHODCALLTYPE GetNumberOfCapabilities(int *piCount, int *piSize); HRESULT STDMETHODCALLTYPE GetStreamCaps(int iIndex, AM_MEDIA_TYPE **pmt, BYTE *pSCC); // 视频帧填充方法 HRESULT FillBuffer(IMediaSample *pms); // 媒体类型处理 HRESULT CheckMediaType(const CMediaType *pMediaType); HRESULT GetMediaType(int iPosition, CMediaType *pmt); HRESULT SetMediaType(const CMediaType *pmt); };过滤器支持的分辨率范围从320×240到4096×3072帧率通过AvgTimePerFrame参数控制最小帧间隔为166,666纳秒约6FPS最大为1,000,000纳秒1FPS。 视频格式转换与同步机制系统使用FFmpeg的swscale库进行像素格式转换支持从OBS内部格式如NV12、YUV420P转换为DirectShow兼容的YUYV422格式。转换上下文在SetConvertContext()方法中初始化void CVCamStream::SetConvertContext() { VIDEOINFOHEADER *pvi (VIDEOINFOHEADER *)(m_mt.Format()); scale_info.dst_format AV_PIX_FMT_YUYV422; scale_info.dst_width pvi-bmiHeader.biWidth; scale_info.dst_height pvi-bmiHeader.biHeight; scale_info.dst_linesize[0] pvi-bmiHeader.biWidth * 2; }时间同步机制确保视频播放的流畅性。SetSyncTimeout()方法根据队列长度和帧时间计算同步超时而SetGetTimeout()根据当前帧率调整获取帧的超时时间void CVCamStream::SetSyncTimeout() { if (queue.header) { sync_timeout queue.header-queue_length * queue.header-frame_time / 100; } else { sync_timeout 10 * ((VIDEOINFOHEADER*)m_mt.pbFormat)-AvgTimePerFrame; } } void CVCamStream::SetGetTimeout() { get_timeout ((VIDEOINFOHEADER*)m_mt.pbFormat)-AvgTimePerFrame * 3 / (SLEEP_DURATION * 10000); } 注册表配置与系统集成虚拟摄像头通过Windows注册表集成到系统中。安装过程需要注册32位和64位版本的DirectShow过滤器# 注册32位版本 regsvr32 C:\Program Files\obs-studio\bin\32bit\obs-virtualsource.dll # 注册64位版本 regsvr32 C:\Program Files\obs-studio\bin\64bit\obs-virtualsource.dll # 注册特定数量的虚拟摄像头最多4个 regsvr32 /u C:\Program Files\obs-studio\bin\64bit\obs-virtualsource.dll regsvr32 /n /i:2 C:\Program Files\obs-studio\bin\64bit\obs-virtualsource.dll项目包含完整的NSIS安装脚本installer/installer.nsi支持自定义安装路径和虚拟摄像头数量配置。注册表配置存储在util/reg_path.reg和util/unreg_path.reg中便于手动部署和卸载。 多语言支持与界面本地化系统提供完整的国际化支持语言文件位于locale/目录en-US.ini- 英语美国zh-CN.ini- 简体中文zh-TW.ini- 繁体中文fr-FR.ini- 法语ru-RU.ini- 俄语本地化件使用INI格式包含所有用户界面字符串的翻译确保在不同语言环境下的一致用户体验。⚙️ 性能优化与缓冲区管理共享队列采用环形缓冲区设计支持动态调整缓冲区大小以适应不同的性能需求。队列头部的delay_frame参数控制延迟帧数平衡延迟与流畅性。视频帧通过FillBuffer()方法从队列读取使用双缓冲机制避免数据竞争HRESULT CVCamStream::FillBuffer(IMediaSample *pms) { HRESULT hr; bool get_sample false; uint8_t *buffer; // 获取媒体样本缓冲区 hr pms-GetPointer(buffer); if (FAILED(hr)) return hr; // 从共享队列获取视频帧 int ret shared_queue_get_video_frame(queue_mode, queue, buffer, frame_width * frame_height * 2, get_timeout); // 处理获取结果 if (ret 0) { // 成功获取帧数据 get_sample true; } else if (ret 1) { // 队列为空使用上一帧 get_sample false; } // 设置时间戳 REFERENCE_TIME start prev_end_ts; REFERENCE_TIME end start ((VIDEOINFOHEADER*)m_mt.pbFormat)-AvgTimePerFrame; pms-SetTime(start, end); prev_end_ts end; return S_OK; } 系统兼容性与依赖关系项目针对Windows平台开发支持Windows 7、8、10系统需要OBS Studio 24.0.0或更高版本。依赖库包括DirectShow Base Classes- 位于dshowdeps/目录提供DirectShow框架基础FFmpeg库- 用于视频格式转换和缩放Qt5框架- 提供用户界面组件OBS库- 与OBS Studio的核心集成构建系统自动检测目标平台32位或64位并链接相应的DirectShow库版本。对于64位系统使用dshowdeps/lib/x64/目录中的库文件32位系统使用dshowdeps/lib/x86/目录。 监控与调试支持系统提供多种调试机制包括视频帧统计、队列状态监控和错误处理。shared_queue_get_video_format()函数允许查询OBS端的视频配置确保格式兼容性。错误处理机制通过HRESULT返回值提供详细的错误信息便于问题诊断。虚拟摄像头支持通过IAMStreamConfig接口动态查询和修改视频属性应用程序可以枚举支持的分辨率和帧率组合选择最适合其需求的配置。 扩展开发与自定义功能开发者可以通过修改以下关键文件添加新功能视频滤镜扩展- 修改src/virtual-output/virtual_filter.cpp添加新的视频处理效果格式支持扩展- 在src/queue/share_queue.h的cal_video_buffer_size()函数中添加新像素格式支持接口扩展- 在src/virtual-source/virtual-cam.h中实现额外的DirectShow接口配置界面- 修改src/virtual-output/virtual_properties.ui调整用户界面项目采用模块化设计新增功能可以通过继承现有类或添加新的COM接口实现保持与现有系统的兼容性。️ 安全性与稳定性考量系统实现包含多个安全机制内存安全- 使用智能指针和RAII模式管理资源线程安全- 关键部分使用互斥锁保护错误恢复- 自动检测和恢复队列状态异常资源清理- 确保所有句柄和内存映射在析构时正确释放虚拟摄像头在OBS进程异常退出时自动清理共享内存资源防止系统资源泄漏。DirectShow过滤器实现完整的COM引用计数确保正确的生命周期管理。通过这种技术架构OBS虚拟摄像头为Windows平台提供了一个稳定、高效、可扩展的虚拟摄像头解决方案将OBS Studio的专业视频处理能力无缝集成到标准的DirectShow生态系统中。【免费下载链接】obs-virtual-cam项目地址: https://gitcode.com/gh_mirrors/obs/obs-virtual-cam创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考