FFmpegは、ストリームをコピーするだけでビデオを自動回転します
mp4(ポートレート)ファイルをmkvに変換しているときに、この問題に直面しています。私が使用しているコマンド
ffmpeg -y -i test.mp4 -vcodec copy -acodec copy test.mkv
出力ビデオは反時計回りに90度回転します。サイドデータが削除されていると思うからです。
Side data: displaymatrix: rotation of -90.00 degrees
入力ファイル test.mp4 情報
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from ‘test.mp4’:
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2019-02-23T11:18:50.000000Z
com.android.version: 8.0.0
Duration: 00:00:25.86, start: 0.000000, bitrate: 12270 kb/s
Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), yuv420p(tv, bt709), 1280×720, 12005 kb/s, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 90k tbn, 180k tbc (default)
Metadata:
rotate : 90
creation_time : 2019-02-23T11:18:50.000000Z
handler_name : VideoHandle
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 256 kb/s (default)
Metadata:
creation_time : 2019-02-23T11:18:50.000000Z
handler_name : SoundHandle
回転出力ファイル test.mkv 情報
Input #0, matroska,webm, from ‘test.mkv’:
Metadata:
MAJOR_BRAND : mp42
MINOR_VERSION : 0
COMPATIBLE_BRANDS: isommp42
COM.ANDROID.VERSION: 8.0.0
ENCODER : Lavf58.12.100
Duration: 00:00:25.87, start: 0.000000, bitrate: 12265 kb/s
Stream #0:0(eng): Video: h264, yuv420p(tv, bt709, progressive), 1280×720, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 1k tbn, 2k tbc (default)
Metadata:
ROTATE : 90
HANDLER_NAME : VideoHandle
DURATION : 00:00:25.866000000
Stream #0:1(eng): Audio: aac, 48000 Hz, stereo, fltp (default)
Metadata:
HANDLER_NAME : SoundHandle
DURATION : 00:00:25.813000000
回転したmkvをmp4に変換すると、正常に動作し、ポートレートファイルを取得します。 displaymatrix側のデータがファイル情報に再び表示されます。
また、ストリームをコピーして同じmp4ファイルをm4vに変換することもできます。
この投稿で、彼らはc ++でそれを解決しました。私はAndroidに取り組んでおり、ffmpegandroidラッパーを使用してffmpegライブラリを使用しています。この状況を処理するためのffmpegフラグはありますか?
これが MP4 / MOV で機能する理由は、この形式の場合、表示マトリックスがムービーヘッダー( mvhd )およびトラックヘッダー( tkhd )アトムに格納されるためです。
マトリックス構造を示す mvhd のレイアウト例:
出典:Apple QuickTimeファイル形式仕様
ストリームが MKV で多重化されると、行列は失われ、マルチプレクサは代わりに ROTATE メタデータエントリの追加にフォールバックします。これは ffprobe 出力で確認できます。その後、ストリームが MP4 で多重化されると、メタデータ情報がマトリックスの作成に使用されます( MKV の作成時に -map_metadata -1 を渡すと、情報が失われ、変換が機能しなくなります)。
プレーヤー側では、 ROTATE タグで指定された回転を検索して適用するという保証はありません。 MKV を正しい向きで使用する場合は、再エンコードする必要があります。それ以外の場合は、 MP4 を使用します。
source