Воспроизведение динамического URL-адреса в exoplayer

#android #http-live-streaming #exoplayer

Вопрос:

у меня есть URL-адрес, и он меняется каждые 3 секунды. Я делаю запрос на URL-адрес каждые 2 секунды и обновляю URL-адрес. 3 секунды становятся допустимым файлом m3u8.Только параметры запроса в URL-адресе меняются каждые 3 секунды. Я возвращаю тот же пост, только по другой ссылке.

 DataSource.Factory dataSourceFactory = new DefaultHttpDataSourceFactory();
        HlsMediaSource hlsMediaSource =
                new HlsMediaSource.Factory(dataSourceFactory)
                        .createMediaSource(MediaItem.fromUri(dataItem.getVideo()));

        concatenatingMediaSource = new ConcatenatingMediaSource();
        concatenatingMediaSource.addMediaSource(hlsMediaSource);

        player.setMediaSource(concatenatingMediaSource);

        player.prepare();
        player.setPlayWhenReady(true);

private void setLiveStreamData(String id) {
        Call<LiveStreamData> liveStreamDataCall = RetrofitBuilder.newCreate().getStreamLive(id);
        liveStreamDataCall.enqueue(new Callback<LiveStreamData>() {
            @Override
            public void onResponse(@NotNull Call<LiveStreamData> call, @NotNull Response<LiveStreamData> response) {
                if (response.isSuccessful() amp;amp; response.body() != null) {
                    DataSource.Factory dataSourceFactory = new DefaultHttpDataSourceFactory();
                    HlsMediaSource hlsMediaSource =
                            new HlsMediaSource.Factory(dataSourceFactory)
                                    .createMediaSource(MediaItem.fromUri(response.body().getUrl()));
                    concatenatingMediaSource.addMediaSource(hlsMediaSource);

                }
            }

            @Override
            public void onFailure(@NotNull Call<LiveStreamData> call, @NotNull Throwable t) {
                Log.e(TAG, "onFailure: ", t);
            }
        });
    }
 

Возможно, я не смогу правильно добавить экзоплаер. потому что через 3 секунды exoplayer продолжает воспроизводить первую ссылку и выдает ошибку. Через 3 секунды старый URL-адрес больше не возвращает файл m3u8.
Как я могу правильно настроить такую структуру?

  Playback error
          com.google.android.exoplayer2.ExoPlaybackException: Source error
 

Ответ №1:

Похоже, что ваш вариант использования-это прямой поток HLS.

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

На самом деле это указано в RFC HLS вместе с инструкциями, чтобы игрок не генерировал слишком много запросов и не перегружал сервер:

Клиент ДОЛЖЕН периодически перезагружать файл списка воспроизведения мультимедиа, чтобы узнать, какой носитель доступен в данный момент, если только он не содержит тег типа СПИСКА воспроизведения EXT-X со значением VOD или значением СОБЫТИЯ, а также присутствует тег EXT — X-ENDLIST.

Однако клиент НЕ ДОЛЖЕН пытаться перезагружать файл списка воспроизведения чаще, чем указано в этом разделе, чтобы ограничить коллективную нагрузку на сервер.

(HLS RFC: https://datatracker.ietf.org/doc/html/rfc8216)

Одна из важных проверок заключается в том, чтобы убедиться, что манифест правильно отформатирован для прямых трансляций и, в частности, что он не содержит тега EXT-X-ENDLIST, как указано выше и в руководстве Apple HLS:

Во время сеансов в реальном времени индексный файл обновляется путем удаления URI носителей из файла по мере создания и предоставления новых медиафайлов. Тег EXT-X-ENDLIST отсутствует в живом списке воспроизведения, указывая, что новые медиафайлы будут добавлены в индексный файл по мере их появления.

Более подробная информация, включая вышесказанное, по этой ссылке: https://developer.apple.com/documentation/http_live_streaming/example_playlists_for_http_live_streaming/live_playlist_sliding_window_construction

Комментарии:

1. да, я хочу сделать именно это.но моя проблема в том, что файлы m3u8 по частям поставляются с разными URL-адресами. #EXTM3U #EXT-X-VERSION:7 #EXT-X-MEDIA-SEQUENCE:7 #EXT-X-TARGETDURATION:1 #EXTINF:1.001, https://---.url/5d869800eb2e1b4/7.ts #EXTINF:1.001, https://---.url/500ad869800eb2e1b4/8.ts #EXTINF:1.001, https://---.url/5869800eb2e1b4/9.ts #EXTINF:1.001, https://---.url/69800eb2e1b4/10.ts #EXTINF:1.001, https://---.url/800eb2e1b4/11.ts #EXTINF:1.001, https://---.url/ad869800eb2e1b4/12.ts Нужно ли мне извлекать данные по частям и добавлять их байт за байтом заранее? Я так растеряна.

2. Если это правильно отформатированный файл m3u8, то вам просто нужно предоставить файл m3u8 в ExoPlayer, и он обработает его. Вам также необходимо убедиться, что ваша реализация exoplayer имеет зависимость от HLS — см. Здесь: exoplayer.dev/hls.html