1

私は現在、directshow ライブラリを使用して小さなプログラムに取り組んでいます。とりわけ、このプログラムは、コンピュータに接続された任意のカメラを選択してストリームを記録できるはずです。私の問題は、メモリ dshow フィルターを解放する方法がわからないことです。例を挙げましょう:

たとえば、出力ファイル名を設定したい場合、次のように AVI Mux フィルターを作成する必要があります。

IBaseFilter * aviMux;
bGraph->SetOutputFileName(
    &MEDIASUBTYPE_Avi,   
    L"example.avi",  
    &aviMux,       
    NULL);  

ファイル名を変更して SetOutputFileName() 関数を再度使用したいのですが、メモリ AVI Mux を解放する方法はありますか (ちなみに、この関数は FileWriter フィルターも作成しますが、これも解放したいと思います)。私にできることは次のとおりです。

aviMux->Release();
fGraph->RemoveFilter(aviMux);

しかし、プログラムが終了する前にメモリは解放されますか? 私はこのようなことをしたいと思います:

delete aviMux;

しかし、それは明らかにエラーです。回答とヘルプのアドバイスに感謝します..

4

1 に答える 1

2

標準の COM ルールが適用されます。

  • インターフェイス ポインターはもう必要ありません。IUnkonwn::Release
  • フィルタ グラフ アクティビティを明示的に停止したい場合はIGraphBuilder::Stop、フィルタを停止します。
  • グラフ、フィルター、およびそれらのインターフェイスに対して保持しているすべてのインターフェイス ポインターを解放するとすぐに、基になるすべてのリソースが自動的に解放されます。

信頼性を高めるために、停止したグラフからすべてのフィルターを明示的に削除することも検討できます (これにより、内部的にピンの切断が強制されます)。

特にフィルタ グラフをキャプチャするために、ファイル名を変更することは、新しいグラフを最初から作成することとほぼ同じ複雑さです。つまり、停止、完全なクリーンアップ、新しいグラフ、新しいファイルへの新しいキャプチャの開始です。フィルターの再利用は可能ですが (IFileSinkFilter::SetFileName停止したフィルター グラフに既に追加されているフィルター ライターで使用)、ファイルの切り替えを目に見える速度で高速化することはほとんどありません。とにかく、一定の遅延が発生します。

シームレスなファイル切り替えには、キャプチャ グラフと書き込みグラフの 2 つのグラフが必要です。そして、橋渡しのような両者のコミュニケーション。

于 2013-07-05T12:09:41.720 に答える