2016-06-12 9 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 또는 메소드가 있습니까?

내 다른 유래 검색은 아직 해결책을 제공하지 않은 : 당신의 시간과 인내에 대한

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

코드의 조각