【问题标题】:How to speed up the IMediaControl::Run() when capturing video from a webcam?从网络摄像头捕获视频时如何加速 IMediaControl::Run()?
【发布时间】:2015-03-27 13:52:33
【问题描述】:

代码按预期运行(使用预览和样本抓取器,抓取和压缩实时视频)。我要解决的问题甚至是在相对高端的机器上,实际的Run() 启动视频流的命令可能需要 4-5 秒才能执行,导致我的应用程序出现难看的延迟......似乎在那里一定是我能做的加快速度。以下是代码(减去错误检查、失败路径等):

CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void**)&pGraphBuilder );
CoCreateInstance( CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (void**)&pCaptureGraphBuilder2 );
pGraphBuilder->QueryInterface( IID_IMediaControl, (LPVOID *) &pMediaControl );

// initialize the capture graph builder
pCaptureGraphBuilder2->SetFiltergraph( pGraphBuilder );  

// get a video window interface for the preview
pGraphBuilder->QueryInterface( IID_IVideoWindow, (LPVOID *) &pVideoWindow );

// get and set the notification parent
pGraphBuilder->QueryInterface( IID_IMediaEventEx, (LPVOID *) &pMediaEventsEx );
pMediaEventsEx->SetNotifyWindow( (OAHWND)msgWindow, WM_GRAPHNOTIFY, 0 );

// pick the camera by the index selected
findCaptureDevice( &pSrcFilter, deviceIndex );

// add Capture filter to our graph
pGraphBuilder->AddFilter( pSrcFilter, L"Video Capture" );

// add in our sample grabber
sampleGrabber.Add( pGraphBuilder );
sampleGrabber.SetMediaType( doOneShot, deviceFormat );
sampleGrabber.SetCallback( this );

// render the preview pin on the video capture filter
pCaptureGraphBuilder2->RenderStream( &PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pSrcFilter, sampleGrabber.GetFilter(), NULL );
sampleGrabber.GetMediaType(); // for the dimensions
pSrcFilter->Release();

// set video preview window
setupVideoWindow( previewStatic.m_hWnd );

// 4+ seconds delay here, then everything works fine....
pMediaControl->Run();

任何指针表示赞赏!

【问题讨论】:

    标签: c++ webcam directshow video-capture


    【解决方案1】:

    耗时的Run 通常是由硬件延迟(源过滤器的背景某处)引起的。过滤器图形管理器和其他过滤器在几分之一秒内完成时间转换。您当然可以提前做好Pause 并且Run 可能会更快完成(部分延迟将移至停止/暂停转换),但是如果硬件需要很长时间才能起飞,您很可能需要提前开始捕获时间并跳过下游过滤器链中的数据。然后,当您需要开始捕获时,您将停止忽略流并且立即开始捕获。

    您可能还想检查更简单的图形 Camera Source -> Null Renderer 并测量其运行时间,以确认它是添加延迟的源过滤器。如果源过滤器启动速度很快,您将需要通过向图中逐步添加过滤器来隔离特定过滤器的延迟。

    【讨论】:

    • 一项小实验表明,无论出于何种原因,请求以 RGB24 进行捕获似乎都是罪魁祸首。我最近开始允许 YUY2 输入,并注意到我的延迟几乎消失了,除了一台相机在其格式列表中没有显示 YUY2。它确实支持 I420,但接下来也将允许该格式,看看是否可以解决它...
    • 无论您构建什么过滤器图,您总是有兴趣找出最终的确切拓扑:智能连接可能会添加您不想要的额外过滤器。显然 RGB 模式会为您提供那些增加延迟的不需要的过滤器。
    猜你喜欢
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    相关资源
    最近更新 更多