none
DirectShowでAVIファイルからの動画切り出し RRS feed

  • 質問

  • VisualSudio2005とVC++でDirectShowを使用して、Vista用のAVIファイルビューアーアプリを作成しています。
    DirectShow操作部分はアンマネージコードで作成し、マネージコード(混在)でラップクラスを作りフォームから利用しています。

    AVIファイルを読み込み、再生、一時停止、シーク等の操作は出来るのですが、録画(動画をファイルに切り出し)がうまく出来ません。

    操作は、
    ①ファイル読み込み
    ②再生
    ③切り出し開始位置で一時停止
    ④録画開始
    ⑤続きを再生
    ⑥切り出し位置まできたら録画終了

    で、出来上がったファイルは③の画面で見ている位置から後にずれた位置からになってしまいます。
    また、画像無しのファイルや壊れたファイルになってしまうこともあります。

    Graphは、再生時
     ソース→AVI Splitter→MPEG4 Decompressor→Infinite Tee1(Pin01)→Smart Tee→VMR9
                   →MP3 Decompressor→Infinite Tee2(Pin01)→Audio Render

    録画時に
     Infinite Tee1(Pin02)→AVI MUX→FileWriter
     Infinite Tee2(Pin02)→↑
    です。

    録画時には、GraphをStopしてSeekし、Infinite Teeの接続していない方のピン(Pin02)にRenderStreamでAVI MUXを接続しています。

    時間指定でSeekしてみたり、フレーム指定でSeekしてみたりしても、指定した開始位置でのファイル書き出しができていません。

    ネットでTipを探し回り2ヶ月・・
    そもそも、DirectShowではこのようなことは出来ないのでしょうか?

    同様の処理を行った方がいらっしゃっいましたらご教授お願いします。

    2009年4月15日 12:13

回答

  • ご所望の動作と異なるかも知れませんが、
    再生と録画を別々に行なうのはいかがでしょうか。
    つまり、録画範囲を決定したあとで、
    ファイルへの記録を開始する、みたいな。
    virtual void
    • 回答としてマーク mon mon 2009年5月20日 17:42
    2009年4月17日 2:59

すべての返信

  • あんまり詳しくないのですが、"編集"といった方面には、DirectShow編集サービスが使えないのでしょうか。
    http://msdn.microsoft.com/ja-jp/library/cc353904.aspx
    http://msdn.microsoft.com/ja-jp/library/dd148668.aspx

    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年4月15日 14:31
    モデレータ
  • ③切り出し開始位置で一時停止
    これは、IMediaControl::Pause() で一時停止しているのでしょうか?
    もしそうなら、IMediaControl::Stop() を試してみてください。

    2009年4月16日 3:02
  • 返答ありがとうございます。

    やはりDirectShow編集サービスですか。

    当初、MSDNヘルプで目にしたのですが、輝度調整をオリジナルフィルターで行うためGraphBuilderを使用する方式を選択しました。

    DirectShow編集サービスで輝度調整もできるようなので、検討してみます。
    2009年4月16日 14:28
  • 返答ありがとうございます。

    ファイル出力フィルター(AVI MUX)を接続する関係で、Graphを停止する必要があるため、IMediaControl::Stop() を使っています。

    関係しているメソッドでPause、Stop、Seek、Run、StopWhenReady、GetCurrentPosition、SetCurrentPositionの順番を変えて試してますが、結果変わらずです。

    DirectShow編集サービスも検討しつつ、もう少し奮闘してみます。

    何か情報がありましたらよろしくお願いします。

    • 回答としてマーク mon mon 2009年5月20日 17:41
    • 回答としてマークされていない mon mon 2009年5月20日 17:41
    2009年4月16日 14:39
  • ご所望の動作と異なるかも知れませんが、
    再生と録画を別々に行なうのはいかがでしょうか。
    つまり、録画範囲を決定したあとで、
    ファイルへの記録を開始する、みたいな。
    virtual void
    • 回答としてマーク mon mon 2009年5月20日 17:42
    2009年4月17日 2:59
  • 返信ありがとうございます。

    再生しながらの録画は断念し、再生と録画を別処理にしました。

    録画開始位置が合わないのはもとより、エンコード処理によりスロー再生になってしまうため使いづらくなってしまうので。

    録画開始位置がズレる問題は、一時停止時に画面に再描画(シーク&Run)することで解決しました。

    画面が遅れて表示されているため、フレームが飛んだように見えてしまいますが、見ている位置から録画できてるので良しということで。。

    アドバイスありがとうございました。

    2009年5月20日 17:55