ffmpegを使って以下のコマンドでMP4ファイルを白黒アニメGIFにしようとした。
ffmpeg -i hoge.MP4 -vf scale=640:-1,hue=s=0 -r 15 hoge.gif
ところが、変換したファイルを再生すると縦長動画で再生されてしまった。
動画の世界では4:3で保存されている動画を16:9の横に引き伸ばして再生するという摩訶不思議なふるまいの動画形式があるようなのです。
わたしのデジカメ(SONY α6000)で撮影した動画ファイルがまさにこれでした。
動画を再生すると1920×1080ピクセルの16:9の縦横比として再生されるのですが、ファイル上の情報としての動画サイズは縦横比4:3の1440×1080ピクセルとなっていました。
対処方法としては、ファイルの情報を読み取って以下のようなコマンドを実行する。(上記アニメGIF変換の場合)
ffmpeg -i hoge.MP4 -vf "scale=640:trunc(ow/dar/2)*2,hue=s=0" -r 15 hoge.gif
結論
結論としては、例として横幅を640ピクセルでアスペクト比を自動計算したいなら
-vf scale=640:trunc(ow/dar/2)*2
のオプションをつけて変換してやれば良い。
実際のコマンド例
hoge.mp4を横幅1280ピクセルでhoge.aviに変換したい場合
ffmpeg -i hoge.mp4 -vf scale=1280:trunc(ow/dar/2)*2 hoge.avi
計算式の意味
計算式のtrunc(ow/dar/2)*2の部分の仕組みはこんな感じです。
| 部分 | 意味 |
|---|---|
ow | 出力幅(640) |
dar | ffmpegが自動取得する表示アスペクト比(16:9) |
trunc(.../2)*2 | 2の倍数に丸める |
これで、どんな動画でもffmpegが自動取得する表示アスペクト比をもとに正しい高さを計算してくれます!

コメント