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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:54:53