
我想下载一个在ExoPlayer中流式传输的视频.
另外,甚至在使用ExoPlayer之前,我从httpURLConnection提供的输入流中下载了一个文件,并从本地存储播放该文件.这没关系,但是它并没有解决我的同步流和缓存问题.
ExoPlayer还提供了一个缓存系统,这些系统似乎只适用于DASH或HLS流类型.我没有使用这些,并希望使用ExtractorRendererBuilder缓存mp4. (这个主题在这里有相当广泛的内容:https://github.com/google/ExoPlayer/issues/420).
DefaulthttpDataSource确实有一个公开httpURLConnection的API,但我不确定我是否正在重用该流.以下是ExoPlayer中提供的示例代码.
@OverrIDe public voID buildrenderers(DemoPlayer player) { Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE); Handler mainHandler = player.getMainHandler(); // Build the vIDeo and audio renderers. DefaultBanDWIDthMeter banDWIDthMeter = new DefaultBanDWIDthMeter(mainHandler, null); DataSource dataSource = new DefaultUrIDataSource(context, banDWIDthMeter,userAgent); ExtractorSampleSource sampleSource = new ExtractorSampleSource(uri,dataSource,allocator, BUFFER_SEGMENT_COUNT * BUFFER_SEGMENT_SIZE, mainHandler, player, 0); MediaCodecVIDeoTrackRenderer vIDeoRenderer = new MediaCodecVIDeoTrackRenderer(context, sampleSource, MediaCodecSelector.DEFAulT, MediaCodec.VIDEO_SCAliNG_MODE_SCALE_TO_FIT, 5000, mainHandler, player, 50); MediaCodecAudioTrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource, MediaCodecSelector.DEFAulT, null, true, mainHandler, player, AudioCapabilitIEs.getCapabilitIEs(context), AudioManager.STREAM_MUSIC); TrackRenderer textRenderer = new TextTrackRenderer(sampleSource, player, mainHandler.getLooper()); // Invoke the callback. TrackRenderer[] renderers = new TrackRenderer[DemoPlayer.RENDERER_COUNT]; renderers[DemoPlayer.TYPE_VIDEO] = vIDeoRenderer; renderers[DemoPlayer.TYPE_AUdio] = audioRenderer; renderers[DemoPlayer.TYPE_TEXT] = textRenderer; player.onRenderers(renderers, banDWIDthMeter); }我现在做的是扩展DefaulthttpDataSource并使用httpURLConnection获取一个inputStream,写入getCacheDir()中的文件.这是扩展DefaulthttpDataSource的类:
public class CachedhttpDataSource extends DefaulthttpDataSource { public CachedhttpDataSource(String userAgent, Predicate<String> ContentTypePredicate) { super(userAgent, ContentTypePredicate); } public CachedhttpDataSource(String userAgent, Predicate<String> ContentTypePredicate, TransferListener Listener) { super(userAgent, ContentTypePredicate, Listener); } public CachedhttpDataSource(String userAgent, Predicate<String> ContentTypePredicate, TransferListener Listener, int connectTimeoutMillis, int readTimeoutMillis) { super(userAgent, ContentTypePredicate, Listener, connectTimeoutMillis, readTimeoutMillis); } public CachedhttpDataSource(String userAgent, Predicate<String> ContentTypePredicate, TransferListener Listener, int connectTimeoutMillis, int readTimeoutMillis, boolean allowCrossprotocolRedirects) { super(userAgent, ContentTypePredicate, Listener, connectTimeoutMillis, readTimeoutMillis, allowCrossprotocolRedirects); } public httpURLConnection getURLConnection(){ httpURLConnection connection = getConnection(); return getConnection(); }}我现在可以通过getURLConnection()获取一个inputStream来将视频保存到文件中,但我真的很高兴再次使用inputStream来缓存视频.是否有任何其他API /或方法可以访问字节数组,我可以在流式传输时写入文件?
我的其他stackoverflow搜索尚未提供解决方案:
Using cache in ExoPlayer
ExoPlayer cache
感谢您的时间和耐心.
解决方法:
我找到了一个只有一个问题的解决方案:向后或向前寻找是行不通的.
这是一段代码:
public voID preparePlayer(String vIDeoUri) { MediaSource vIDeoSource = new ExtractorMediaSource( Uri.parse( vIDeoUri ), dataSourceFactory, extractorsFactory, handler, null ); exoPlayer.prepare( vIDeoSource ); exoPlayer.setPlayWhenReady( true );}public DataSource.Factory buildDataSourceFactory() { return new DataSource.Factory() { @OverrIDe public DataSource createDataSource() { LeastRecentlyUsedCacheevictor evictor = new LeastRecentlyUsedCacheevictor( CACHE_SIZE_BYTES ); file cacheDir = //Your cache dir SimpleCache simpleCache = new SimpleCache( cacheDir, evictor ); DataSource dataSource = buildMyDataSourceFactory().createDataSource(); int cacheFlags = CacheDataSource.FLAG_BLOCK_ON_CACHE | CacheDataSource.FLAG_CACHE_UNBOUNDED_REQUESTS; return new CacheDataSource( simpleCache, dataSource, cacheFlags, CACHE_SIZE_BYTES ); } };}private DefaultDataSource.Factory buildMyDataSourceFactory() { return new DefaultDataSourceFactory( context, "jesty-androID", new DefaultBanDWIDthMeter() );}资料来源:https://github.com/google/ExoPlayer/issues/420#issuecomment-244652023
总结以上是内存溢出为你收集整理的Android ExoPlayer – 同时下载视频(非DASH / HLS)和流媒体全部内容,希望文章能够帮你解决Android ExoPlayer – 同时下载视频(非DASH / HLS)和流媒体所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)