如何从播放列表中预缓存下一个视频的前100kb,以便在exoplayer中顺利播放?

k7fdbhmy  于 2021-07-03  发布在  Java
关注(0)|答案(0)|浏览(506)

我已经用viewpager2实现了exoplayer。当用户向上或向下滑动时,播放器需要几秒钟来加载下一个项目。
为了消除两个视频之间的延迟,我想提前预切下一个视频。
我正在使用exoplayer 2.12.0
我已将exoplayer初始化为:

  1. cacheDataSourceFactory = new CacheDataSource.Factory()
  2. .setCache(CacheHelper.getCache(this))
  3. .setUpstreamDataSourceFactory(httpDataSourceFactory);
  4. player = new SimpleExoPlayer.Builder(this)
  5. .setMediaSourceFactory(
  6. new DefaultMediaSourceFactory(cacheDataSourceFactory))
  7. .setLoadControl(loadControlBuilder.build())
  8. .build();
  9. videoView.setPlayer(player);
  10. currentWindow = 0;
  11. viewPager.setCurrentItem(currentWindow, false);
  12. player.addListener(playbackStateListener);
  13. player.addAnalyticsListener(new EventLogger(trackSelector));
  14. player.setRepeatMode(Player.REPEAT_MODE_OFF);

然后将媒体项添加到播放机中,如下所示:

  1. final DownloadHelper downloadHelper =
  2. DownloadHelper.forMediaItem(
  3. PlayerActivity.this,
  4. mediaItem,
  5. new DefaultRenderersFactory(this),
  6. httpDataSourceFactory);
  7. downloadHelper.prepare(new DownloadHelper.Callback() {
  8. @Override
  9. public void onPrepared(DownloadHelper helper) {
  10. DownloadRequest downloadRequest = helper.getDownloadRequest(
  11. Util.getUtf8Bytes(mediaItem.playbackProperties.uri.toString()));
  12. if (!downloadedVideoItems.contains(shortVideo) && player != null) {
  13. startDownload(downloadRequest);
  14. player.addMediaItem(downloadRequest.toMediaItem());
  15. downloadedVideoItems.add(shortVideo);
  16. pagerAdapter.update(downloadedVideoItems);
  17. // only play if there is first video.
  18. if (videoDownloadIndex == 0) {
  19. startPlayer();
  20. dialog.hide();
  21. }
  22. videoDownloadIndex++;
  23. Log.d(TAG, "setMediaItemToPlayer: video added : " + shortVideo.videoName);
  24. }
  25. // update video download index
  26. Log.d(TAG, "setMediaItemToPlayer: videoDownloadIndex:" + videoDownloadIndex +
  27. " currentWindow:" + currentWindow);
  28. checkForDownload();
  29. }
  30. @Override
  31. public void onPrepareError(DownloadHelper helper, IOException e) {
  32. }
  33. });

cachehelper供参考:

  1. /*************************************Cache helper****************************************/
  2. public class CacheHelper {
  3. private static final long MAX_BYTES = 1024 * 1024 * 100;
  4. private static Cache cache;
  5. private static final String CACHE_DIR = "downloads";
  6. public static synchronized Cache getCache(Context context) {
  7. if (cache == null) {
  8. File cacheDir = new File(context.getExternalCacheDir(), CACHE_DIR);
  9. cache = new SimpleCache(cacheDir, new LeastRecentlyUsedCacheEvictor(MAX_BYTES),
  10. ExoHelper.getExoDatabaseProvider(context));
  11. }
  12. return cache;
  13. }
  14. public static void deleteCache(Context context) {
  15. File cacheDir = new File(context.getExternalCacheDir(), CACHE_DIR);
  16. deleteDir(cacheDir);
  17. }
  18. private static boolean deleteDir(File dir) {
  19. if (dir != null && dir.isDirectory()) {
  20. String[] children = dir.list();
  21. for (String child : children != null ? children : new String[0]) {
  22. boolean success = deleteDir(new File(dir, child));
  23. if (!success) {
  24. return false;
  25. }
  26. }
  27. return dir.delete();
  28. } else if (dir != null && dir.isFile()) {
  29. return dir.delete();
  30. } else {
  31. return false;
  32. }

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题