トップ回答者
VC#: 内蔵カメラからの録画について(DirectShow.NETでビデオが伸びる)

質問
-
こんにちは,_egirlと申します.
現在タブレットで内蔵カメラから取得した動画を表示・保存するWindowsフォームアプリケーションを作っております.
その中で,動画保存について解決できない問題があり困っております.
症状は,1時間ほどのビデオを録画すると,1時間20秒くらいのビデオファイルが出来上がり,
ビデオが実際より伸びてしまいます.
プログラムはC#でDirectShow.NETを使用し,内蔵カメラにキャプチャフィルタ→AVI Mux→sinkFilterとつないでローデータをAVIで保存するシンプルなものです.(あまりにもサイズが大きいのでゆくゆくは圧縮等したいです.)
デフォルトの30fpsがダメなのかと
http://social.msdn.microsoft.com/Forums/en-US/47638c90-5f03-4329-bae2-624672151808/is-it-possible-to-set-the-framerate-for-camera-devices?forum=windowsdirectshowdevelopment
などを参考にIAMStreamConfigインターフェースを使用して手動でfps設定をしようとしましたが,fpsを変更することができませんでした.(ちなみにラップトップで同じプログラムを走らせるとfpsを変えられました.しかしビデオの長さは合っていませんでした.)
まだあまり知識がないので,ここの部分のコードを載せるべき等ありましたらご指摘ください.
実時間の動画が表示・保存できれば最悪DirectShowでなくとも構いません.
(OpenCVを試しましたが無理でした.)
何か実時間ビデオファイルを生成する手段やポイントはございませんでしょうか.
アドバイスを頂けると嬉しいです.
何卒よろしくお願い致します.
タブレットVAIO Tap11 Windows 8.1 64bit内蔵カメラExmor R for PC(92万画素)
回答
-
多分累積遅延だと思いますが、DirectShowの代わりにWindows Media Foundation Capture APIを試してみてはいかがでしょうか。
.NET向けのまともなラッパーがあるかどうかは知りませんが、なければC++/CLIでつなげば良いでしょう。MFCaptureToFile Sample (Windows)
Media FoundationのC++向けサンプルは旧Windows SDK 7.xに付属しているはずです。
あと質問するときは開発環境のバージョンと.NETのバージョンくらいはきちんと書きましょう。
すべての返信
-
多分累積遅延だと思いますが、DirectShowの代わりにWindows Media Foundation Capture APIを試してみてはいかがでしょうか。
.NET向けのまともなラッパーがあるかどうかは知りませんが、なければC++/CLIでつなげば良いでしょう。MFCaptureToFile Sample (Windows)
Media FoundationのC++向けサンプルは旧Windows SDK 7.xに付属しているはずです。
あと質問するときは開発環境のバージョンと.NETのバージョンくらいはきちんと書きましょう。
-
syghさん お返事ありがとうございます.
_egirlです.知識不足で申し訳ございません.
開発環境: Visual Studio 2012
.NET Framework バーション: v4.0
となります.
以前一度,累積遅延について調べたのですが正確な定義が結局分からずじまいとなってしまっておりました...
勝手に 遅延→キャプチャが遅れる→ビデオが短くなる というイメージだったのですが
30fpsでキャプチャしてもビデオ生成時に遅延が生じて実際のビデオは30fpsではなくなってしまう
(キャプチャ数が30fps以上になったわけではない)
という認識で正しいでしょうか??
Windows Media Foundation Capture APIですね.
少し調べて挑戦してみます.
アドバイスありがとうございました.