ExoPlayer缓存

18

我想使用ExoPlayer播放通过http传输的视频。并且我希望在视频加载完成后将其保存到缓存中,以便从缓存中播放。如何实现缓存和从缓存播放?能否给我一些示例。


我认为没有默认行为可以轻松地完成这个任务。它是开源的。你可以fork它并更改缓存的下载位置。 - tasomaniac
我有同样的问题。你找到实现这个的方法了吗? - Siavash Abdoli
@fisher3421 你有解决方案吗?我也在寻找同样的东西。 - Sagar
4个回答

5
你可以使用使用缓存和数据源创建的cacheDataSource。然后,这个cacheDataSource将被ExtractorSampleSource所使用。下面是音频渲染器的代码,同样可以用于视频渲染器;将其传递给exoplayerInstance.prepare(renderers)。
Cache cache = new SimpleCache(mCtx.getCacheDir(), new LeastRecentlyUsedCacheEvictor(1024 * 1024 * 10));
DataSource dataSource = new DefaultUriDataSource(mCtx, "My Player");
CacheDataSource cacheDataSource = new CacheDataSource(cache, dataSource, false, false);
Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE);
ExtractorSampleSource extractorSampleSource = new ExtractorSampleSource(trackURI, cacheDataSource, allocator, BUFFER_SEGMENT_COUNT*BUFFER_SEGMENT_SIZE, new Mp3Extractor());
MediaCodecAudioTrackRenderer audioTrackRenderer = new MediaCodecAudioTrackRenderer(extractorSampleSource);

这是获取缓存工作的完整实现吗?我已经实现了它,但打印cache.getCacheSpace()无论我做什么都显示为0。有任何填充缓存的想法或提示吗? - welshk91

2
你使用的协议是mpeg-dash还是普通http。
你可以重写HttpDataSource并将传入的字节写入文件中,当再次播放时,检查文件是否存在于所需位置,并将输入流从您的文件而非HttpDataSource提供给播放器。

2
覆盖 HttpDataSource 是错误的做法,因为 ExoPlayer 有针对缓存实现的目标类,例如 CacheDataSource。我想了解正确使用这些类的方法。 - vmtrue
我为此编写了数据源,但下载的文件比预期的要大一些KB。我不知道为什么。 - David

1

这个库很容易使用:https://github.com/danikula/AndroidVideoCache。你只需要在应用控制器中使用存储库中找到的初始化代码即可。

对于那些使用mediaitem的人,你可以这样做:

exoPlayer = new SimpleExoPlayer.Builder(context).build();
    holder.exoPlayerView.setPlayer(exoPlayer);
    HttpProxyCacheServer proxyServer = AppController.getProxy(context);
    String streamingURL = shortVideosRecommendationsArrayList.get(holder.getAbsoluteAdapterPosition()).getStreamingURL();
    String proxyURL = proxyServer.getProxyUrl(streamingURL);
  
    MediaItem mediaItem = MediaItem.fromUri(proxyURL);
    exoPlayer.setMediaItem(mediaItem);
    exoPlayer.setRepeatMode(exoPlayer.REPEAT_MODE_ALL);
    exoPlayer.prepare();
    exoPlayer.setPlayWhenReady(true);

1
我将使用这个库和exoplayer: https://github.com/danikula/AndroidVideoCache 它可以帮助您缓存来自资源(URL,文件)的视频...
这是我的示例代码:
String mediaURL = "https://my_cool_vid.com/vi.mp4";
SimpleExoPlayer exoPlayer = ExoPlayerFactory.newSimpleInstance(getContext());
HttpProxyCacheServer proxyServer = HttpProxyCacheServer.Builder(getContext()).maxCacheSize(1024 * 1024 * 1024).build();

String proxyURL = proxyServer.getProxyUrl(mediaURL);


DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(getContext(),
                Util.getUserAgent(getContext(), getActivity().getApplicationContext().getPackageName()));


exoPlayer.prepare(new ProgressiveMediaSource.Factory(dataSourceFactory)
                .createMediaSource(Uri.parse(proxyURL)););

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接