如何解决Exoplayer-在重复模式下如何防止重新缓冲?
我正在使用exoplayer 2,并且启用了“重复播放”模式,这意味着一旦结束,它将继续播放视频。但是,在视频结束并再次播放后,它将继续重新缓冲(重新加载视频)。如何防止这种情况发生?
player = new SimpleExoPlayer.Builder(mContext).build();
player.setPlayWhenReady(false);
player.setRepeatMode(Player.REPEAT_MODE_ONE);
编辑1:
曾经尝试使用LoopingMediaSource,但是不确定我是否做对了吗? 因为它在自动重播视频时仍会重新缓冲。
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(mContext,Util.getUserAgent(mContext,"yourApplicationName"));
Uri uri = Uri.parse(mUrl);
MediaSource videoSource =
new ProgressiveMediaSource.Factory(dataSourceFactory)
.createMediaSource(uri);
LoopingMediaSource loopingMediaSource = new LoopingMediaSource(videoSource);
player.prepare(loopingMediaSource);
解决方法
当涉及视频缓冲时,这是不可避免的,因为只有一部分视频保留在内存中。
您可以尝试通过设置自定义加载控件来调整缓冲时间。调整 setBufferDurationsMs 参数以达到预期效果。
final DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
final DefaultLoadControl loadControl = new DefaultLoadControl
.Builder()
.setBufferDurationsMs(25000,50000,1500,2000)
.build();
player = new SimpleExoPlayer
.Builder(context)
.setTrackSelector(trackSelector)
.setLoadControl(loadControl)
.build();
如果通过调整setBufferDurationMs中的参数仍无法获得所需的结果,则可能需要实施滴灌技术以改善重新缓冲。接下来是针对ExoPlayer的有关如何实现这种技术的教程:
,尝试使用LoopingMediaSource
并通过以下方式将其投放到播放器:
player.prepare(loopingMediaSource)
,
您需要在ExoPlayer
- 创建自定义缓存数据源工厂
public class CacheDataSourceFactory implements DataSource.Factory {
private final Context context;
private final DefaultDataSourceFactory defaultDatasourceFactory;
private final long maxFileSize,maxCacheSize;
public CacheDataSourceFactory(Context context,long maxCacheSize,long maxFileSize) {
super();
this.context = context;
this.maxCacheSize = maxCacheSize;
this.maxFileSize = maxFileSize;
String userAgent = Util.getUserAgent(context,context.getString(R.string.app_name));
DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
defaultDatasourceFactory = new DefaultDataSourceFactory(this.context,bandwidthMeter,new DefaultHttpDataSourceFactory(userAgent,bandwidthMeter));
}
@Override
public DataSource createDataSource() {
LeastRecentlyUsedCacheEvictor evictor = new LeastRecentlyUsedCacheEvictor(maxCacheSize);
SimpleCache simpleCache = new SimpleCache(new File(context.getCacheDir(),"media"),evictor);
return new CacheDataSource(simpleCache,defaultDatasourceFactory.createDataSource(),new FileDataSource(),new CacheDataSink(simpleCache,maxFileSize),CacheDataSource.FLAG_BLOCK_ON_CACHE | CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR,null);
}
}
- 还有玩家
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory videoTrackSelectionFactory =
new AdaptiveTrackSelection.Factory(bandwidthMeter);
TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
SimpleExoPlayer exoPlayer = ExoPlayerFactory.newSimpleInstance(this,trackSelector);
MediaSource audioSource = new ExtractorMediaSource(Uri.parse(url),new CacheDataSourceFactory(context,100 * 1024 * 1024,5 * 1024 * 1024),new DefaultExtractorsFactory(),null,null);
exoPlayer.setPlayWhenReady(true);
exoPlayer.prepare(audioSource);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。