You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下WebRTC VideoCapture启动失败:(&capture_checker_)->IsCurrent()断言错误

WebRTC Native摄像头采集线程不匹配断言崩溃解决方案

问题本质

sink_filter_ds.cc第735行的(&capture_checker_)->IsCurrent()断言失败,核心原因是DirectShow采集回调线程与WebRTC VideoCaptureModule的绑定线程不匹配:

  • CaptureInputPin::Receive是DirectShow在其内部工作线程触发的回调
  • capture_checker_绑定的是你调用StartCapture的线程(通常是应用线程)
  • 直接注释RTC_DCHECK_RUN_ON只是跳过了合法性检查,但线程上下文不兼容的问题依然存在,后续操作因线程安全问题崩溃。

可行解决方案

1. 统一操作线程并保证线程存在消息循环

WebRTC Windows平台的DirectShow采集模块要求:VideoCaptureModule的创建、启动、停止、销毁必须在同一个带消息循环的线程中执行。DirectShow会复用该线程的消息循环处理采集回调,确保回调线程与模块绑定线程一致。

示例线程实现:

#include <windows.h>

// 采集线程消息循环
DWORD WINAPI CaptureThreadProc(LPVOID lpParam) {
    MSG msg;
    // 启动消息循环,处理DirectShow回调消息
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

// 在主线程中启动采集线程并执行操作
void StartCaptureInDedicatedThread() {
    HANDLE hThread = CreateThread(NULL, 0, CaptureThreadProc, NULL, 0, NULL);
    if (hThread) {
        // 等待线程初始化完成(可通过事件同步)
        // 在线程内执行VideoCaptureModule的所有操作
        // 示例:
        // webrtc::VideoCaptureModule* module = webrtc::VideoCaptureModule::Create(...);
        // module->StartCapture(...);
        // 后续停止、销毁操作也必须在该线程内执行
    }
}

2. 修复线程检查逻辑(若需修改WebRTC源码)

不要直接注释断言,而是调整capture_checker_的绑定线程:

  • 在SinkFilterDS初始化时,将capture_checker_绑定到DirectShow回调线程(即CaptureInputPin::Receive所在线程)
  • 修改sink_filter_ds.cc中capture_checker_的初始化逻辑,确保其与回调线程关联:
// 原初始化可能绑定了创建线程,改为在首次回调时绑定
void CaptureInputPin::Receive(IMediaSample* pSample) {
    if (!capture_checker_->IsCurrent() && !capture_checker_->IsSet()) {
        capture_checker_->SetCurrent(); // 首次回调时绑定当前线程
    }
    RTC_DCHECK_RUN_ON(capture_checker_);
    // 后续原有逻辑
}

注意:此修改需确保所有模块操作与回调线程兼容,避免其他线程安全问题。

3. 检查测试代码中的线程问题

  • 确认你调用StartCapture的线程是否存在消息循环:若在主线程,需确保主线程有GetMessage循环;若在后台线程,必须手动启动消息循环
  • 禁止跨线程调用VideoCaptureModule的方法:StartCapture、StopCapture、Destroy必须在同一线程执行
  • 检查是否存在模块被提前销毁的情况:若模块在回调触发前被其他线程销毁,也会导致崩溃

关键注意事项

  • 不要随意注释WebRTC的RTC_DCHECK断言:这些断言是WebRTC线程安全模型的关键检查,跳过会隐藏底层问题
  • 若使用预编译WebRTC库,确保库的编译线程模型与你的应用一致(如是否启用多线程DLL、是否依赖消息循环)
  • 可通过打印线程ID验证:分别打印调用StartCapture的线程ID和CaptureInputPin::Receive内的线程ID,确认是否一致

内容的提问来源于stack exchange,提问作者shanw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:57:18