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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:52:07