Android Java:Media3 ExoPlayer无法播放YouTube直播URL问题排查
解决ExoPlayer播放YouTube直播流的UnrecognizedInputFormatException问题
核心问题分析
你遇到的错误本质是ExoPlayer找不到能解析YouTube直播流的提取器,根源大概率是流格式不匹配或者缺少对应解码模块依赖——YouTube直播流基本是HLS或DASH自适应流,不是普通MP4文件,硬指定MimeTypes.VIDEO_MP4会直接导致解析失败。
具体修复步骤
移除硬编码的MIME类型,让ExoPlayer自动检测
删掉setMimeType(MimeTypes.VIDEO_MP4),也可根据实际流格式手动指定正确类型:MediaItem mediaItem = new MediaItem.Builder() .setUri(mediaUri) // 若确定是HLS流,可指定:.setMimeType(MimeTypes.APPLICATION_M3U8) // 若确定是DASH流,可指定:.setMimeType(MimeTypes.APPLICATION_DASH_XML) .setLiveConfiguration(new MediaItem.LiveConfiguration.Builder().setMaxPlaybackSpeed(1.02f).build()) .build();添加HLS/DASH解码模块依赖
在Module级别的build.gradle中添加Media3对应的自适应流模块,没有这些模块ExoPlayer无法解析HLS/DASH流:implementation "androidx.media3:media3-exoplayer-hls:1.3.1" implementation "androidx.media3:media3-exoplayer-dash:1.3.1" // 基础模块若未添加需补上: implementation "androidx.media3:media3-exoplayer:1.3.1" implementation "androidx.media3:media3-ui:1.3.1"配置HttpDataSource支持跨协议重定向
YouTube直播流URL可能存在跨协议跳转(如http转https),开启重定向支持避免解析失败:DefaultHttpDataSource.Factory httpDataSourceFactory = new DefaultHttpDataSource.Factory() .setAllowCrossProtocolRedirects(true); exoPlayer = new ExoPlayer.Builder(getApplicationContext()) .setMediaSourceFactory(new DefaultMediaSourceFactory(httpDataSourceFactory).setLiveTargetOffsetMs(5000)) .setHandleAudioBecomingNoisy(true) .setWakeMode(WAKE_MODE_LOCAL) .setTrackSelector(new DefaultTrackSelector(this)) .setBandwidthMeter(new DefaultBandwidthMeter.Builder(this).build()) .setLivePlaybackSpeedControl(new DefaultLivePlaybackSpeedControl.Builder().setFallbackMaxPlaybackSpeed(1.04f).build()) .build();确认直播URL的有效性
确保使用的是实际媒体流URL,而非YouTube直播的网页URL(如https://www.youtube.com/watch?v=xxx)。网页URL是HTML页面而非媒体流,需通过YouTube Data API获取直播的实际流地址,或使用合法的嵌入流链接。
内容的提问来源于stack exchange,提问作者Viraj S
相关产品推荐
相关产品推荐

