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;
}
私はここで何をしないのですか?
私が設定したMediaTypeはRGB24です。そして私はそれがあなたが言っているように非圧縮のフレームを与えると思います。しかし、他のどのMediaTypeを使うことができますか?私は他のタイプを試しましたが、それは仕事をしませんでした。 ああ、私が建てられていたことをグラフである: ビデオソース - >サンプル・グラバー - > VideoRenderer はまた、この中にすべての変更を示唆しています。 –
あなたが圧縮されていないフレームを取得している場合は、すべてのフレームは、同期点で、元の圧縮されたフレームがキーフレームであれば伝えるために(その時点で)方法はありません。 (IsSyncPointメソッドは厳密にキーフレームをテストするのではなく、シンクポイントをテストします。圧縮されたビデオの場合、シンクポイントはキーフレームです)。したがって、キーフレームを見つける必要がある理由によって異なります。あなたは非圧縮ビデオ*を取得し、*キーフレームをチェックする必要がある場合は、デコーダの上流にパススルーフィルタが必要になる場合があります。 –