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
相关产品推荐
相关产品推荐

