• 締切済み

DirectShowを使ったファイル分割保存

お世話になります。 現在DirectShowを使って、カメラから動画を保存するプログラムを作成しております。 このプログラムは数日単位を動作させる為、画像ファイルをある一定サイズ(時間)で 分割したいと考えております。 単純に考えると、一旦停止した後に別のファイル名で再度キャプチャを開始する事で 分割できると思いますが、その際に一定時間の抜けが発生してしまいそうなので、できる事なら カメラを停止せずに動的に出力ファイルを変更出来れば良いと考えております。 (とりあえず停止⇒再開を試してみようと思い、GeekなページにあるAVI保存コードをベースに、 途中でMediaCtrl::Stop後、一連のCOMオブジェクトを破棄した上で、再度CapGraphBuilderから 構築して別のファイル名で実行させてみましたが、RenderStreamで失敗してしまいました) 上記を行う場合、どの様にするのがよいでしょうか?(調査のきっかけとなるAPI等でも結構です) また、別に良いアイデアがございましたらご教示いただけると助かります。

みんなの回答

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.2

codecにもよると思いますが、多くの動画のフォーマットは数フレーム(区切りはキーフレーム)を一塊で扱いますので単純にStopだと、ほとんどの場合その塊が分断されるのでダメなんじゃないでしょうか。 よくわかってないのですがStopメソッドではなくStopWhenReadyメソッドだとできたりしないでしょうか。

Layle
質問者

補足

wormhole 様 レスありがとうございます。 StopWhenReadyを試してみましたが、症状は変わりませんでした。 ただ、私もよくわかっていませんが、何となくStopよりもStopWhenReadyの方がよさそうな感じですね。 なお、とりあえずファイルを切り替えるだけであれば、以下の手順で出来ました。 1.IMediaControl::Stop() 2.IFileSinkFilter::SetFileNameで名前変更 3.IMediaControl::Run() でも、0.5秒程度の隙間が出来てしまいます。 キャプチャデバイスを2つ付けて交互にキャプチャすることを検討した方が早いのかも知れませんね。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

スレッド使って何とかならんかなぁ.

Layle
質問者

補足

Tacosan さん レスありがとうございます。 現状での一番の問題点としては、保存の途中で出力ファィルを変更する事が出来ていない状態です。 まずはシーケンシャルにキャプチャの準備⇒開始⇒停止⇒破棄⇒キャプチャの準備⇒開始でやろうとしているのですが、どうにもRenderStreamでコケてしまうのです。 (ヘッダ無いを検索するとERROR_INVALID_PARAMETERが戻ってきてるみたいですが、一回目とやり方は同じなんですが…) 最終的には別スレッドで記録開始の前段階まで準備させておいて、出力先の差し替えだけ、みたいに出来たらよいとは思うんですけど、とりあえずは単一スレッドでうまく行かない事には始まらない感じです。

関連するQ&A