首页 > 解决方案 > 在 exoplayer 中播放动态 url

问题描述

我有一个网址,它每 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

标签: androidhttp-live-streamingexoplayer

解决方案


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

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

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

客户端必须定期重新加载媒体播放列表文件以了解当前可用的媒体,除非它包含值为 VOD 的 EXT-X-PLAYLIST-TYPE 标记,或者值为 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


推荐阅读