1

DirectShow アプリケーションの作業を続けており、最後の仕上げを行っています。プログラムが行っていることは、1 秒間隔でビデオ ファイルを調べ、サンプルグラバーから現在のバッファーをキャプチャし、次に進む前に処理することです。ただし、テストで画像が重複していることに気付き、DirectShow がその 1 秒間隔でビデオを十分に速くインクリメントしていないことがわかりました。私の質問は、現在のフレームを取得して処理するために、DirectShow がサンプルグラバーを呼び出す準備ができているかどうかを確認する方法があるかどうかです。現時点では、スリープを 1 秒間呼び出しますが、より良い方法が必要です。助けてくれてありがとう。

編集

ビデオの位置が、取得して処理したい次の位置と等しいかどうかを確認するためのチェックを実行しようとしました。これにより、重複するフレームの数は減りましたが、まだチャンクで表示されています。

4

2 に答える 2

0

グラフ タイマーを NULL に設定してみてください。次のことが可能になります。

  • ファイルをできるだけ速く処理する
  • あなたの抱えている問題を解消します。

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

于 2011-02-17T17:13:58.463 に答える
0

私は常に DS フレームワークに処理レートを処理させます: メイン アプリケーション スレッドで、サンプル グラバー コールバックを構成し、コールバックがトリガーされると、メディア サンプルとサンプル時間を取得します: この時点で、次の場合にサンプルを処理できます。適切な間隔、つまり 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;
  }

  ...
}

PS サンプルをできるだけ速く処理したい場合は、コールバックでサンプルのタイムスタンプを 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);
于 2011-02-17T16:55:39.307 に答える