teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

reanswer

2016/02/19 13:26

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -1,3 +1,25 @@
1
+ 動画キャプチャに “Video For Windows” を使われているとのことですが、このAPIは時代遅れ(Windows 3.1時代の遺物)なので利用はおすすめしません。API設計そのものが古いため、近代的なマルチメディア処理やハードウェア(GPU)にも対応できず、いろいろと制約事項が多いです。
2
+
3
+ マルチメディア処理の代替フレームワークとしては、"Direct Show" や、さらに新しい "Media Foundation" というものがWindows OS標準で搭載されています。Microsoft公式では後者を推しているようですが、現時点ではDirect Showの方がサードパーティー製も含めて対応が厚いと思います。
4
+
5
+ Direct Showの基本思想はシンプルで、マルチメディア処理の各ステージを「フィルタ」という形でコンポーネント化し、グラフのようにそれらを接続していくことで機能を実現するものです。このグラフの構成は、本当にGUI上で箱と箱を線で繋ぐように行えます([イメージ](https://msdn.microsoft.com/ja-jp/library/cc370419.aspx))。
6
+
7
+ 今回の例では、次のようなグラフを構成することになります。(実際には、もっと中間に挟まるフィルタが必要です)
8
+ ```
9
+ [キャプチャ] --> [分岐器] --> [プレビューウインドウ]
10
+ |
11
+ +-------> [ファイル出力]
12
+ ```
13
+ このグラフの構成はプログラムコードからも制御できますから、まずは上記のような構成を取れることを確認し、それから同じものを構築するという方法を取れます。
14
+
15
+ ---
16
+ > "MPEG2"形式については、USB接続キャプチャーに圧縮形式が「MPEG2/1」と書いてあったので、単純に"MPEG2"でいいのかな程度に思っていました。
17
+
18
+ USBキャプチャデバイスでは、このような形態をとるものがありますね。生の映像データはかなりのデータ量になるため、USBを介してPCに転送する場合の帯域が不足することがあります。この場合は、デバイス側で映像データを圧縮→圧縮されたデータがUSBケーブルを通る→PC側で映像データを展開orそのまま受け取るという接続形態があります。厳密には"MPEG2/1"というコーデックは存在しないため、"MPEG-2 Video"か"MPEG-1 Video"かその両方に対応しているのかもしれませんね。
19
+
20
+ ---
21
+ __(以下、質問趣旨を少し勘違いしていた回答)__
22
+
1
23
  動画(ムービー)ファイル書出用に [VideoWriter](http://opencv.jp/opencv-2svn/cpp/reading_and_writing_images_and_video.html#videowriter) クラスが提供されます。おそらく、FFmpegを有効にしてビルドされたOpenCVが必要にると思います。
2
24
 
3
25
  # "MPEG2"形式というのは少し広い概念の単語になっています。具体的にはMPEG-2 Videoコーデック(m2vと略されるケースもある)を指しますか?MPEG-2 Transport Streamコンテナ形式(拡張子ts)?もしくはその両方でしょうか?