Android - ExoPlayer 在没有太多缓冲的情况下尽快开始播放
Android - ExoPlayer start playing as soon as possible without too much buffering
我正在使用一个简单的 exoplayer 测试代码来播放来自 URL 的视频,我注意到播放器连接后,它会缓冲大约 2-3 秒直到开始播放(我指的是大约 2 -3 秒因为我不知道它内部是如何工作的,它可能是一定数量的字节)。鉴于连接需要大约 1-2 秒(然后开始缓冲,然后有效地启动视频),启动视频大约需要 4 秒,这似乎太多了。我使用速度测试应用程序在检测到的速度为 ~24Mbits/s 的连接上测试了 3 秒的视频,640x480,大小为 1.23MB。
有没有办法加快视频的启动速度(例如,通过设置启动所需的初始缓冲大小)?
这是我的测试代码:
TrackSelector trackSelector = new DefaultTrackSelector();
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
PlayerView playerView = findViewById(R.id.player_view);
playerView.setPlayer(player);
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
Util.getUserAgent(this, "simpleAudioApp"));
dataSourceFactory = new CacheDataSourceFactory(getSimpleCacheInstance(),
dataSourceFactory);
Uri audioSourceUri = Uri.parse("http://...somevideo.mp4");
MediaSource audioSource = new ExtractorMediaSource.Factory(dataSourceFactory)
.createMediaSource(audioSourceUri);
LoopingMediaSource loopingSource = new LoopingMediaSource(audioSource, 1);
// Prepare the player with the source.
player.prepare(loopingSource);
player.setPlayWhenReady(true);
player.addListener(new Player.EventListener() {
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if (playbackState == Player.STATE_ENDED) {
Toast.makeText(TestActivity2.this, "Video ended", Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(TestActivity2.this, "video state chnged: " + playbackState, Toast.LENGTH_LONG).show();
}
}
@Override
public void onRepeatModeChanged(int repeatMode) {
Toast.makeText(TestActivity2.this, "repeat chnged: " + repeatMode, Toast.LENGTH_LONG).show();
}
});
有什么方法可以实现吗?
您可以通过此模式使用自定义加载控件:
DefaultLoadControl loadControl = new DefaultLoadControl
.Builder()
.setBufferDurationsMs(minBufferMS, maxBufferMs, bufferForPlayackMS, bufferForPlaybackAfterRebufferMs)
.createDefaultLoadControl();
示例用法:
TrackSelector trackSelector = new DefaultTrackSelector();
DefaultLoadControl loadControl = new DefaultLoadControl
.Builder()
.setBufferDurationsMs(32*1024, 64*1024, 1024, 1024)
.createDefaultLoadControl();
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
我正在使用一个简单的 exoplayer 测试代码来播放来自 URL 的视频,我注意到播放器连接后,它会缓冲大约 2-3 秒直到开始播放(我指的是大约 2 -3 秒因为我不知道它内部是如何工作的,它可能是一定数量的字节)。鉴于连接需要大约 1-2 秒(然后开始缓冲,然后有效地启动视频),启动视频大约需要 4 秒,这似乎太多了。我使用速度测试应用程序在检测到的速度为 ~24Mbits/s 的连接上测试了 3 秒的视频,640x480,大小为 1.23MB。
有没有办法加快视频的启动速度(例如,通过设置启动所需的初始缓冲大小)?
这是我的测试代码:
TrackSelector trackSelector = new DefaultTrackSelector();
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
PlayerView playerView = findViewById(R.id.player_view);
playerView.setPlayer(player);
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
Util.getUserAgent(this, "simpleAudioApp"));
dataSourceFactory = new CacheDataSourceFactory(getSimpleCacheInstance(),
dataSourceFactory);
Uri audioSourceUri = Uri.parse("http://...somevideo.mp4");
MediaSource audioSource = new ExtractorMediaSource.Factory(dataSourceFactory)
.createMediaSource(audioSourceUri);
LoopingMediaSource loopingSource = new LoopingMediaSource(audioSource, 1);
// Prepare the player with the source.
player.prepare(loopingSource);
player.setPlayWhenReady(true);
player.addListener(new Player.EventListener() {
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if (playbackState == Player.STATE_ENDED) {
Toast.makeText(TestActivity2.this, "Video ended", Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(TestActivity2.this, "video state chnged: " + playbackState, Toast.LENGTH_LONG).show();
}
}
@Override
public void onRepeatModeChanged(int repeatMode) {
Toast.makeText(TestActivity2.this, "repeat chnged: " + repeatMode, Toast.LENGTH_LONG).show();
}
});
有什么方法可以实现吗?
您可以通过此模式使用自定义加载控件:
DefaultLoadControl loadControl = new DefaultLoadControl
.Builder()
.setBufferDurationsMs(minBufferMS, maxBufferMs, bufferForPlayackMS, bufferForPlaybackAfterRebufferMs)
.createDefaultLoadControl();
示例用法:
TrackSelector trackSelector = new DefaultTrackSelector();
DefaultLoadControl loadControl = new DefaultLoadControl
.Builder()
.setBufferDurationsMs(32*1024, 64*1024, 1024, 1024)
.createDefaultLoadControl();
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);