none
[DirectShow]IAMVideoCompressionのQueryInterfaceに失敗する、put_Quelityなどに失敗する RRS feed

  • 質問

  • こんばんわ。初めて投稿させていただきます。

    現在、DirectShowと.NETを使って、SkypeのようなWebカメラの映像をやりとりするアプリケーションを作っています。
    そこで取得した映像を圧縮する機能をつけたいのですが、うまくいかず困っています。
    MJPEGフィルタを生成し、put_Quality関数を使って値を設定しようとしたのですが、put_Quality関数を使っている箇所で「オブジェクト参照がオブジェクト インスタンスに設定されていません。」と表示されて処理が中断されてしまいます。get_Qualityなどでも同じ結果でした。
    調べると、直前のQueryInterfaceは失敗していました。
    どうすれば解決できるでしょうか?

    その部分のソースコードはこのようになっています。

    	//圧縮フィルタの追加
    	//pDevEnum = NULL;
    	//CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (void **)&pDevEnum);
    	
    	IEnumMoniker *pClassEnumCmp = NULL;
    	pDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pClassEnumCmp, 0);
    
    
    	IBaseFilter *pFCmp = NULL;
    	hr = CoCreateInstance(CLSID_MJPGEnc, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (LPVOID *)&pFCmp);
    	if(FAILED(hr)){ Debug::WriteLine("Failed:CoCreateInstance"); }
    	else{ Debug::WriteLine("Succeeded:CoCoreateInstance"); }
    
    
    	IAMVideoCompression *pMje;
    	hr = pFCmp->QueryInterface(IID_IAMVideoCompression, (void **)&pMje);
    	if(FAILED(hr)){ Debug::WriteLine("Failed:Query"); }
    	else{ Debug::WriteLine("Succeeded:Query"); }
    
    	hr = pGraph->AddFilter(pFCmp, L"MJPEGCmp");
    	if(FAILED(hr)){ Debug::WriteLine("Failed:AddFilter"); }
    	else{ Debug::WriteLine("Succeeded:AddFilter"); }
    
    	//pMje->put_Quality(0.2);
    
    色々調べてみたのですが、フィルタを実体化するのにSystemDeviceEnumeratorを使う方法もあるとMSDNに書いてありました。でもそのやり方はわかりませんでした。

    回答お待ちしています。どうかよろしくお願い致します。

    2011年11月15日 16:58

回答

  • 「CLSID_MJPGEnc」で Google 検索。
    検索結果から MSDN のページ を見る。
    フィルターそのものに実装されているインターフェースとして列挙されている IBaseFilter のリンクを開く。
    ピンの列挙と書かれている EnumPins を開く。
    ピンの列挙」を見ろというリンクがあるので開く。
    ピンの列挙の途上で方向を知ることができるので、出力ピンを得られるはず。

    といった探し方をしました。
    ただ、私自身は DirectShow を少しかじっていたこともあるので、どういったものが存在するかを知った上で探しているので、同じ発想で探すのは難しいかもしれませんね。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年11月17日 13:49
    モデレータ
  • またまたお返事ありがとうございます。
    なんと結果的にちゃんと圧縮できました!本当にありがとうございます!

    IAMVideoCompressionというのはピンでサポートすべきインターフェースだったようですね。というか、QueryInterface関数がIPinにもあったんですね…知りませんでした。
    ありがとうございました!

    2011年11月17日 15:43

すべての返信

  • 「CLSID_MJPGEnc IAMVideoCompression」で検索しました。
    http://social.msdn.microsoft.com/Forums/en-NZ/vcmfcatl/thread/2d8d6b58-9ad3-4ff2-b96b-09dfc2c94675

    ここに書いてある内容が該当するのではないでしょうか。
    (IAMVideoCompression is implemented on the output pin, not on the filter.You need to fetch the output pin first.)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年11月15日 22:07
    モデレータ
  • お返事ありがとうございます。

    リンク先の情報を見てみましたが、確かに投稿者は同様な問題を解決しているようですね。
    ただご指定の該当部分のピンのフェッチというのがわかりません。検索などで調べてみましたが、なぜかそういった関数なんかはヒットしませんでした。(検索の仕方が悪いのでしょうか…)

    申し訳ありませんが、よろしかったら教えていただけないでしょうか?

    2011年11月17日 9:30
  • 「CLSID_MJPGEnc」で Google 検索。
    検索結果から MSDN のページ を見る。
    フィルターそのものに実装されているインターフェースとして列挙されている IBaseFilter のリンクを開く。
    ピンの列挙と書かれている EnumPins を開く。
    ピンの列挙」を見ろというリンクがあるので開く。
    ピンの列挙の途上で方向を知ることができるので、出力ピンを得られるはず。

    といった探し方をしました。
    ただ、私自身は DirectShow を少しかじっていたこともあるので、どういったものが存在するかを知った上で探しているので、同じ発想で探すのは難しいかもしれませんね。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年11月17日 13:49
    モデレータ
  • またまたお返事ありがとうございます。
    なんと結果的にちゃんと圧縮できました!本当にありがとうございます!

    IAMVideoCompressionというのはピンでサポートすべきインターフェースだったようですね。というか、QueryInterface関数がIPinにもあったんですね…知りませんでした。
    ありがとうございました!

    2011年11月17日 15:43