2013-05-16 1 views
0

Я нашел этот хороший пример в Интернете, объясняя, как работает directshow.может ISampleGrabber конвертировать видеоролики в определенный mediaType?

http://alax.info/trac/public/browser/trunk/Utilities/SetLifeCamStudioResolutionSample/SetLifeCamStudioResolutionSample.cpp

В этом примере есть две samplegrabbers. Один называется NON-RGB grabber, а один называется RGB-grabber.

Первый из них: (НЕ RGB)

#pragma region Non-RGB Sample Grabber 
     { 
      CComPtr<IBaseFilter> pBaseFilter; 
      ATLENSURE_SUCCEEDED(pBaseFilter.CoCreateInstance(__uuidof(SampleGrabber))); 
      ATLENSURE_SUCCEEDED(pFilterGraph->AddFilter(pBaseFilter, L"Non-RGB Sample Grabber")); // This will connect in MJPG format 
      const CComQIPtr<ISampleGrabber> pSampleGrabber = pBaseFilter; 
      ATLASSERT(pSampleGrabber); 
#if TRUE 
      // NOTE: IFilterGraph::Connect would do just fine, but with a real capture device, if we prefer having Smart Tee added, we need to use 
      //  Capture Graph Builder (only here) 
      CComPtr<ICaptureGraphBuilder2> pCaptureGraphBuilder; 
      ATLENSURE_SUCCEEDED(pCaptureGraphBuilder.CoCreateInstance(CLSID_CaptureGraphBuilder2)); 
      ATLENSURE_SUCCEEDED(pCaptureGraphBuilder->SetFiltergraph(pFilterGraph)); 
      ATLENSURE_SUCCEEDED(pCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, NULL, pCurrentOutputPin, NULL, pBaseFilter)); 
#else 
      ATLENSURE_SUCCEEDED(pFilterGraph->Connect(pCurrentOutputPin, GetPin(pBaseFilter, 0))); 
#endif 
      MessageBox(GetActiveWindow(), _T("After Non-RGB Sample Grabber Connected"), _T("Debug"), MB_OK); 
      pCurrentOutputPin = GetPin(pBaseFilter, 1); 
     } 
     #pragma endregion 

второй:

#pragma region RGB Sample Grabber 
     { 
      CComPtr<IBaseFilter> pBaseFilter; 
      ATLENSURE_SUCCEEDED(pBaseFilter.CoCreateInstance(__uuidof(SampleGrabber))); 
      ATLENSURE_SUCCEEDED(pFilterGraph->AddFilter(pBaseFilter, L"RGB Sample Grabber")); 
      const CComQIPtr<ISampleGrabber> pSampleGrabber = pBaseFilter; 
      ATLASSERT(pSampleGrabber); 
      AM_MEDIA_TYPE MediaType; 
      ZeroMemory(&MediaType, sizeof MediaType); 
      MediaType.majortype = MEDIATYPE_Video; 
      MediaType.subtype = MEDIASUBTYPE_RGB24; 
      ATLENSURE_SUCCEEDED(pSampleGrabber->SetMediaType(&MediaType)); 
      ATLENSURE_SUCCEEDED(pFilterGraph->Connect(pCurrentOutputPin, GetPin(pBaseFilter, 0))); 
      MessageBox(GetActiveWindow(), _T("After RGB Sample Grabber Connected"), _T("Debug"), MB_OK); 
      pCurrentOutputPin = GetPin(pBaseFilter, 1); 
     } 
     #pragma endregion 

"setmediatype()" метод (RGB) используется только в версии "RGB". Но я удивляюсь. На странице MSDN говорится, что setmediatype() указывает, какой тип данных можно найти во входном штыре фильтра захвата образца. И если можно использовать образец grabber, не задавая тип носителя, зачем мне его устанавливать?

Вопросы:

ли образец граббер сделать любой тип медиа преобразования?

Почему я должен установить тип носителя для захвата образца?

Если формат медиакамеры установлен в MJPG, и я установил тип носителя в RGB24 в samplegrabber, что происходит?

Может ли быть разница в производительности при использовании одного над другим? Чтобы повысить производительность (fps) программного обеспечения, следует ли удалить один из захватчиков образцов?

Спасибо!

ответ

3

Образец Grabber Filter не производит никакого преобразования. Именно поэтому гибко принимать различные форматы, видео и аудио, не учитывая индивидуальный формат.

Когда вы устанавливаете тип носителя в Sample Grabber, вы вынуждаете его использовать этот тип только. Принимать только этот тип и отвергать другие. Вместе с Intelligent Connect это работает таким образом, что DirectShow может предоставить дополнительные фильтры для преобразования в запрошенный формат, если это возможно. Обычно это возможно с 24-битным RGB, потому что это своего рода «универсальный несжатый видеоформат». Вот почему безопасно устанавливать тип носителя в 24-разрядный RGB и в то же время он будет терпеть неудачу практически с любым сжатым видеоформатом (если только источник уже не может обеспечить точно совпадение).

Обратите внимание, что если Intelligent Connect снабжает дополнительными фильтрами преобразования, они подключаются вверх по пути к Sample Grabber, а не внутри него.

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

  • Нет связанных вопросов^_^