スマートフォンで撮影した mp4 の動画ファイルなどで、PC 上で編集しようとしたときに回転角度が間違って扱われ、出力時に動画サイズなども壊れることがあります。
これは、mp4 動画ファイル内に回転情報を扱うメタデータがあるのですが、それに対応しているアプリケーションとそうでないアプリケーションがあるからです。
そこで、ffmpeg
コマンドを使用して回転情報を削除し、解決することにしました。
主に以下の記事を参考にしましたが、ここではターミナル上だけで操作することを目的とし、それに加えていくつかのコマンドのオプションを変更・追加しました。説明文も補足します。
参考「スマホで撮影した映像をffmpegで正しい向きに変換する(+縮小変換) - Qiita」
1. mp4 の回転情報を確認 (ffprobe
)
ffprobe -show_streams -print_format flat input.mp4 2>/dev/null | grep '\.tags\.rotate='
streams.stream.0.tags.rotate="270"
(ここでは出力を grep
コマンドで取り出せるように出力形式を flat
に変更。)
(ここで何も表示されない場合、おそらくメタデータによる回転ではないです。)
参考「4 Writers - ffprobe Documentation」
ffprobe
コマンドは、本質的な出力でない情報を標準エラー出力 (stderr) に出力しています。
エラーというよりログに近い内容なのですが、標準出力と分けて表示されるため、ここでは非表示にするために null デバイス /dev/null
に出力しています。
2. mp4 の回転情報を削除 (ffmpeg
)
ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=0 output.mp4
前述の参考記事では -vf
オプション (-filter:v
のエイリアス) により FFmpeg Filters を使用して回転変換をしていますが、ここでは回転情報を削除することのみを目的として、各ストリームはコピーするだけにしました。
参考「5.4 Main options - ffmpeg Documentation」
参考「5.11 Advanced options - ffmpeg Documentation」(-map_metadata
)
参考「5.1 Stream specifiers - ffmpeg Documentation」
-c copy
で、各ストリームを再エンコードせずにコピー。
-metadata
でメタデータを変更。:s
でストリーム単位、:v
でビデオ、:0
で初めのインデックス。