ffmpegの基本的な使い方

基本的なコマンドやiphoneの縦撮りを変換するtransposeの指定などに関するメモ

基本的なコマンドライン

> ffmpeg -i [入力ファイル] [オプション] [出力ファイル+拡張子]

指定した動画の情報をダンプする

> ffmpeg -i xxx.m4v
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'xxx.m4v':
  Metadata:
    major_brand     : M4V
    minor_version   : 512
    compatible_brands: isomiso2avc1
    date            : 2014-03-25T08:13:34+0900
    encoder         : Lavf55.34.101
  Duration: 00:00:10.31, start: 0.046440, bitrate: 830 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 568x320, 729 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      rotate          : 90
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 96 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

iPhoneなどで縦向き状態で録画したファイルの向きを変える

基本的に動画は、横長で再生されるのが暗黙的な決まりになっており、縦長状態で再生できるのは、Apple製品(OSXやiOS)だけである。ついつい縦長で録画し、ほかのプレイヤーで再生すると、90deg回転した状態で再生されて残念な気分になる。

ffmpegの-vfオプションで、transpose=nを指定して変換すると、一般的なプレイヤーでも縦長で再生される。transposeで設定する値は以下になる

 # 0 = 90CounterCLockwise and Vertical Flip (default)  
 # 1 = 90Clockwise  
 # 2 = 90CounterClockwise  
 # 3 = 90Clockwise and Vertical Flip  
> ffmpeg -i in.mov -vf "transpose=1" out.mov

動画から音声だけ抽出

> ffmpeg -i in.mov -acodec copy out.mp4

動画から画像を抽出する

サムネイル作成などに使えそう
-ssは開始秒、-vframesはフレーム数(枚数)を指定できる
以下だと、開始10秒から3フレーム分のjpeg画像が1.jpeg,2.jpeg,3.jpegと出力される。

> ffmpeg -i in.mov -ss 10 -vframes 3 %d.jpeg

アスペクト比を指定したエンコード

アスペクト比(-aspect)とサイズ(-s)を指定する
両方指定したほうが処理速度が速くなるとの報告あり
インタレース解除はPCで再生すると輪郭が波打ったりした場合に追加するオプション
画質が若干劣化するとの報告あり。波打たない動画に追加しても問題なし(劣化する話は別)

 # -s 解像度  
 # -vsync 音ズレ防止  
 # -b:v ビットレート  
 # -deinterlace インタレース解除  

> ffmpeg -i in.mov -threads 2 -deinterlace -top -1 -b:v 2048k -aspect 16:9 -s 1440x1080 -y -vsync 1 out.m4v

2pass設定でのエンコード

サイズはそのままに画質が向上するらしい・・・
1パス処理を2回やるので&&で連結する

-pass [n] nは1回目は1、2回目は2を設定する  
-passlogfile ファイル名を指定する。2回目は1回目のログを参考に処理するようになる  
> ffmpeg -i in.mov -threads 2 -deinterlace -top -1 -b:v 2048k -aspect 16:9 -s 1440x1080 -pass 1 -passlogfile "passlog" -y -vsync 1 -an out.m4v && ffmpeg -i in.mov -threads 2 -deinterlace -top -1 -b:v 2048k -aspect 16:9 -s 1440x1080 -pass 2 -passlogfile "passlog" -y -vsync 1 out.m4v

bitrate目安

 fact :0.1~0.3  
 bitrate [kbps] = fact * fps * width * height / 1024

fact = 0.3, 1440×1080 => 13.6Mbps (デジカメのデフォルトに近い)
fact = 0.15, 1440×1080 => 6.8Mbps (エンコードサイズ)