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の検索はまだ解決策を与えていない:あなたの時間と忍耐のため
感謝を。