0

directshow がどのように機能するかを説明しているインターネットで、この素敵な例を見つけました。

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

この例では、2 つのサンプルグラバーがあります。1 つは NON-RGB グラバーと呼ばれ、もう 1 つは RGB グラバーと呼ばれます。

最初のもの: (NON-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 

2番目: (RGB)

#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」バージョンでのみ使用されます。しかし、私は疑問に思います。MSDN ページでは、setmediatype() が、サンプル グラバー フィルターの入力ピンで使用できるデータの種類を示していると書かれています。また、メディア タイプを設定せずにサンプル グラバーを使用できるのであれば、なぜそれを何かに設定する必要があるのでしょうか?

質問:

サンプル グラバーは、何らかの種類のメディア変換を行いますか?

サンプル グラバーのメディア タイプを設定する必要があるのはなぜですか?

カムのメディア タイプが MJPG に設定されていて、サンプルグラバーでメディア タイプを RGB24 に設定すると、どうなりますか?

あるものを別のものと使用することで、パフォーマンスに違いはありますか? ソフトウェアのパフォーマンス (fps) を向上させるには、サンプル グラバーの 1 つを削除する必要がありますか?

ありがとう!

4

1 に答える 1

3

Sample Grabber Filter は変換を行いません。これが、個々のフォーマット固有を意識することなく、ビデオとオーディオを含むさまざまなフォーマットを柔軟に受け入れる理由です。

Sample Grabber でメディア タイプを設定すると、このタイプのみを使用するように強制されます。このタイプのみを受け入れ、他のタイプを拒否します。Intelligent Connectと共に、これは DirectShow が要求された形式に変換するための追加のフィルターを提供するような方法で機能します (可能であれば)。24 ビット RGB は一種の「ユニバーサルな非圧縮ビデオ フォーマット」であるため、通常は 24 ビット RGB で可能です。これが、メディア タイプを 24 ビット RGB に設定しても安全であると同時に、ほぼすべての圧縮ビデオ フォーマットで失敗する理由です (ソースが完全に一致するものを提供できない場合)。

Intelligent Connect が追加の変換フィルターを提供する場合、それらは Sample Grabber の内部ではなくアップストリームに接続されることに注意してください。

于 2013-05-16T15:47:59.077 に答える