【FFmpeg】連番画像から作成したロスレスなMP4(yuv420p)が再生できない

ネコニウム研究所

PCを利用したモノづくりに関連する情報を掲載するブログ

【FFmpeg】連番画像から作成したロスレスなMP4(yuv420p)が再生できない

2022-2-2 |

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

試しにcrt10などに設定して動画が非可逆圧縮されるようにすると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 profileHigh@L3.2となっていた。

まとめ(感想文)

とりあえず、再生できるようになってよかったよかった。

ロスレスな動画たちをDaVinciで編集して最終的に非可逆圧縮をかけて出力する予定するのが夢だったんだけども、夢破れたり!

謝辞

Twitterにて「りっど」さんより本件について情報提供を頂きました。ありがとうございました。とても勉強になりました。