カメラを使ったアプリケーションをWPFで作っているのですが、取得した連続画像を動画に変換したいと思いいろいろ試行錯誤しています。
WMV、AVI等様々な形式がありますが、画質やサイズを考えるとやっぱり H264 が良いのですが、ライセンスやコストを考えると悩みます。
とはいうものの、ライセンスさえ妥協すればH264のデコード・エンコードをサポートしている x264 は良い選択かと。ライセンスは GPL。
Cisco Systems が提供している OpenH264 もありますが、こっちは使い方がよくわかりません。
OpenH264 の GitHub で連続画像の動画変換についての質問がありました。
Question
Suppose I have some pictures with similar content, and I want to compress it using h264 format, making it into something similar to a video stream. Also, I want it to be able for me to get every frame’s picture whenever I want to, but after I’ve read through the api, I’m a little bit confused and here are some questions I have:
While encoding the pictures, do I just put these pictures into the encoder and let it encode?
How do I get the image of any frames? I didn’t find a seek method in the decoder’s api. How should I implement it?
訳) 似た内容のいくつかの画像があんだけど、それをH264形式に圧縮して、ビデオストリームのようなものにしたいんだ。取得できる全てのフレーム画像に対してね。でも、APIドキュメントに目を通した後、ちょっと混乱してしまって、ここで質問をしたい。
画像をエンコードする時、エンコーダに画像を与えて、エンコードさせるのかい? どうやってフレーム画像を取得するんだい?デコーダのAPIドキュメントには見当たらない。自分で実装するの?
Answer
Currently encoder supports only I420 input. You should change your pictures into this format, and let encoder encode one picture by one.
There is not an easy way to get the image of any frame, especially for all P picture coding. It’s not required as a pure enc/dec. I guess you need a player.
訳) 今のところI420形式か入力はできないんだ。画像はそれに変換してくれ。で、エンコーダに画像を一つずつエンコードさせてね。
フレーム画像を取得する簡単な方法はないし、特に、全てのP画像 (訳注:Pの意味が不明。PNGのTypo?)はね。純粋なエンコーダ・デコーダに必要ではないね。
思うに、君には再生ソフトが必要だね。
訳は意訳だけど…
ということで、なんかダメな感じがする。
だから、少し調べてx264なら画像を動画に変えることができることがわかったからここにメモしておく・ ffmpeg でタイムラプスを作る記事はriocampos様が書いてますが、ffmpegを使うつもりはないので…
x264のバイナリは適宜落としてきてください。
コマンドは、
1 | x264.exe "input_%03d.png" -o output.h264 -q 0 --input-range pc --range pc --muxer mp4 |
こんな感じ。
引数 | 意味 |
---|---|
“input_%03d.png” | input_000.png, input_001.png のような連番画像を入力 |
-o output.h264 | output.h264という名前で出力 |
-q 0 | 品質。0-69 で指定して、0 はロスレス |
–input-range pc | 入力カラー範囲を指定。auto、tv または pc を指定 |
–range pc | カラー範囲を指定。auto、tv または pc を指定 |
–muxer mp4 | 出力コンテナ形式を指定。auto、raw、mkv、flv または mp4 を指定 |
とのこと。
画像は Jpeg か Png じゃないとだめかも。少なくとも、Bitmap はだめでした。
Jpegで試しましたところ、320x180のJpeg画像591枚5.5MBが15.5MB (23秒) になりました。
30fpsに少し足りませんが、まぁ良い塩梅でした。
補足
出力コンテナ形式を指定する –muxer mp4 を追加しました。