Flutter/Androidで動画再生時に発生する「format_supported=NO_EXCEEDS_CAPABILITIES」エラーの解決方法

こんにちは。 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をダウンロード

ffmpeg.org

ffprobeを実行

解凍したフォルダで下記のコマンドを実行します

ffprobe -v error -show_format -show_streams <ファイル名>

するとこちらのような結果が表示され、コーデック、プロファイル、レベルなどの情報を取得できます。 この場合は「h.264 High Profile Level 6.0」であることがわかります。

参考情報