2016-06-12 18 views
10

ExoPlayerでストリーミングしているビデオをダウンロードしたいと思います。Android ExoPlayer - ビデオ(非DASH/HLS)とストリーミングを同時にダウンロードする

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を拡張し、InputStreamを取得するためのHttpURLConnectionを使用し、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

感謝を。

答えて

2

私はただの問題を持つ解決策を見つけました:後方または前方の探索が機能していません。

これは、コードの一部です:

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

関連する問題