Кеш для hls видео с использованием exoplayer в android - PullRequest
0 голосов
/ 29 января 2020

Можно ли создать кеш для видео типа hls при воспроизведении в exoplayer, чтобы после завершения потоковой передачи видео не нужно было загружать снова и сразу же начать воспроизведение при следующем нажатии кнопки воспроизведения, если возможно, укажите решение? Формат видео: .m3u8.

1 Ответ

0 голосов
/ 29 января 2020

Для потоков не ABR, т.е. не HLS или DA SH et c

Существует хорошо используемая библиотека, которая обеспечивает функции кэширования видео:

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

Обновление для потоков ABR

Протоколы потоковой передачи с адаптивной скоростью передачи данных, такие как HLS или DA SH, как правило, сегментировали версии видео с несколькими скоростями передачи, и проигрыватель будет загружать сегмент видео по сегментам, выбирая битрейт для следующего сегмента в зависимости от состояния сети и возможностей устройства.

По этой причине простое сохранение того, что вы просматриваете, может не дать желаемого результата - например, если у вас есть в некоторых перегрузках сети, проходящих через видео, вы можете получать сегменты более низкого качества, которые вам, вероятно, не нужны для видео, которое вы будете смотреть несколько раз.

Вы можете скачать рекламировать или воспроизводить видео, заставляя поток всегда выбирать одно из указанных разрешений c с помощью селектора дорожек. Документация ExoPlayer включает некоторую информацию здесь:

В более старом сообщении в блоге (2 года, но часть DownloadHelper по-прежнему актуальна) , Я думаю), Google предоставляет информацию о том, как использовать DownloadHelper - https://medium.com/google-exoplayer/downloading-adaptive-streams-37191f9776e.

Это включает в себя пример:

// Replace with HlsDownloaderHelper or SsDownloadHelper if the stream is HLS or SmoothStreaming
DownloadHelper downloadHelper = 
    new DashDownloadHelper(manifestUri, manifestDataSourceFactory);
downloadHelper.prepare(
    new Callback() {
      @Override
      public void onPrepared(DownloadHelper helper) {
        // Preparation completes. Now other DownloadHelper methods can be called.
        List<TrackKey> trackKeys = new ArrayList<>();
        for (int i = 0; i < downloadHelper.getPeriodCount(); i++) {
          TrackGroupArray trackGroups = downloadHelper.getTrackGroups(i);
          for (int j = 0; j < trackGroups.length; j++) {
            TrackGroup trackGroup = trackGroups.get(j);
            for (int k = 0; k < trackGroup.length; k++) {
              Format track = trackGroup.getFormat(k);
              if (shouldDownload(track)) {
                trackKeys.add(new TrackKey(i, j, k));
              }
            }
          }
        }
        DownloadAction downloadAction = downloadHelper.getDownloadAction(null, trackKeys);
        DownloadService
            .startWithAction(context, MyDownloadService.class, downloadAction, true);
      }

      private boolean shouldDownload(Format track) {...}

      @Override
      public void onPrepareError(DownloadHelper helper, IOException e) {...}
    });

Код выше смотрите на файл манифеста - это индексный файл для DA SH или HLS, который перечисляет отдельные дорожки и предоставляет информацию, например URL-адреса, для их поиска.

Он проходит по каждой дорожке, которую находит и вызывает функция, которую вы можете определить, если хотите решить, включать или исключать эту дорожку из загрузки.

Чтобы использовать выбор дорожки при воспроизведении потокового видео, вы можете управлять этим программно, используя DefaultTrackSelector: https://exoplayer.dev/track-selection.html. Эта ссылка содержит пример выбора SD-видео и немецкой звуковой дорожки:

trackSelector.setParameters(
    trackSelector
        .buildUponParameters()
        .setMaxVideoSizeSd()
        .setPreferredAudioLanguage("deu"));

Стандартный проигрыватель также позволяет пользователю выбирать дорожку из элементов управления, если вы отображаете элементы управления - демонстрационное приложение ExoPlayer () включает это функциональность и пользовательский вид должны выглядеть примерно так:

enter image description here

Одно примечание - потоковая передача ABR довольно сложна и требует дополнительной обработки и хранения на стороне сервера. Если вы планируете использовать только один уровень качества, возможно, имеет смысл просто транслировать или загружать видео в формате mp4 et c.

.
...