2011-01-24 51 views
0

フレームがキーフレームであるかどうかを調べるために、私はIMediaSample :: IsSyncPoint()メソッドをチェックする必要があります。このメソッドは0(S_OK)を返しますフレームはキーフレームです。それ以外の場合はfalseです。IMediaSample :: DirectShow.Netを使用してキーフレームを検索する

しかし、IsSyncPoint()メソッドは、取得され、ISampleGrabberCB :: SampleCB()コールバックメソッドに渡されるすべてのフレームで単に0を返します。私のコールバックが含ま

コードは単純です:

public int SampleCB (double sampleTime, IMediaSample mediaSample) 
    { 
    Console.WriteLine ("SampleCB Callback"); 
    Console.WriteLine (mediaSample.IsSyncPoint () + " "); 

    Marshal.ReleaseComObject (mediaSample); 
    return 0; 
    } 

私はここで何をしないのですか?

答えて

1

メディアの種類は?サンプルグラバーが非圧縮ビデオフレームを受信して​​いる場合、すべてのフレームは同期ポイントです。

+0

私が設定したMediaTypeはRGB24です。そして私はそれがあなたが言っているように非圧縮のフレームを与えると思います。しかし、他のどのMediaTypeを使うことができますか?私は他のタイプを試しましたが、それは仕事をしませんでした。 ああ、私が建てられていたことをグラフである: ビデオソース - >サンプル・グラバー - > VideoRenderer はまた、この中にすべての変更を示唆しています。 –

+0

あなたが圧縮されていないフレームを取得している場合は、すべてのフレームは、同期点で、元の圧縮されたフレームがキーフレームであれば伝えるために(その時点で)方法はありません。 (IsSyncPointメソッドは厳密にキーフレームをテストするのではなく、シンクポイントをテストします。圧縮されたビデオの場合、シンクポイントはキーフレームです)。したがって、キーフレームを見つける必要がある理由によって異なります。あなたは非圧縮ビデオ*を取得し、*キーフレームをチェックする必要がある場合は、デコーダの上流にパススルーフィルタが必要になる場合があります。 –

関連する問題