USBカメラを使ってキャプチャした動画を、圧縮してファイルに保存するクラスを先週作ったので、そのクラスを使用したアプリケーションを納品前にテスト用のPCにインストールして試してみたところ、実行時にエラーになってしまった。
最初はDirectShowのランタイムや.NET Frameworkの最新版が入っていないからだろうと軽く考えていたのだが、そのへんをインストールして試してみても結果は同じ。おやぁ?
でも開発環境の入っている他のPCでは何の問題も無く動いてしまう。
デバッグする為にはテスト用のPCにも開発環境を入れる必要があるが、そうすると動くようになってしまう可能性が高い。でもそれでは何の解決にもならないし、動作環境としてVisualStudio 2005のインストールが必須なんて言ったら殴られる(笑)。
そこでアプリケーションがフィルタグラフを構築した時に、その情報をファイルに出力する関数をアプリケーションに追加してみた。
HRESULT CCapture::SaveGraphFile(IGraphBuilder *pGraph, WCHAR *wszPath)
{
const WCHAR wszStreamName[] = L"ActiveMovieGraph";
HRESULT hr;
IStorage *pStorage = NULL;
hr = StgCreateDocfile(
wszPath,
STGM_CREATE | STGM_TRANSACTED | STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
0, &pStorage);
if(FAILED(hr))
{
return hr;
}
IStream *pStream;
hr = pStorage->CreateStream(
wszStreamName,
STGM_WRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE,
0, 0, &pStream);
if (FAILED(hr))
{
pStorage->Release();
return hr;
}
IPersistStream *pPersist = NULL;
pGraph->QueryInterface(IID_IPersistStream, reinterpret_cast<void**>(&pPersist));
hr = pPersist->Save(pStream, TRUE);
pStream->Release();
pPersist->Release();
if (SUCCEEDED(hr))
{
hr = pStorage->Commit(STGC_DEFAULT);
}
pStorage->Release();
return hr;
}
これでGraphEditorで読み込める形式のフィルタグラフ定義ファイルができあがる。
これをエラーの発生するPC上のGraphEditorで読み込ませてみると、フィルタがつながらない状態でバラバラのままで読み込まれてしまった。開発環境の入っているPCではつながるはずのフィルタが、そうでないPCではやはりちゃんとつながってくれない。
バラバラに読み込まれたフィルタを改めて手動でつないでやると、ちょっと意外な結果に。
ビデオキャプチャデバイスのプレビュー出力からレンダラへつなげようとしたら、その中間に自動的にColor Space Converterフィルタが挿入されたのだ。その状態で最後までフィルタをつないでやると、GraphEditor上ではちゃんとキャプチャして圧縮もできるようになる。
今度はキャプチャクラスでも同じようにColor Space Converterをグラフに追加して、こんなふうに変えてみた。
旧
// プレビューピン接続
hResult = m_pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Video, m_pSrc, NULL, m_pVideoRenderer);
新
// プレビューピン接続
hResult = m_pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Video, m_pSrc, m_pColour, m_pVideoRenderer);
RenderStreamでフィルタをつなぐときに、以前は中間フィルタを通さずにレンダラへつなげていたのを、Color Space Converterフィルタを通すように変えてみたところ、テスト用のPCでもきちんと動作するようになった。
動くようになったのは良いんだけど、実行時にエラーが発生していたのはキャプチャーピンの接続なのに、プレビューピンの接続側にフィルタを追加すると動くって、どうも納得がいかない。
それ以前に開発環境が入っているPCでは全く問題無かったのに、入ってないPCではフィルタを追加しないとダメってどういう事?
何が悪かったのかは今持って分からずじまい。DirectShow関係はやっぱり鬼門だという事だけはハッキリした(笑)。今は過渡期でちぐはぐになっている感もあるから、あと数年もすれば一本化されてもっと楽に使えるようになってるんだろうけどね。というかそうなってくれないと困る。
更にカオスになっている可能性も否定できませんが(笑)。
このページは xfy Blog Editor を利用して作成されました。
最近のコメント