2011-02-17 32 views
1

私はDirectShowアプリケーションの作業を続けており、仕上げのタッチをしています。プログラムがやっていることは、1秒間隔でビデオファイルを調べて、現在のバッファをsamplegrabberからキャプチャし、処理することです。しかし、テストで重複した画像が表示されていることに気づいていましたが、DirectShowはその1秒間隔でビデオを十分に速くインクリメントしていませんでした。私の質問は、現在のフレームを取得して処理するためにDirectShowがsamplegrabberを呼び出す準備ができているかどうかをチェックする方法があるかどうかです。現時点では、私は1秒間睡眠を呼びますが、より良い方法が必要です。事前にお手伝いいただきありがとうございます。DirectShowでサンプルグラバーがいつ準備完了になったかを調べる

EDIT

は、私は、ビデオの位置は、私が取得し、プロセスしたいと思います次の位置に等しいかどうかを確認するためのチェックを実行してみました。それは重複したフレームの数を減らしましたが、私はまだそれらが塊で現れるのを見ています。

答えて

0

メインフレームのアプリケーションスレッドでは、DSフレームワークが処理速度: を処理し、サンプルグラバーコールバックを設定してからコールバックがトリガーされると、メディアサンプルとサンプル時間が取得されます。適切な間隔、すなわち1秒が経過した場合にサンプルを処理することができる。

あなたは1秒間スリープ状態になり、どこから(どのスレッド)呼び出すのですか? コールバックの内部からこれを行う場合、DirectShowパイプラインを効果的にブロックしていますか?おそらく、あなたの設定をより詳細に説明できるなら、私はもっと役に立つかもしれません。

/// Callback that is triggered per media sample 
/// Note this all happens in the DirectShow streaming thread! 
STDMETHODIMP SampleCB(double dSampleTime, IMediaSample * pSample) 
{ 
    // check timestamp and if one second has elapsed process sample accordingly 
    // else do nothing 

    ... 

    // Get byte pointer 
    BYTE* pbData(NULL); 
    HRESULT hr = pSample->GetPointer(&pbData); 
    if (FAILED(hr)) 
    { 
    return hr; 
    } 

    ... 
} 

P.Sできるだけ早くサンプルを処理する場合は、コールバックでサンプルのタイムスタンプをNULLに設定できます。

// set time to NULL to allow for fast rendering since the 
    // the video renderer controls the rendering rate according 
    // to the timestamps 
    pSample->SetTime(NULL, NULL); 
+0

私は現在、サンプルグラバーからデータを取得して準備が整っていて、そこから処理しているだけなので、コールバック関数を設定していません。私はオンラインで見て、IMediaSampleクラスの使い方に関する非常に限られたリソースを見ました。私は返されている "E_NOINTERFACE"ハンドルでグラフのインターフェイスを照会しようとしました。 – Seb

+0

私のDirectShowの経験では、これを行う「正しい」方法は、サンプルグラバーコールバックによるものです。グラフを通過するすべてのサンプルを通知することによって、各サンプルで何をすべきかを完全に制御できます。 IMediaSampleインターフェイスについては、それほど多くはありません。上記のコードセクションで示されているようにメディアサンプルバッファを取得して処理/保存できるだけです。 IMediaSampleインターフェイスのグラフを照会することはできません。 IMediaSampleは、メディアサンプルのコンテナであり、DSグラフ(つまり、フィルタからフィルタ)に渡されます。 – Ralf

+0

Samplegrabberからのコールバックを取得するためにコードをリファクタリングした後、すべてが完璧に機能します。私は睡眠の呼び出しを削除し、重複した画像なしで巨大なパフォーマンスの向上を得ることができました。ご協力ありがとうございました。 – Seb

0

グラフタイマーをNULLに設定してみてください。できるだけ速く

  • プロセスファイル
  • はあなたが持っている問題をあなたに緩和されます:それはすることができます。

もちろん、ファイルを同時に画面にレンダリングする場合は機能しません。

+0

私はすべての場所を検索しましたが、グラフタイマーには何も見つかりませんでした。あなたはさらに詳しく説明してください。 – Seb

+0

グラフクロックを設定するには、http://msdn.microsoftを参照してください。com/ja-jp/library/dd377588(v = vs.85).aspx。これは基本的に、私が説明したように、メディアサンプルのタイムスタンプをNULLに設定するのと同じ効果があります。ただし、このアプローチが有効かどうかはわかりません。サンプルグラバーでコールバックを設定せず、グラフをできるだけ早く実行すると、適切な間隔でサンプルをどのように取得するのでしょうか? – Ralf

+0

サンプルコールバックでは、すべてのサンプルにメディア時間に対応するタイムスタンプがあります。 http://msdn.microsoft.com/en-us/library/dd376985(v=vs.85).aspx - ISampleGrabberCBメソッドをチェックし、両方ともSampleTimeという最初のパラメータを持っています –

関連する問題