こんにちは。 FlutterやAndroidの開発で動画を再生する際に、上記のエラーに遭遇したので、解決方法を記載しておきます。
エラーの詳細は下記のようなものです。
com.google.android.exoplayer2.ExoPlaybackException: MediaCodecVideoRenderer error, index=0, format=Format(1, null, null, video/avc, avc1.64003C, -1, null, [4000, 6000, 30.0], [-1, -1]), format_supported=NO_EXCEEDS_CAPABILITIES
結論
- 端末が対応していないフォーマットのビデオを再生しようとしています。
- 再生しようとしている動画ファイルのフォーマットを確認しましょう。(ffprobeで調べられます)
- 再生しようとしている端末が対応している動画デコードフォーマットを確認しましょう。(Codec Infoで詳細な端末の情報を調べられます。)
- 端末を変えるか、動画ファイルをより汎用的なフォーマットへ変更しましょう。
エラーの意味
まず「exoplayer2」という単語がありますが、Androidで動画再生を行っているソフトウェアで、元からインストールされているものです。
このソフトウェアが、「format_supported=NO_EXCEEDS_CAPABILITIES」というエラーを発しています。
こちらのページのエラー内容に関する記載によると、端末で対応していないフォーマットのビデオを再生しようとしたという内容のエラーであることが分かります。
どういうファイルを再生しようとしたのか
再生しようとしたファイルの情報もエラーに記載されています。 それがこの箇所です。
「video/avc, avc1.64003C」
一般的にh.264やavcと呼ばれるフォーマットです。 Androidは基本的にh.264に対応しているのですが、h.264には複数の設定(プロファイルやレベル)が存在し、端末がその設定に対応していない場合、上記のエラーが発生します。
Androidで対応しているビデオフォーマットについて
こちらのリンクに、Androidが最低限対応しているビデオのフォーマットが、Androidのバージョンごとに定義されています。
Android 14 互換性定義 | Android オープンソース プロジェクト | Android Open Source Project
たとえばAndroid14であれば、下記のような記載があります。
ちなみに、上記でエラーが発生した動画のプロファイルは「h.264 High Profile Level 6.0」で、Android端末での動作が保証されているものではありませんでした。
動画のフォーマットの調べ方
ffmpegをダウンロード
ffprobeを実行
解凍したフォルダで下記のコマンドを実行します
ffprobe -v error -show_format -show_streams <ファイル名>
するとこちらのような結果が表示され、コーデック、プロファイル、レベルなどの情報を取得できます。 この場合は「h.264 High Profile Level 6.0」であることがわかります。