如何读取ExoPlayer当前实际使用的有效分辨率?
ExoPlayer 获取当前实际播放分辨率的方法
ExoPlayer提供了多种方式来获取当前实际使用的视频分辨率,以下是几种常用的实现方案:
监听轨道切换事件获取分辨率
通过给Player添加Player.Listener,重写onTracksChanged方法来监听轨道变化。当带宽变化导致分辨率降档时,该方法会被触发,你可以从Tracks信息中提取当前选中视频轨道的分辨率:player.addListener(new Player.Listener() { @Override public void onTracksChanged(Tracks tracks) { super.onTracksChanged(tracks); for (Tracks.Group group : tracks.getGroups()) { if (group.getType() == C.TRACK_TYPE_VIDEO && group.isSelected()) { int selectedTrackIndex = group.getSelectedIndex(); Format currentFormat = group.getTrackFormat(selectedTrackIndex); // 当前播放的分辨率:currentFormat.width x currentFormat.height break; } } } });直接查询当前播放轨道的Format
随时调用player.getCurrentTracks()获取当前轨道状态,遍历找到视频轨道后提取分辨率:Tracks currentTracks = player.getCurrentTracks(); for (Tracks.Group group : currentTracks.getGroups()) { if (group.getType() == C.TRACK_TYPE_VIDEO && group.isSelected()) { Format videoFormat = group.getTrackFormat(group.getSelectedIndex()); String resolution = videoFormat.width + "x" + videoFormat.height; // 使用分辨率信息 break; } }通过AnalyticsListener监听格式变化
添加AnalyticsListener并实现onVideoFormatChanged方法,每次视频格式(包括分辨率)更新时会收到回调,直接从Format对象中获取宽高:player.addAnalyticsListener(new AnalyticsListener() { @Override public void onVideoFormatChanged(EventTime eventTime, Format format) { super.onVideoFormatChanged(eventTime, format); int currentWidth = format.width; int currentHeight = format.height; // 处理分辨率变更逻辑 } });
补充说明
如果需要获取实际显示在屏幕上的分辨率(而非视频原始分辨率,比如存在缩放适配的情况),可以调用player.getVideoSize():
VideoSize displaySize = player.getVideoSize(); int displayWidth = displaySize.width; int displayHeight = displaySize.height;
内容的提问来源于stack exchange,提问作者Ralf Wickum
相关产品推荐
相关产品推荐

