#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