android - 如何从 m3u8 url 中找出质量并在 exoplayer / videoview android 中设置质量?
问题描述
如何检测 m3u8 url 提供哪些类型的质量(240p、360p、720p、1080p 等)?我猜更改比特率会改变播放器中视频的质量,但比特率的变化是否与质量具有相同的输出?
公共无效initExoPlayer(字符串url,int windowPosition,int playerPosition){
try {
playerView = findViewById(R.id.video_player);
trackSelector = new DefaultTrackSelector();
defaultTrackParam = trackSelector.buildUponParameters().build();
trackSelector.setParameters(defaultTrackParam);
DefaultTrackSelector.Parameters parameters = trackSelector.getParameters();
Log.d(TAG, "maxVideoBitrate " + trackSelector.getParameters().maxVideoBitrate);
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL);
playerView.setPlayer(player);
fac = new DefaultDataSourceFactory(this, Util.getUserAgent(this, getString(R.string.app_name)));
Log.d(TAG, "initExoPlayer Url " + videoUrl);
videoSource = new HlsMediaSource.Factory(fac).createMediaSource(Uri.parse(url));
player.prepare(videoSource);
// Plays the video twice.
player.addListener(new Player.EventListener() {
@Override
public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
try {
Log.d(TAG, "trackGroups.length " + trackGroups.length + " trackSelections.length " + trackSelections.length);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onLoadingChanged(boolean isLoading) {
if (isLoading) {
progress_videoDetail.setVisibility(View.VISIBLE);
} else {
progress_videoDetail.setVisibility(View.GONE);
}
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
switch (playbackState) {
case ExoPlayer.STATE_READY:
progress_videoDetail.setVisibility(View.GONE);
duration = player.getDuration();
//Toast.makeText(activity,"Duration "+duration,Toast.LENGTH_SHORT).show();
break;
case ExoPlayer.STATE_BUFFERING:
progress_videoDetail.setVisibility(View.VISIBLE);
break;
case ExoPlayer.STATE_ENDED:
progress_videoDetail.setVisibility(View.GONE);
break;
}
}
@Override
public void onRepeatModeChanged(int repeatMode) {
}
@Override
public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {
}
@Override
public void onPlayerError(ExoPlaybackException error) {
progress_videoDetail.setVisibility(View.GONE);
Snackbar.make(ll_mainVideoDetail, getResources().getString(R.string.some_error_occurrred), Snackbar.LENGTH_SHORT).show();
releasePlayer();
}
@Override
public void onPositionDiscontinuity(int reason) {
progress_videoDetail.setVisibility(View.GONE);
}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
}
@Override
public void onSeekProcessed() {
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
解决方案
你必须TrackSelector
在你的initExoPlayer
with中初始化 atrackSelector = new DefaultTrackSelector(/* context= */ this, trackSelectionFactory);
然后你可以使用这个:
MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();
int videoRenderer;
if (mappedTrackInfo != null) {
for (int i = 0; i < mappedTrackInfo.getRendererCount(); i++) {
if (mappedTrackInfo.getTypeSupport(C.TRACK_TYPE_VIDEO){
videoRenderer = i;
}
}
}
TrackGroupArray qualityArray = mappedTrackInfo.getTrackGroups(videoRenderer).get(0);
推荐阅读
- silverstripe - Silverstripe 安装 - 友好的 URL 不起作用
- r - 使用 Dplyr 将两个 Dataframe 相乘并使用结果创建另一个
- xpath - XSLT 中的条件 For-Each
- python - 如何在字符串中存储多行并回显该字符串以在 CSHELL 脚本中打印输出?
- amazon-s3 - socket.io 400 错误请求云端
- c# - 如何使提交按钮单击事件处理程序中的表单无效或停止处理?
- yammer - 使用 REST API 从 Yammer 获取所有用户
- node.js - 将 mongodb node.js 包与 mongodb 2.4 版一起使用
- sql-server - SQL 内连接:奇怪的结果
- elasticsearch - 如何使用 reindex API 重命名索引