如何在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
相关产品推荐
相关产品推荐

