Android ExoPlayer - baixar vídeo (não DASH / HLS) e transmitir ao mesmo tempo

Gostaria de baixar um vídeo que está sendo transmitido no ExoPlayer.

Como um aparte e mesmo antes de usar o ExoPlayer, baixei um arquivo de um fluxo de entrada fornecido peloHttpURLConnection e reproduziu o arquivo do armazenamento local. Tudo bem, mas não resolve o meu problema de streaming e cache simultâneos.

O ExoPlayer também fornece um sistema de armazenamento em cache e eles parecem funcionar apenas para os tipos de fluxo DASH ou HLS. Não estou usando nenhum desses e quero armazenar em cache o mp4 com oExtractorRendererBuilder. (Este tópico é abordado extensivamente aqui:https://github.com/google/ExoPlayer/issues/420)

DefaultHttpDataSource tem uma API que expõeHttpURLConnection mas não tenho certeza se estou reutilizando o fluxo. Aqui está o código das amostras fornecidas no 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);
    }

O que eu fiz agora é estenderDefaultHttpDataSourcee use HttpURLConnection para obter um InputStream, escreva para um arquivo emgetCacheDir(). Aqui está a classe que se estendeDefaultHttpDataSource:

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();
    }
}

Agora posso obter um InputStream via getURLConnection () para salvar o vídeo em um arquivo, mas não estou muito feliz em usar um InputStream novamente para armazenar o vídeo em cache. Existe alguma outra API / ou método que dê acesso a uma matriz de bytes que eu possa gravar em um arquivo durante a transmissão?

Minhas outras pesquisas de stackoverflow ainda não forneceram uma solução:

Usando cache no ExoPlayer

Cache do ExoPlayer

Obrigado pelo seu tempo e paciência.

questionAnswers(1)

yourAnswerToTheQuestion