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 또는 메소드가 있습니까?
내 다른 유래 검색은 아직 해결책을 제공하지 않은 : 당신의 시간과 인내에 대한
감사합니다.