You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter VideoPlayer在Android的MediaCodecVideoRenderer异常求助

Flutter video_player在联发科Android设备上的MediaCodec解码失败问题

在Android联发科芯片设备上使用Flutter的video_player包播放视频时,播放器初始化失败,抛出以下错误:

PlatformException(VideoError, Video player had error androidx.media3.exoplayer.ExoPlaybackException: MediaCodecVideoRenderer error, index=0, format=Format(1, null, null, video/avc, avc1.64001F, -1, null, [1280, 720, 29.975233, ColorInfo(BT709, Limited range, SDR SMPTE 170M, false, 8bit Luma, 8bit Chroma)], [-1, -1]), format_supported=YES, null, null)

完整错误堆栈

Failed to initialize decoder: OMX.MTK.VIDEO.DECODER.AVC
W/MediaCodecRenderer( 1398):   java.lang.IllegalArgumentException: start failed
W/MediaCodecRenderer( 1398):       at android.media.MediaCodec.native_start(Native Method)
W/MediaCodecRenderer( 1398):       at android.media.MediaCodec.start(MediaCodec.java:2131)
W/MediaCodecRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.SynchronousMediaCodecAdapter$Factory.createAdapter(SynchronousMediaCodecAdapter.java:60)
W/MediaCodecRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.DefaultMediaCodecAdapterFactory.createAdapter(DefaultMediaCodecAdapterFactory.java:139)
W/MediaCodecRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.initCodec(MediaCodecRenderer.java:1225)
W/MediaCodecRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:1137)
W/MediaCodecRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.maybeInitCodecOrBypass(MediaCodecRenderer.java:588)
W/MediaCodecRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1602)
W/MediaCodecRenderer( 1398):       at androidx.media3.exoplayer.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecRenderer.java:1182)
W/MediaCodecRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.readSourceOmittingSampleData(MediaCodecRenderer.java:1042)
W/MediaCodecRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:860)
W/MediaCodecRenderer( 1398):       at androidx.media3.exoplayer.video.MediaCodecVideoRenderer.render(MediaCodecRenderer.java:1018)
W/MediaCodecRenderer( 1398):       at androidx.media3.exoplayer.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:1136)
W/MediaCodecRenderer( 1398):       at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:561)
W/MediaCodecRenderer( 1398):       at android.os.Handler.dispatchMessage(Handler.java:103)
W/MediaCodecRenderer( 1398):       at android.os.Looper.loop(Looper.java:264)
W/MediaCodecRenderer( 1398):       at android.os.HandlerThread.run(HandlerThread.java:67)
E/MediaCodecVideoRenderer( 1398): Video codec error
E/MediaCodecVideoRenderer( 1398):   androidx.media3.exoplayer.mediacodec.MediaCodecRenderer$DecoderInitializationException: Decoder init failed: OMX.MTK.VIDEO.DECODER.AVC, Format(1, null, null, video/avc, avc1.64001F, -1, null, [1280, 720, 29.975233, ColorInfo(BT709, Limited range, SDR SMPTE 170M, false, 8bit Luma, 8bit Chroma)], [-1, -1])
E/MediaCodecVideoRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:1144)
E/MediaCodecVideoRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.maybeInitCodecOrBypass(MediaCodecRenderer.java:588)
E/MediaCodecVideoRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1602)
E/MediaCodecVideoRenderer( 1398):       at androidx.media3.exoplayer.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecRenderer.java:1182)
E/MediaCodecVideoRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.readSourceOmittingSampleData(MediaCodecRenderer.java:1042)
E/MediaCodecVideoRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:860)
E/MediaCodecVideoRenderer( 1398):       at androidx.media3.exoplayer.video.MediaCodecVideoRenderer.render(MediaCodecRenderer.java:1018)
E/MediaCodecVideoRenderer( 1398):       at androidx.media3.exoplayer.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:1136)
E/MediaCodecVideoRenderer( 1398):       at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:561)
E/MediaCodecVideoRenderer( 1398):       at android.os.Handler.dispatchMessage(Handler.java:103)
E/MediaCodecVideoRenderer( 1398):       at android.os.Looper.loop(Looper.java:264)
E/MediaCodecVideoRenderer( 1398):       at android.os.HandlerThread.run(HandlerThread.java:67)
E/MediaCodecVideoRenderer( 1398):   Caused by: java.lang.IllegalArgumentException: start failed
E/MediaCodecVideoRenderer( 1398):       at android.media.MediaCodec.native_start(Native Method)
E/MediaCodecVideoRenderer( 1398):       at android.media.MediaCodec.start(MediaCodec.java:2131)
E/MediaCodecVideoRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.SynchronousMediaCodecAdapter$Factory.createAdapter(SynchronousMediaCodecAdapter.java:60)
E/MediaCodecVideoRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.DefaultMediaCodecAdapterFactory.createAdapter(DefaultMediaCodecAdapterFactory.java:139)
E/MediaCodecVideoRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.initCodec(MediaCodecRenderer.java:1225)
E/MediaCodecVideoRenderer( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:1137)
E/MediaCodecVideoRenderer( 1398):       ... 11 more
E/ExoPlayerImplInternal( 1398): Playback error
E/ExoPlayerImplInternal( 1398):   androidx.media3.exoplayer.ExoPlaybackException: MediaCodecVideoRenderer error, index=0, format=Format(1, null, null, video/avc, avc1.64001F, -1, null, [1280, 720, 29.975233, ColorInfo(BT709, Limited range, SDR SMPTE 170M, false, 8bit Luma, 8bit Chroma)], [-1, -1]), format_supported=YES
E/ExoPlayerImplInternal( 1398):       at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:640)
E/ExoPlayerImplInternal( 1398):       at android.os.Handler.dispatchMessage(Handler.java:103)
E/ExoPlayerImplInternal( 1398):       at android.os.Looper.loop(Looper.java:264)
E/ExoPlayerImplInternal( 1398):       at android.os.HandlerThread.run(HandlerThread.java:67)
E/ExoPlayerImplInternal( 1398):   Caused by: androidx.media3.exoplayer.mediacodec.MediaCodecRenderer$DecoderInitializationException: Decoder init failed: OMX.MTK.VIDEO.DECODER.AVC, Format(1, null, null, video/avc, avc1.64001F, -1, null, [1280, 720, 29.975233, ColorInfo(BT709, Limited range, SDR SMPTE 170M, false, 8bit Luma, 8bit Chroma)], [-1, -1])
E/ExoPlayerImplInternal( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:1144)
E/ExoPlayerImplInternal( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.maybeInitCodecOrBypass(MediaCodecRenderer.java:588)
E/ExoPlayerImplInternal( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1602)
E/ExoPlayerImplInternal( 1398):       at androidx.media3.exoplayer.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecRenderer.java:1182)
E/ExoPlayerImplInternal( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.readSourceOmittingSampleData(MediaCodecRenderer.java:1042)
E/ExoPlayerImplInternal( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:860)
E/ExoPlayerImplInternal( 1398):       at androidx.media3.exoplayer.video.MediaCodecVideoRenderer.render(MediaCodecRenderer.java:1018)
E/ExoPlayerImplInternal( 1398):       at androidx.media3.exoplayer.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:1136)
E/ExoPlayerImplInternal( 1398):       at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:561)
E/ExoPlayerImplInternal( 1398):       ... 3 more
E/ExoPlayerImplInternal( 1398):   Caused by: java.lang.IllegalArgumentException: start failed
E/ExoPlayerImplInternal( 1398):       at android.media.MediaCodec.native_start(Native Method)
E/ExoPlayerImplInternal( 1398):       at android.media.MediaCodec.start(MediaCodec.java:2131)
E/ExoPlayerImplInternal( 1398):       at androidx.media3.exoplayer.mediacodec.SynchronousMediaCodecAdapter$Factory.createAdapter(SynchronousMediaCodecAdapter.java:60)
E/ExoPlayerImplInternal( 1398):       at androidx.media3.exoplayer.mediacodec.DefaultMediaCodecAdapterFactory.createAdapter(DefaultMediaCodecAdapterFactory.java:139)
E/ExoPlayerImplInternal( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.initCodec(MediaCodecRenderer.java:1225)
E/ExoPlayerImplInternal( 1398):       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:1137)
E/ExoPlayerImplInternal( 1398):       ... 11 more

怀疑问题与设备MediaCodec对H.264(video/avc)视频的解码兼容性有关,属于设备特定限制或编解码逻辑冲突。

使用代码

late VideoPlayerController _videoPlayerController;
bool isVideoInitialized = false;

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

void initializeVideoPlayer() async {
  try {
    _videoPlayerController = VideoPlayerController.networkUrl(
      Uri.parse("https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4"),
    )
    ..initialize().then((_) {
      setState(() {
        isVideoInitialized = true;
      });
    }).onError((error, stackTrace) {
      log("Error: $error, StackTrace: $stackTrace");
    });
  } catch (e, st) {
    log("Error: $e, StackTrace: $st");
  }
}

@override
void dispose() {
  disposeVideoPlayer();
  super.dispose();
}

disposeVideoPlayer() async {
  await _videoPlayerController.dispose();
  log("Video Player Disposed");
}

环境信息

  • Flutter版本:3.24.3
  • video_player包:最新版
  • Android设备:联发科芯片

已尝试步骤

  • 测试不同视频URL
  • 尝试使用HLS格式及VideoFormat.hls
  • 移除formatHint参数,问题仍存在

解决方案与变通方法

1. 强制启用软件解码

联发科部分设备的硬件解码器存在兼容性问题,可通过配置ExoPlayer强制使用软件解码:

  • 在Android项目的res/xml目录下创建exoplayer_config.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<MediaCodecSettings forceSoftwareCodec="true"/>
  • 在AndroidManifest.xml的application标签内添加配置:
<meta-data
    android:name="com.google.android.exoplayer2.MediaCodecConfig"
    android:resource="@xml/exoplayer_config"/>

2. 降级video_player版本

最新版video_player依赖的Media3库可能与联发科设备存在适配问题,尝试降级到稳定版本(例如video_player: ^2.8.1),该版本依赖旧版ExoPlayer,兼容性更好。

3. 调整视频编码参数

虽然错误提示format_supported=YES,但联发科设备对H.264的Profile/Level可能有严格限制:

  • 将视频转码为Baseline或Main Profile(原视频为High Profile Level 3.1)
  • 确保视频分辨率、帧率在设备支持范围内

4. 重置设备解码器状态

设备MediaCodec解码器可能处于异常状态,尝试:

  • 重启设备
  • 清除应用缓存与数据

内容的提问来源于stack exchange,提问作者Munsif Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:49:49