Flutter: ошибка при отображении видеофайла в проигрывателе Flutter

Я использую официальный пакет видеоплеера Flutter для своего приложения flutter, и при отображении на экране у меня возникла эта ошибка:

          V/LGCodecAdapter(  515): LG Codec Adapter start
    I/ACodec  (  515): Now uninitialized
    I/ACodec  (  515): onAllocateComponent
    I/OMXClient(  515): MuxOMX ctor
    I/ACodec  (  515): [OMX.qcom.video.decoder.avc] Now Loaded
    I/ACodec  (  515): Now uninitialized
    W/MediaCodecRenderer(  515): Failed to initialize decoder: OMX.qcom.video.decoder.avc
    W/MediaCodecRenderer(  515):   android.media.MediaCodec$CodecException: Error 0xfffffff4
    W/MediaCodecRenderer(  515):       at android.media.MediaCodec.native_configure(Native Method)
    W/MediaCodecRenderer(  515):       at android.media.MediaCodec.configure(MediaCodec.java:1895)
    W/MediaCodecRenderer(  515):       at com.google.android.exoplayer2.mediacodec.SynchronousMediaCodecAdapter.configure(SynchronousMediaCodecAdapter.java:61)
    W/MediaCodecRenderer(  515):       at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.configureCodec(MediaCodecVideoRenderer.java:620)
    W/MediaCodecRenderer(  515):       at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.initCodec(MediaCodecRenderer.java:1110)
    W/MediaCodecRenderer(  515):       at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:1011)
    W/MediaCodecRenderer(  515):       at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecOrBypass(MediaCodecRenderer.java:578)
    W/MediaCodecRenderer(  515):       at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1420)
    W/MediaCodecRenderer(  515):       at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:694)
    W/MediaCodecRenderer(  515):       at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.readToFlagsOnlyBuffer(MediaCodecRenderer.java:965)
    W/MediaCodecRenderer(  515):       at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:811)
    W/MediaCodecRenderer(  515):       at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:947)
    W/MediaCodecRenderer(  515):       at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:477)
    W/MediaCodecRenderer(  515):       at android.os.Handler.dispatchMessage(Handler.java:98)
    W/MediaCodecRenderer(  515):       at android.os.Looper.loop(Looper.java:154)
    W/MediaCodecRenderer(  515):       at android.os.HandlerThread.run(HandlerThread.java:61)
    E/ExoPlayerImplInternal(  515): Playback error
    E/ExoPlayerImplInternal(  515):   com.google.android.exoplayer2.ExoPlaybackException: MediaCodecVideoRenderer error, index=0, format=Format(1, null, null, video/avc, avc1.428028, -1, null, [1920, 1080, 28.391167], [-1, -1]), format_supported=YES
    E/ExoPlayerImplInternal(  515):       at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:554)
    E/ExoPlayerImplInternal(  515):       at android.os.Handler.dispatchMessage(Handler.java:98)
    E/ExoPlayerImplInternal(  515):       at android.os.Looper.loop(Looper.java:154)
    E/ExoPlayerImplInternal(  515):       at android.os.HandlerThread.run(HandlerThread.java:61)
    E/ExoPlayerImplInternal(  515):   Caused by: com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException: Decoder init failed: OMX.qcom.video.decoder.avc, Format(1, null, null, video/avc, avc1.428028, -1, null, [1920, 1080, 28.391167], [-1, -1])
E/ExoPlayerImplInternal(  515):       at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:1018)
E/ExoPlayerImplInternal(  515):       at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecOrBypass(MediaCodecRenderer.java:578)
E/ExoPlayerImplInternal(  515):       at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1420)
E/ExoPlayerImplInternal(  515):       at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:694)
E/ExoPlayerImplInternal(  515):       at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.readToFlagsOnlyBuffer(MediaCodecRenderer.java:965)
E/ExoPlayerImplInternal(  515):       at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:811)
E/ExoPlayerImplInternal(  515):       at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:947)
E/ExoPlayerImplInternal(  515):       at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:477)
E/ExoPlayerImplInternal(  515):       ... 3 more
E/ExoPlayerImplInternal(  515):   Caused by: android.media.MediaCodec$CodecException: Error 0xfffffff4
E/ExoPlayerImplInternal(  515):       at android.media.MediaCodec.native_configure(Native Method)
E/ExoPlayerImplInternal(  515):       at android.media.MediaCodec.configure(MediaCodec.java:1895)
E/ExoPlayerImplInternal(  515):       at com.google.android.exoplayer2.mediacodec.SynchronousMediaCodecAdapter.configure(SynchronousMediaCodecAdapter.java:61)
E/ExoPlayerImplInternal(  515):       at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.configureCodec(MediaCodecVideoRenderer.java:620)
E/ExoPlayerImplInternal(  515):       at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.initCodec(MediaCodecRenderer.java:1110)
E/ExoPlayerImplInternal(  515):       at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:1011)
E/ExoPlayerImplInternal(  515):       ... 10 more

Вот код для плеера:

      late final VideoPlayerController _videoCtrl;
late final Future<void> _videoCtrlInitializationFuture;

  @override
  void initState() {
    super.initState();

    _initVideoCtrl();
  }

  void _initVideoCtrl() {
    _videoCtrl = VideoPlayerController.file(widget.videoFile);
    _videoCtrlInitializationFuture = _videoCtrl.initialize();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: _videoCtrlInitializationFuture,
      builder: (BuildContext context, AsyncSnapshot videoCtrlInitSnap) {
        if (videoCtrlInitSnap.connectionState == ConnectionState.done) {
          return AspectRatio(
            aspectRatio: _videoCtrl.value.aspectRatio,
            child: VideoPlayer(_videoCtrl),
          );
        } else {
          return SizedBox.shrink();
        }
      },
    );
  }

  @override
  void dispose() {
    _videoCtrl.dispose();

    super.dispose();
  }

Файл, который я пытаюсь отобразить, в порядке, потому что он работает на последнем экране, и это тот же виджет Player, что и этот. И мне было интересно, потому что Flutter не позволяет мне иметь 2VideoPlayer одновременно, но я приостановил воспроизведение видео на последнем экране перед нажатием на этот.

3 ответа

Ошибка вызвана targetSdkVersion в файле build.gradle (уровень приложения), поэтому мне нужно добавить дополнительное разрешение

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>

в моем файле manifest.xml, также установите версию ios в podfile на 10 (или выше), и готово!

у меня была аналогичная проблема в моем коде.

изначально у меня был контроллер, инициализированный вне построителя просмотра страниц, и я исправил его, поместив контроллер ниже по дереву виджетов ближе к тому месту, где он фактически использовался (т.е. не передавая его в качестве аргумента другому виджету)

Затем я замечаю, что получу эти явные отладочные сообщения

      I/ExoPlayerImpl(13370): Init c2ef839 [ExoPlayerLib/2.18.0] [OP516FL1, NE2213, OnePlus, 31]
I/ExoPlayerImpl(13370): Release ed3786e [ExoPlayerLib/2.18.0] [OP516FL1, NE2213, OnePlus, 31] [goog.exo.core, goog.exo.exoplayer, goog.exo.decoder, goog.exo.datasource, goog.exo.extractor]

поэтому, возможно, проверьте, получаете ли вы аналогичные сообщения об отладке выпуска при тестировании.

Попробуйте отредактировать свой initState как показано ниже, и сообщите мне статус.

        @override
  void initState() {
    _videoCtrl = VideoEditorController.file(widget.file)
      ..initialize().then((_) => setState(() {}));
    super.initState();
  }
Другие вопросы по тегам