掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
DirectShow。ISampleGrabberでのイメージ取得 (ID:59580)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
DirectShowのSampleGrabber、NullRendererを用いて動画の1フレーム目のイメージを 取得したいと思っています。 そこで以下のような処理を組んだのですが、ソースのメディアタイプがRGB24以外の場合 ピンの接続で失敗します。(指定したメディアタイプと異なるので当然なのでしょうが) そこで、仮として AM_MEDIA_TYPE の設定値をGraphEditerで該当ファイルを読み込み 調べた値に変更したりしてみたのですが、それでもピンの接続に失敗します。 下記の処理をDirectShowで読み込み可能な全ての動画に対応させるにはどのような修正 を加えればよろしいでしょうか。 現状はAVI、MPG形式のファイルはイメージを取得できたのですが、ASF、WMVファイルは ピンの接続で失敗しています。 よろしくお願いします。 WinXP VC++6.0 sp6 MFC ------------------------------- { CComPtr<IGraphBuilder> pGraph; pGraph.CoCreateInstance(CLSID_FilterGraph); // ソースフィルタを追加 CComPtr<IBaseFilter> pSourceF; // std::wstring stFilepath_ にファイルパスが入っている pGraph->AddSourceFilter(stFilepath_.c_str(), L"Source", &pSourceF); // サンプルグラバフィルタを作成 CComPtr<IBaseFilter> pGrabberF; pGrabberF.CoCreateInstance(CLSID_SampleGrabber); // 取得イメージの形式を指定 CComQIPtr<ISampleGrabber, &IID_ISampleGrabber> qipGrabber(pGrabberF); AM_MEDIA_TYPE obmt; memset(&obmt, 0x00, sizeof(obmt)); obmt.majortype = MEDIATYPE_Video; obmt.subtype = MEDIASUBTYPE_RGB24; obmt.formattype = FORMAT_VideoInfo; qipGrabber->SetMediaType(&obmt); // サンプルグラバフィルタを追加 pGraph->AddFilter(pGrabberF, L"Sample Grabber"); // ソースフィルタからサンプルグラバフィルタへピン接続 CComPtr<IPin> pOutpin(GetPin(pSourceF, PINDIR_OUTPUT)); CComPtr<IPin> pInpin(GetPin(pGrabberF, PINDIR_INPUT)); if (FAILED(pGraph->Connect(pOutpin, pInpin))) { // ここで失敗します return false; } // NULLレンダリングフィルタを作成・サンプルグラバフィルタに接続 // イメージ取得 : } IPin* GetPin(IBaseFilter* pFilter, PIN_DIRECTION direct) { CComPtr<IEnumPins> pEnumpins; pFilter->EnumPins(&pEnumpins); IPin* pPin; PIN_DIRECTION pd; while (SUCCEEDED(pEnumpins->Next(1, &pPin, 0))) { if (SUCCEEDED(pPin->QueryDirection(&pd)) && pd == direct) { return pPin; } pPin->Release(); } return NULL; }
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.