- PR -

DirectShowでの動画保存について

1
投稿者投稿内容
tora
会議室デビュー日: 2007/09/19
投稿数: 4
投稿日時: 2007-09-19 09:58
いつも参考にさせて頂いております。
初投稿させて頂きます。

現在、PCに接続したWebカメラの映像を、Directshowを使用して
動画ファイルに保存、及び任意のタイミングでのキャプチャー画像を取得するツールを作成しております。

動画の保存と、キャプチャー画像取得は、それぞれ行うことはできるのですが、
動画を保存しながら、任意のタイミングでのキャプチャー画像を取得し、保存する
ということは可能なのでしょうか?

ご存知の方は、ご教授ください、宜しくお願い致します。
はるとパパ
会議室デビュー日: 2004/08/27
投稿数: 3
投稿日時: 2007-09-19 12:09
試したことはないですが、
Smart Teeフィルタを使用すればできると思います。
tora
会議室デビュー日: 2007/09/19
投稿数: 4
投稿日時: 2007-09-20 09:08
はるとパパさん、返信ありがとうございます。

Smart Teeフィルタは、初めて聞きました。
まずは調査してみようと思います。

もし参考になるサンプルやURLをご存知であれば、
ご教授ください、宜しくお願い致します。

ありがとうございました。
手机
会議室デビュー日: 2004/04/07
投稿数: 2
投稿日時: 2007-09-21 10:52
おそレスですが投稿します

はるとパパさんもお書きになっていますが私はこのように実装したことがあります。
・SmartTee・AVIMux・FileWriterフィルタを利用して動画の保存をさせました。
・SmartTeeのCaptureピンにはAVIMux→FileWriterフィルタを、PrevピンにはVideoRendererフィルタを接続しました。
・VideoRendererとしてはVMR9を使いました。

そこで今回のご質問内容の実現方法です。
・常時動画の保存を行わず、ボタンのクリックなどでイベントドリブンにする場合
 ・SmartTeeのCaptureピン側には普段は何も接続しません。
 ・動画の保存イベントが来た時点で一旦再生を止めてCaptureピンにAVIMux・FileWriterを順番で手動接続して行きます。
 ・動画保存の停止イベントが来たら再度再生を一時停止し、Captureピンの接続を手動で切断します。
・常時動画の保存を行う場合
 ・最初のGraphBuilderでの接続の際にそのままSmartTeeのCaptureピンを手動で接続するようにルーチンを組んでください。
 
余談ですが、GraphBuilderに各フィルタの接続を自動にさせずに手動でピン接続したのは、たまに予期しない形でフィルタを接続される場合があるからです。
またCaptureGraphBuilderでは希望の接続をしないことがあったため、GraphBuilderを使用して全てのフィルター間のピンを手動でつなぎました。

もひとつ余談ですが、静止画像をキャプチャーするのでしたらVMR9フィルタからIVMRWindowlessControl9を生成してこれ経由でGetCurrentImageから取り出した方が動作が軽いと思います。

サンプルがあるようなURLはちょっとご紹介できませんが、MSDNドキュメントのDirectShowの部分にはちゃんと日本語で説明がありますので良くお読みください。

あ、あとWebカメラ側にCaptureとPrevのピン双方を持っている場合はSmartTeeは不要です。直接接続しても結構です。そのあたりはGraphEdit.exeで自分でグラフを作って確認してみてください。
tora
会議室デビュー日: 2007/09/19
投稿数: 4
投稿日時: 2007-09-27 12:18
返事が遅くなりましたが、手机さん返信ありがとうございます。

教えて頂いた方法を実現させる上で、分からない点が出てきました。
・AVIMuxフィルターの入力ピンが見つからない。
SmartTeeとAVIMuxを手動で接続させる上で、FindPinで接続ピンを見つけないと
いけないと思いますが、SmartTeeフィルターのCaptureピンは、見つかるのですが、
AVIMuxフィルターの入力ピンが見つかりません。

現在、directShow.NETを使用してC#で開発を行っていますが
ソースとしては、
smartTeeFilter.FindPin("Capture", out CapturePin);
muxFilter.FindPin("In", out MuxInPin);

でMuxInPinがnullになってしまいます。
#CapturePinは問題なくCaptureピンを取得します。

ご存知の方は、ご教授ください、宜しくお願い致します。
tora
会議室デビュー日: 2007/09/19
投稿数: 4
投稿日時: 2007-09-28 09:05
自己解決いたしました。

muxFilter.FindPin("Input 01", out MuxInPin);

で、AVIMuxの入力ピンを取得できました。
GraphEditで図を描いてみたところ、入力ピン名がわかりました。
これで、Captureピンと接続し、動画を保存しながら、キャプチャ画像も
取得することができました。

どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)