LoginSignup
5
4

More than 5 years have passed since last update.

ffmpegを使って複数のビットレートが違う動画を2passでエンコードしながらcropとscaleを同時にする。

Last updated at Posted at 2013-08-03

タイトル長いけど、そのままです。
環境はUbuntu12.04

ffmpegは動画の連結オプションがややこしい上にcropと併用すると上手く動かなかったりつまづく所が多かったので。

まずffmpeg をソースからインストールする

apt-get からでもインストールできるけどライセンスの問題で色々と重要な機能が使えないのでちゃんと使うなら必ずソースからインストールしたほうが良し。
バイナリでインストールしたのが古いと -filter_complex オプションが使えなくて
ffmpeg: unrecognized option '-filter_complex'などが出たりする。

インストール方法はここにあるとおりにすればOK。
http://ffmpeg.org/trac/ffmpeg/wiki/UbuntuCompilationGuide

動画の連結

ハマったのが -filter_complex オプションを使って動画の連結をすると -vf オプションでのcropが無効化されてしまう点。

あと何故か concat=n=2:v=1:a=1 と音声をオンにして -filter_complex の crop を使おうとすると
Too many inputs specified for the "crop" filter.のエラーが出てエンコードできない。
何で映像部分のcropオプションが音声があると使えないのかは不明。

ちなみに a=0 でも1つ目の動画の音声は残るので初めの方の音声だけ聞いて確認してると2つ目の動画の音声が無くて悲しい事態になる。

というわけで映像と音声を別々に連結して、最後に映像と音声を合成するしかなさそう。めんどくさい。

まず音声をwavで結合して抽出。
ffmpeg -i input1.avi -i input2.avi -filter_complex "concat=n=2:v=0:a=1" audio.wav

neroAacEncを使ってaacに変換
neroAacEnc -if "audio.wav" -of "audio.aac" -2pass -br 96000

次に動画を連結しつつ2passでエンコード。
ffmpeg -i input1.avi -i input2.avi -filter_complex "concat=n=2:v=1:a=0, crop=704:420:8:0" -s 640x360 -pass 1 -vb 900k -an video.mp4

これで720x420の元動画の左右を8pxずつcropしてから640x360にサイズ変更して、音声なしで出力の1pass目ができるので

ffmpeg -i input1.avi -i input2.avi -filter_complex "concat=n=2:v=1:a=0, crop=704:420:8:0" -s 640x360 -pass 2 -vb 900k -an video.mp4

で2pass目を行う。1pass目でできたvideo.mp4を上書きするか聞いてくるのでOKで。
ちゃんと1パス目でクロッピングやサイズ変更、それに連結ができてるかを確認しておかないと2パス目の後に気づいた時に時間の無駄を嘆くことになる。

音声と映像が無事連結されてたら、それらを結合
ffmpeg -i video.mp4 -i audio.aac -c copy output.mp4

以上で終了!やっと終わった―!

参考

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4