使用ExoPlayer 2.18.7指定MIME类型仍遇M3U8媒体源工厂错误
解决ExoPlayer 2.18.7播放M3U8时的"No suitable media source factory"错误
问题原因
你遇到的错误是因为ExoPlayer默认不包含HLS(即M3U8格式)的媒体源处理模块——即便你指定了MIME类型,Player也没有对应的工厂类来解析和加载该格式的媒体内容。
解决步骤
1. 添加HLS模块依赖
在你的build.gradle(Module级别)中添加与ExoPlayer核心版本匹配的HLS模块依赖:
implementation "com.google.android.exoplayer:exoplayer-hls:2.18.7"
2. 配置ExoPlayer时注册HLS媒体源工厂
初始化ExoPlayer时,需要将HLS媒体源工厂集成到默认媒体源工厂中,示例代码如下:
// 创建HLS媒体源工厂(基于默认Http数据源) val hlsMediaSourceFactory = HlsMediaSource.Factory(DefaultHttpDataSource.Factory()) // 构建支持HLS的默认媒体源工厂 val mediaSourceFactory = DefaultMediaSourceFactory(context) .addMediaSourceFactory(hlsMediaSourceFactory) // 用配置好的工厂初始化ExoPlayer val exoPlayer = ExoPlayer.Builder(context) .setMediaSourceFactory(mediaSourceFactory) .build()
3. 保留原有MediaItem设置逻辑
你原来判断M3U8并指定MIME类型的代码无需修改,可继续使用:
videoUrl?.let { if (it.endsWith(".m3u8")) { val mediaItem = MediaItem.Builder() .setUri(it) .setMimeType(MimeTypes.APPLICATION_M3U8) .build() exoPlayer?.setMediaItem(mediaItem) } else { exoPlayer?.setMediaItem(MediaItem.fromUri(it)) } }
补充说明
ExoPlayer采用模块化设计,不同媒体格式需要对应的模块支持。HLS作为流媒体格式,必须单独引入exoplayer-hls模块,并在Player初始化时注册对应的媒体源工厂,Player才能识别并处理M3U8格式的内容。
内容的提问来源于stack exchange,提问作者Gabriel Silva Hernandes
相关产品推荐
相关产品推荐

