【FFmpeg】連番画像から作成したロスレスなMP4(yuv420p)が再生できない
FFmpegを使って連番画像から作成したロスレスなMP4がAndroidで再生できない!なんとかしたい!
2022-2-6に記事を修正しました。
概要
この記事では、FFmpegでcrf 0
と-pix_fmt yuv420p
を指定して出力したロスレスな圧縮をしたyuv420pのフォーマットのMP4が一部の環境やアプリで再生できない状況について掲載する。
仕様書
環境
- Windows 10 Home Version 21H1(OS ビルド 19043.1415)
- FFmpeg 4.2
説明書
FFmpegでcrf 0
と-pix_fmt yuv420p
を指定してロスレス(可逆圧縮)なyuv420pフォーマットのMP4を作るとAndroid版のDiscordやDaVinciで再生することができなかった。PCのDiscord、mpcやiOS版Discordでは正常に再生できる。
下記は連番画像(png)からロスレス(可逆圧縮)なyuv420pフォーマットのMP4を出力する例です。
ffmpeg -framerate 15 -i anim-%%d.png -pix_fmt yuv420p -vcodec libx264 -r 60 -crf 0 -an output.mp4
試しにcrt
を10
などに設定して動画が非可逆圧縮されるようにするとAndroid版のDiscordやDaVinciなどでも再生できるようになった。
他のサイトで見た情報だと-movflags
と+faststart
のオプションを付ければ良いとのことだったが、私の環境では改善せず、むしろ、動画を非可逆圧縮してしまえば、前述のオプションを付けなくてもAndroid版のDiscordなどでも再生できるようになった。(この件とはまた別の話だった)
下記は連番画像(png)から逆圧縮したyuv420pフォーマットのMP4を出力する例です。
ffmpeg -framerate 15 -i anim-%%d.png -pix_fmt yuv420p -vcodec libx264 -r 60 -crf 10 -an output.mp4
互換性の低いプロファイル
ここからは主にTwitterで教えて頂いたことなのですが、FFmpegでcrf 0
オプションを使用すると出力されるMP4のプロファイルがHigh 4.4.4 Predictiveという互換性の低いものになってしまい、結果このような状況になっているらしい。
MediaInfoという動画の情報を表示できるアプリで該当の動画を確認したところ教えてもらった、Format profile
の項目の値がHigh 4.4.4 Predictive@L3.2
となっていた。@
の後ろのL3.2
の部分はレベルを表す。(このアプリもTwitterで同じ型から教えて頂きました)
非可逆圧縮をした動画のFormat profile
はHigh@L3.2
となっていた。
まとめ(感想文)
とりあえず、再生できるようになってよかったよかった。
ロスレスな動画たちをDaVinciで編集して最終的に非可逆圧縮をかけて出力する予定するのが夢だったんだけども、夢破れたり!
謝辞
Twitterにて「りっど」さんより本件について情報提供を頂きました。ありがとうございました。とても勉強になりました。
何言ってるか分かりにくくなってますが、-crf 0はロスレスモードになって12bit深度に固定されて出力されます。その場合、互換性が著しく低い動画になります。
— りっど@サブ垢 (@foreheadlarge_s) February 3, 2022