java - ExoPlayer:如何根据带宽设置视频质量
问题描述
我真的很困惑,我正在构建一个直播电视应用程序,播放器根据带宽自动选择流的质量。我在stackoverflow中关注了与此问题相关的答案,但它似乎没有用,我不知道我错过了什么或错过了什么。
请看我下面的代码.....这是正确的方法吗,或者我应该有不同reoultions的url列表,但是玩家如何选择我不知道
提前致谢 。
private String hlsVideoUri = "http://stream/1080p.m3u8";
TrackSelection.Factory trackSelectionFactory;
trackSelectionFactory = new
AdaptiveTrackSelection.Factory(bandwidthMeter);
TrackSelector trackSelector = new
DefaultTrackSelector(trackSelectionFactory);
DefaultDataSourceFactory defaultDataSourceFactory = new
DefaultDataSourceFactory(this, Util.getUserAgent(this, "Tv"),
bandwidthMeter);
// 1. Create a default TrackSelector
Handler mainHandler = new Handler();
Log.d("rashed"," "+bandwidthMeter.getBitrateEstimate());
// 2. Create a default LoadControl
LoadControl loadControl = new DefaultLoadControl();
// 3. Create the player
player =
ExoPlayerFactory.newSimpleInstance(
this, trackSelector);
simpleExoPlayerView = (PlayerView) findViewById(R.id.playerview);
simpleExoPlayerView.setPlayer(player);
//
// Measures bandwidth during playback. Can be null if not required.
// This is the MediaSource representing the media to be played.
HlsMediaSource hlsMediaSource =new
HlsMediaSource.Factory(defaultDataSourceFactory).
createMediaSource(Uri.parse(hls
VideoUri),mainHandler, new MediaSourceEventListener() {
@Override
public void onLoadStarted(DataSpec dataSpec, int dataType, int trackType,
Format trackFormat, int trackSelectionReason, Object trackSelectionData,
long
mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs) {
}
@Override
public void onLoadCompleted(DataSpec dataSpec, int dataType, int
trackType,
Format trackFormat, int trackSelectionReason, Object trackSelectionData,
long
mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long
loadDurationMs, long bytesLoaded) {
}
@Override
public void onLoadCanceled(DataSpec dataSpec, int dataType, int trackType,
Format trackFormat, int trackSelectionReason, Object trackSelectionData,
long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long
loadDurationMs, long bytesLoaded) {
}
@Override
public void onLoadError(DataSpec dataSpec, int dataType, int trackType,
Format trackFormat, int trackSelectionReason, Object trackSelectionData,
long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long
loadDurationMs, long bytesLoaded, IOException error, boolean wasCanceled)
{
}
@Override
public void onUpstreamDiscarded(int trackType, long mediaStartTimeMs, long
mediaEndTimeMs) {
}
@Override
public void onDownstreamFormatChanged(int trackType, Format trackFormat, int
trackSelectionReason, Object trackSelectionData, long mediaTimeMs) {
}
});
player.prepare(hlsMediaSource);
simpleExoPlayerView.requestFocus();
player.setPlayWhenReady(true);
}
解决方案
推荐阅读
- javascript - 当 catch 返回错误时重新启动 then() 块
- vue.js - 如何使用两个 v-navigation-drawer?
- c++ - 由于内存映射,无法处理视频或 Videopath
- python - 基于Django函数的视图分页不起作用
- angular - 在 nz-row 和 nz-col 上构建和服务失败
- android - telnet 可以用来在通过 USB 连接的真实 android 设备上设置 gps 位置吗?
- javascript - 如何检查是否仅使用 JavaScript 选择了单选按钮?
- javascript - 如何处理网络浏览器中弹出的身份验证
- java - ListSelectionListener 在调用 setSelected 方法时不会触发事件
- javascript - X 轴上的 Charts.js + Django 日期