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

react-native-video ^6.0.0-alpha.3播放MKV视频出现errorCode 24001求助

问题:IPTV应用部分MKV视频播放失败(ExoPlayer解码初始化错误)

我正在开发一款支持IPTV列表播放的应用,所有内容均为MKV格式,多数视频可正常播放,但部分视频返回以下错误:

{"error": Object {"errorCode": "24001","errorException": "com.google.android.exoplayer2.ExoPlaybackException: MediaCodecVideoRenderer error, index=0, format=Format(1, null, null, video/x-unknown, null, -1, und, [720, 304, -1.0], [-1, -1]), format_supported=NO_UNSUPPORTED_TYPE","errorStackTrace": "com.google.android.exoplayer2.ExoPlaybackException: MediaCodecVideoRenderer error, index=0, format=Format(1, null, null, video/x-unknown, null, -1, und, [720, 304, -1.0], [-1, -1]), format_supported=NO_UNSUPPORTED_TYPE
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:566)    
        at android.os.Handler.dispatchMessage(Handler.java:108)
        at android.os.Looper.loop(Looper.java:216)
        at android.os.HandlerThread.run(HandlerThread.java:65)
Caused by: com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException: Decoder init failed: [-49999], Format(1, null, null, video/x-unknown, null, -1, und, [720, 304, -1.0], [-1, -1])
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:996)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecOrBypass(MediaCodecRenderer.java:546)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1450)
        at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecRenderer.java:877)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.readSourceOmittingSampleData(MediaCodecRenderer.java:963)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:779)      
        at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:989)       
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:490)    
        ... 3 more
","errorString": "ExoPlaybackException: ERROR_CODE_DECODER_INIT_FAILED",},
}

使用的react-native-video组件代码:

<Video
    key={keyload}
    ref={(ref) => {setVideo(ref)}}
    style={styles.video}
    onLoad={(data) => setMetadata(data)}
    source={{
      uri: uriLoad, initOptions: ['--codec=avcodec']
    }}
    onProgress={progress => {setProgress(progress.currentTime)}}
    controls={false}
    fullscreen={true}
    paused={paused}
    volume={volumen}
    fullscreenAutorotate={true}
    selectedVideoTrack={videoTrack}
    selectedAudioTrack={audioTrack}
    selectedTextTrack={textTrack}
    resizeMode={resizemode}
    onEnd={() => end()}
    isLooping 
    onError={error => playerError(error)}
    onPlaybackStatusUpdate={status => setStatus(() => status)}
    allowsExternalPlayback
/>

项目package.json配置:

{
  "name": "someiptv",
  "version": "1.0.0",
  "scripts": {
    "start": "expo start --dev-client",
    "android": "expo run:android",
    "ios": "expo run:ios",
    "web": "expo start --web"
  },
  "dependencies": {
    "@react-native-community/slider": "4.2.3",
    "@react-navigation/native": "^6.0.12",
    "@react-navigation/native-stack": "^6.8.0",
    "expo": "~46.0.9",
    "expo-av": "~12.0.4",
    "expo-font": "~10.2.0",
    "expo-linear-gradient": "~11.4.0",
    "expo-screen-orientation": "~4.3.0",
    "expo-splash-screen": "~0.16.2",
    "expo-sqlite": "~10.3.0",
    "expo-status-bar": "~1.4.0",
    "lodash.filter": "^4.6.0",
    "react": "18.0.0",
    "react-dom": "18.0.0",
    "react-native": "0.69.5",
    "react-native-marquee": "^0.4.0",
    "react-native-paper": "^5.0.0-rc.4",
    "react-native-safe-area-context": "4.3.1",
    "react-native-screens": "~3.15.0",
    "react-native-system-setting": "^1.7.6",
    "react-native-video": "^6.0.0-alpha.3",
    "react-native-web": "~0.18.7",
    "react-navigation": "^4.4.4"
  },
  "devDependencies": {
    "@babel/core": "^7.12.9"
  },
  "private": true
}

已尝试更换react-native-video不同版本、调整缓冲配置,均无法解决问题。请问错误原因是什么?如何修复?


错误原因分析

  1. 视频编码格式不被设备硬件解码器支持
    错误日志中format=Format(1, null, null, video/x-unknown, ...)和format_supported=NO_UNSUPPORTED_TYPE表明,ExoPlayer无法识别该视频的编码格式,导致硬件解码器初始化失败(ERROR_CODE_DECODER_INIT_FAILED)。虽然文件是MKV容器,但内部视频流可能使用了设备不支持的编码(比如某些罕见的H.264变种、AV1或其他小众编码)。

  2. react-native-video预发布版本的兼容性问题
    当前使用的react-native-video@6.0.0-alpha.3是预发布版本,可能存在编码支持的bug或ExoPlayer集成问题,尤其是在处理非常规编码时。

  3. 强制指定解码器的逻辑冲突
    代码中设置了initOptions: ['--codec=avcodec'],强制使用FFmpeg的avcodec解码器,干扰了ExoPlayer默认的"硬件优先、自动回退软件解码器"的选择逻辑,导致无法正常降级处理不支持的编码。


修复方案

1. 排查视频编码格式,确认设备支持性

  • 使用FFmpeg分析无法播放的MKV文件,查看视频流编码:
    ffmpeg -i problematic_video.mkv
    
  • 对比Android设备官方规格文档中的编码支持列表,若编码不被硬件支持,可考虑转码或提示用户更换设备。

2. 调整解码器配置,启用自动回退

  • 移除initOptions: ['--codec=avcodec']配置,让ExoPlayer自动选择解码器:
    source={{ uri: uriLoad }}
    
  • 若需强制使用软件解码器,可添加ExoPlayer专属配置(需确保react-native-video版本支持):
    source={{
      uri: uriLoad,
      exoPlayerConfig: {
        trackSelector: {
          parameters: {
            forceSoftwareDecoder: true
          }
        }
      }
    }}
    

3. 升级react-native-video到稳定版本

  • 预发布版本存在未修复的bug风险,建议升级到最新稳定版(如^6.2.0或更高):
    npm install react-native-video@latest --save
    
    升级后需重新构建项目,处理可能的Expo版本兼容性问题。

4. 检查ExoPlayer版本兼容性

  • react-native-video与expo-av均依赖ExoPlayer,若两者版本冲突,会导致解码逻辑异常。可通过查看依赖树确认版本,并调整expo-av版本或移除expo-av,仅使用react-native-video的播放能力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:25:24