none
directShowによる特定フレームの画像切り出し RRS feed

  • 質問

  •  

    初投稿です。何かしら投稿ミスがありましたら、ごめんなさい。

     

     directShowに関する質問です。
     現在、動画から指定した時間単位で画像を取得するプログラムを組んでいるのですが、
     ある部分でsleep()を挿まないとうまく動作ができない状況です。
     本来ならば、ステータス等を参照し取得できる状態になるまで待機させておきたいのですが、
     その待機させる機能がうまく動作できていないのです。
     これが単純に、全くその方法が機能していないというわけではないので、更に頭を悩ませています。
     
     ①
     //##################################################
     ↓ 下記方法だと mpeg1 は問題ないが mpeg2 だと GetCurrentBuffer で VFW_E_WRONG_STATE が返ってきてしまう
        StopWhenReady() を stop() に変更しても同様
     //--------------------------
     // [指定位置へ seek]
     if( S_OK != pMediaSeek->SetPositions(&timePos, AM_SEEKING_AbsolutePositioning, &timePos, AM_SEEKING_AbsolutePositioning) ){
      printf("seek_error\n");
     }
     pMediaControl->StopWhenReady();
     OAFilterState state;
     pMediaControl->GetState(INFINITE, &state); 
     //--------------------------
     
     /* [現在表示されている映像を静止画として横取り] */
     long nBufferSize = imgWidth * imgHeight * 3;
     HRESULT hr = pSampleGrabber->GetCurrentBuffer(&nBufferSize, (long *)(rgbImg));
     //##################################################
     
     ②
     //##################################################
     ↓ 下記方法だと mpeg2 でも画像が取り出せるが sleep処理のため最低限の処理時間で実行することが出来ない、確実性に欠ける
        本来は sleep() の部分をステータス参照による待機にしておきたい
     //--------------------------
     pMediaControl->Run();
     if( S_OK != pMediaSeek->SetPositions(&timePos, AM_SEEKING_AbsolutePositioning, NULL, AM_SEEKING_NoPositioning) ){
      printf("seek_error\n");
     }
     pMediaControl->Pause();
     Sleep(1000);
     //--------------------------
     
     /* [現在表示されている映像を静止画として横取り] */
     long nBufferSize = imgWidth * imgHeight * 3;
     HRESULT hr = pSampleGrabber->GetCurrentBuffer(&nBufferSize, (long *)(rgbImg));
     //##################################################
     

    何とか、sleep() を使わないで済ますようにはできないでしょうか。

    2007年8月29日 23:06