17

我正在准备使用 ExoPlayer 通过 http 播放视频。我想在视频加载后保存视频并从缓存中播放。如何从缓存中实现缓存和回放?可以给我任何样品。

4

4 回答 4

5

您使用使用缓存和数据源创建的 cacheDataSource。这个 cacheDataSource 然后被 ExtractorSampleSource 使用。下面是 audioRenderer 的代码,videoRender 也可以这样做;传递给 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);
于 2015-10-26T12:18:32.430 回答
2

您使用什么协议 mpeg-dash 或纯 http。

您可以覆盖 HttpDataSource 并将传入字节写入文件,并在再次播放时检查文件是否存在于所需位置并更改从文件而不是 HttpDataSource 馈送到播放器的 InputStream。

于 2015-03-29T10:05:41.190 回答
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)););
于 2019-11-03T07:23:49.327 回答
0

这个库很容易使用:https ://github.com/danikula/AndroidVideoCache 。您只需要在 appcontroller 的 repo 中找到初始化代码。

对于使用 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);
于 2021-09-19T19:40:44.800 回答