Flutter应用ExoPlayer解码器初始化失败问题排查求助
Flutter ExoPlayer 解码器初始化失败(NO_MEMORY)问题排查与解决
核心问题
使用ExoPlayer播放视频时,OMX.qcom.video.decoder.avc硬件解码器初始化失败,错误码0xfffffff4对应NO_MEMORY,本质是系统内存不足导致解码器无法分配所需资源。
报错日志
E/MediaCodecVideoRenderer(24315): ... 11 more E/ExoPlayerImplInternal(24315): Playback error E/ExoPlayerImplInternal(24315): com.google.android.exoplayer2.ExoPlaybackException: MediaCodecVideoRenderer error, index=0, format=Format(4, null, null, video/avc, avc1.4D401F, 3436400, null, [1280, 720, -1.0], [-1, -1]), format_supported=YES E/ExoPlayerImplInternal(24315): at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:578) E/ExoPlayerImplInternal(24315): at android.os.Handler.dispatchMessage(Handler.java:102) Caused by: com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException: Decoder init failed: OMX.qcom.video.decoder.avc, Format(4, null, null, video/avc, avc1.4D401F, 3436400, null, [1280, 720, -1.0], [-1, -1]) E/ExoPlayerImplInternal(24315): at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:1012) E/MediaCodecVideoRenderer(24315): Video codec error E/MediaCodecVideoRenderer(24315): com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException: Decoder init failed: OMX.qcom.video.decoder.avc, Format(4, null, null, video/avc, avc1.4D401F, 3436400, null, [1280, 720, -1.0], [-1, -1]) E/MediaCodecVideoRenderer(24315): at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:1012) E/MediaCodecVideoRenderer(24315): at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecOrBypass(MediaCodecRenderer.java:536) E/MediaCodecVideoRenderer(24315): at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1444) E/MediaCodecVideoRenderer(24315): at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecRenderer.java:917) E/MediaCodecVideoRenderer(24315): at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.readSourceOmittingSampleData(MediaCodecRenderer.java:945) W/MediaCodec-JNI(24315): done releasing MediaCodec from JMediaCodec::~JMediaCodec(). W/MediaCodecRenderer(24315): Failed to initialize decoder: OMX.qcom.video.decoder.avc W/MediaCodecRenderer(24315): android.media.MediaCodec$CodecException: Failed to initialize OMX.qcom.video.decoder.avc, error 0xfffffff4 (NO_MEMORY) W/MediaCodecRenderer(24315): at android.media.MediaCodec.native_setup(Native Method) W/MediaCodecRenderer(24315): at android.media.MediaCodec.<init>(MediaCodec.java:1999) W/MediaCodecRenderer(24315): at android.media.MediaCodec.<init>(MediaCodec.java:1977) W/MediaCodecRenderer(24315): at android.media.MediaCodec.createByCodecName(MediaCodec.java:1947) W/MediaCodecRenderer(24315): at com.google.android.exoplayer2.mediacodec.AsynchronousMediaCodecAdapter$Factory.createAdapter(AsynchronousMediaCodecAdapter.java:95) W/MediaCodecRende I/ACodec (24315): [] Now uninitialized I/ACodec (24315): [] onAllocateComponent I/OMXClient(24315): IOmx service obtained E/ACodec (24315): Unable to instantiate codec 'OMX.qcom.video.decoder.avc' with err 0xfffffff4. E/ACodec (24315): signalError(omxError 0xfffffff4, internalError -12) E/MediaCodec(24315): Codec reported err 0xfffffff4/NO_MEMORY, actionCode 0, while in state 1/INITIALIZING D/MediaCodec(24315): flushMediametrics W/MediaCodec-JNI(24315): try to release MediaCodec from JMediaCodec::~JMediaCodec()... W/MediaCodec-JNI(24315): done releasing MediaCodec from JMediaCodec::~JMediaCodec().
排查与解决步骤
1. 释放系统内存
- 关闭设备后台所有无关应用,减少系统内存占用后重试播放
- 重启设备,清除系统缓存碎片
2. 切换到软件解码
绕过硬件解码器的内存限制,强制ExoPlayer使用软件解码:
// 以exoplayer_flutter插件为例,配置软件解码 import 'package:exoplayer_flutter/exoplayer_flutter.dart'; final player = ExoPlayer.builder() .setMediaCodecSelector(MediaCodecSelector.DEFAULT_WITHOUT_HARDWARE_CODECS) .build();
注意:软件解码会增加CPU负载,适合低分辨率视频场景。
3. 优化视频资源
- 将视频转码为更低分辨率(如720P转480P)或更低码率,降低解码器所需内存
- 确保视频编码格式为标准H.264(avc1),避免使用非标准编码参数
4. 优化播放器生命周期管理
- 在Flutter页面
dispose()方法中及时释放播放器实例:
@override void dispose() { player?.release(); super.dispose(); }
- 避免同一页面或应用中同时存在多个ExoPlayer实例
5. 设备兼容性处理
- 对于高通芯片设备,检查系统固件更新,部分旧版本固件存在OMX解码器内存分配bug
- 若设备已root,可尝试调整OMX服务的内存分配参数(不推荐普通应用操作)
6. 排查应用内存泄漏
- 使用Android Studio Profiler或Flutter DevTools分析应用内存,定位内存泄漏点
- 检查页面中是否有未释放的图片、动画等资源,及时清理
内容的提问来源于stack exchange,提问作者Tejaswini Dev
相关产品推荐
相关产品推荐

