Android ExoPlayer– 同时下载视频(非DASHHLS)和流媒体

Android ExoPlayer– 同时下载视频(非DASHHLS)和流媒体,第1张

概述我想下载一个在ExoPlayer中流式传输的视频.另外,甚至在使用ExoPlayer之前,我从HttpURLConnection提供的输入流中下载了一个文件,并从本地存储播放该文件.这没关系,但是它并没有解决我的同步流和缓存问题.ExoPlayer还提供了一个缓存系统,这些系统似乎只适用于DASH或HLS流类型.我没

我想下载一个在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)和流媒体所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1097955.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存