【问题标题】:Playing dynamic url in exoplayer在 exoplayer 中播放动态 url
【发布时间】:2023-06-23 12:22:01
【问题描述】:

我有一个网址,它每 3 秒更改一次。我每 2 秒向 url 发出一次请求并刷新 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() && 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);
            }
        });
    }

我可能无法正确添加 exoplayer。因为 3 秒后 exoplayer 继续播放第一个链接并给出错误。 3 秒后,旧 url 不再返回 m3u8 文件。 如何正确设置这样的结构?

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

【问题讨论】:

    标签: android http-live-streaming exoplayer


    【解决方案1】:

    看起来您的用例是一个 Live HLS 流。

    对于 Live,您不必担心在更新时手动重新请求 mpd 文件,因为播放器会识别它是直播流并自行请求更新。

    这实际上是在 HLS RFC 以及指南中指定的,因此播放器不会生成太多请求并导致服务器过载:

    客户端必须定期重新加载媒体播放列表文件以了解 当前可用的媒体,除非它包含 EXT-X- PLAYLIST-TYPE 标记,其值为 VOD,或值为 EVENT,并且 EXT-X-ENDLIST 标记也存在。

    但是,客户端不得尝试重新加载播放列表文件 经常比本节规定的,以限制 服务器上的集体负载。

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

    一项重要的检查是确保清单的格式正确,适用于实时流,尤其是它不包含上述和 Apple HLS 指南中所述的 EXT-X-ENDLIST 标记:

    在实时会话中,通过从文件中删除媒体 URI 来更新索引文件,因为新媒体文件被创建并可用。 EXT-X-ENDLIST 标签不在实时播放列表中,表示新媒体文件将在可用时添加到索引文件中。

    更多信息,包括以上链接:https://developer.apple.com/documentation/http_live_streaming/example_playlists_for_http_live_streaming/live_playlist_sliding_window_construction

    【讨论】:

    • 是的,我想这样做。但我的问题是逐个 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 需要一块一块地拉取数据,然后逐个字节地添加吗?我很困惑。
    • 如果它是正确格式的 m3u8 文件,那么您只需将 m3u8 文件提供给 ExoPlayer,它就会处理它。您还需要确保您的 exoplayer 实现具有 HLS 依赖项 - 请参见此处:exoplayer.dev/hls.html