Как преобразовать MediaSource ExoPlayer в ванильный Java InputStream? - PullRequest
0 голосов
/ 23 июня 2019

Я хочу использовать библиотеку кэширования ExoPlayer, фактически не воспроизводя медиа на ExoPlayer.(Видео будет отображаться в WebView с помощью элементов HTML.) Цель состоит в том, чтобы реализовать постоянный кэш, чтобы приложение изящно обрабатывало при сбое подключения к Интернету.Проблема заключается в том, что для перехвата WebViewClient.shouldInterceptRequest(...), который я переопределяю, требуется InputStream как часть ответа, а MediaSource - такая высокоуровневая абстракция, что я не понял, как добраться до нижележащих байтов.

Exoplayer - это моя четвертая попытка получить надежную библиотеку кеширования в моей системе.

  1. Первый - это простой класс в памяти, который я использую для тестирования.Он показывает, что система работает, но не является постоянной.

  2. Далее я создал собственную простую библиотеку кэширования, которая отлично работает для небольших файлов, но не для больших видеофайлов (здесь яя только делаю прогрессивную загрузку / файлы mp4).

  3. Я пытался https://github.com/danikula/AndroidVideoCache,, что интересно тем, как он раскручивает прокси-сервер для своей работы, но этовыбрасывает много IOException с закрытием сокетов.Также это чисто сквозной кеш.Мне нужно выборочно кэшировать и сбрасывать содержимое ... вещи, которые воспроизводятся во время интернет-соединений, - это не то же самое, что нужно хранить для восстановления после отказа.

  4. Наконец, я привел в подсистему кэширования exoplayer.Казалось, что в нем есть все, что мне нужно ... пока я не понял, что MediaSource не позволяет легко выводить из него данные.

Вот эскиз, где я пытаюсь перенести постоянный кеш вкод WebViewClient.Обратите внимание на INSERT_MAGIC_HERE() вызов, для которого мне действительно нужно предложение.

public class MyWebviewFragment extends Fragment { 

    private WebView webView

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // ... 
        webView = view.findViewById(R.id.web_view);
        webView.setWebViewClient(new WebViewClient() { 

            // blocking call from a non-UI thread.
            // returning null means call is not intercepted and Chromium engine handles it like normal.
            @Override
            public WebResourceResponse shouldInterceptRequest(final WebView view, WebResourceRequest request) {
               // ... 
               // here I inspect the request and internet connectivity to 
               // update the persistent cache

               // If I want to intercept the call and used cached data, I 
               // need to return a WebResourceResponse packed with an inputStream 
               MediaSource mediaSource = ProgressiveMediaSource.Factory(...).createMediaSorce(request.uri);

               InputStream istream = INSERT_MAGIC_HERE(mediaSource)

               return new WebResourceResponse(..., iStream, ...)
            }
        });
    }

}

В качестве альтернативы, если это выходит за рамки возможностей ExoPlayer, я бы приветствовал альтернативное предложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...