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

如何在androidx.media3.exoPlayer中为HLS流添加视频画质切换功能?

Media3 ExoPlayer 实现HLS画质切换功能

1. 提取HLS可切换的画质列表

HLS流的多轨道信息封装在HlsMediaSource中,可通过当前播放的MediaItem获取对应资源,遍历视频轨道提取画质参数:

// 自定义画质数据类,用于存储可选画质信息
data class VideoQuality(
    val id: Int,
    val resolution: String,
    val bitrate: Long,
    val trackIndex: Int
)

// 获取当前HLS流的所有可选视频画质
fun getAvailableVideoQualities(player: ExoPlayer): List<VideoQuality> {
    val qualities = mutableListOf<VideoQuality>()
    val currentMediaItem = player.currentMediaItem ?: return qualities
    val mediaSource = player.mediaItemSource?.getMediaSource(currentMediaItem) ?: return qualities
    
    if (mediaSource is HlsMediaSource) {
        val trackGroups = mediaSource.trackGroups
        for (groupIndex in 0 until trackGroups.length) {
            val group = trackGroups.get(groupIndex)
            // 仅处理视频轨道
            if (group.type == C.TRACK_TYPE_VIDEO) {
                for (trackIndex in 0 until group.length) {
                    val format = group.getFormat(trackIndex)
                    val resolution = "${format.width}x${format.height}"
                    qualities.add(
                        VideoQuality(
                            id = groupIndex * 100 + trackIndex,
                            resolution = resolution,
                            bitrate = format.bitrate,
                            trackIndex = trackIndex
                        )
                    )
                }
            }
        }
    }
    return qualities
}

2. 执行画质切换操作

Media3中通过TrackSelectionParameters替代旧版ExoPlayer2的自定义TrackSelector,直接控制轨道选择:

// 根据选中的画质切换视频轨道
fun switchVideoQuality(player: ExoPlayer, targetQuality: VideoQuality) {
    val trackSelectionParams = player.trackSelectionParameters.buildUpon()
        .setTrackOverride(
            TrackSelectionOverride(
                TrackGroupArray.EMPTY,
                targetQuality.trackIndex
            )
        )
        .build()
    player.trackSelectionParameters = trackSelectionParams
}

3. 监听当前选中画质(可选)

若需在UI上同步显示当前播放画质,可添加轨道变化监听器:

player.addListener(object : Player.Listener {
    override fun onTrackSelectionParametersChanged(parameters: TrackSelectionParameters) {
        super.onTrackSelectionParametersChanged(parameters)
        player.videoFormat?.let { format ->
            val currentResolution = "${format.width}x${format.height}"
            // 此处更新UI显示当前分辨率
        }
    }
})

新旧版本核心差异

和旧版ExoPlayer2相比,Media3移除了复杂的DefaultTrackSelector自定义逻辑,直接通过TrackSelectionParameters完成轨道切换,API更简洁且符合最新规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:26:06