2015-03-27 2 views
1

Код функции по назначению (с использованием предварительного просмотра и захвата образца, захвата и сжатия видео в реальном времени). Проблема, которую я пытаюсь разрешить, даже на относительно высокопроизводительной машине, фактическая команда Run() для запуска потоковой передачи видео может занять 4-5 секунд, чтобы выполнить вызвавшую уродливую задержку в моем приложении ... похоже, должно быть я могу ускорить это. Ниже приведен код (минус проверка ошибок, пути отказа и т. Д.):Как ускорить IMediaControl :: Run() при захвате видео с веб-камеры?

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(); 

Любые указатели оценили!

+0

У вас был профиль? –

ответ

1

Временное решение Run обычно связано с задержкой на аппаратное обеспечение (где-то на исходном источнике). Менеджер графического графика и другие фильтры завершают переход времени за долю секунды. Вы, безусловно, можете сделать Pause заблаговременно, и Run может завершиться быстрее (часть задержки переместится на остановленный/приостановленный переход), однако, если для аппаратного обеспечения требуется столько времени, чтобы взлететь, вам, скорее всего, нужно будет заблаговременно запустить захват и пропустить данные в вашей нисходящей цепочке фильтров. Тогда в то время, когда вам нужно начать захват, вы просто прекратите игнорировать поток, и начало захвата будет мгновенным.

Возможно, вы захотите также проверить более простой график. Источник камеры -> Null Renderer и измерьте время выполнения, чтобы подтвердить, что это фильтр источника, который добавляет задержку. Если исходный фильтр запускается быстро, вам нужно будет выделить задержку для конкретного фильтра путем постепенного добавления фильтров к графику.

+0

Небольшое экспериментирование показало, что запрос на захват в RGB24, по-видимому, является виновником по любой причине. Недавно я начал вводить вход YUY2 и заметил, что моя задержка почти исчезла, за исключением одной камеры, которая не представляет YUY2 в своем списке формата. Он поддерживает I420, хотя в следующий раз будет разрешен этот формат, если это разрешит его ... – mark

+0

Независимо от графика фильтра, который вы ели в здании, вам всегда интересно узнать точную топологию, с которой вы заканчиваете: Intelligent Connect может добавлять дополнительные фильтры вы не хотите. По-видимому, режим RGB дает вам те нежелательные фильтры, которые добавляют к задержке. –

Смежные вопросы