android - 在 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
解决方案
看起来您的用例是 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 标签不存在于实时播放列表中,表示新媒体文件将在可用时添加到索引文件中。
推荐阅读
- java - 尝试从 Spring 中的存储库调用 findAll 时,junit 中的空指针异常
- android - 使用 Dagger 在 ViewPager 子片段之间共享模型
- apache-spark - spark + cassandra 上的性能相关问题(JAVA 代码)
- reactjs - 在 yarn start 命令中显示错误说 This package doesn't seem to be present in your lockfile; 尝试进行安装以更新您的分辨率
- xml - 后代包含父文本的所有节点的XPath?
- python - 如何从数据框制作 3D 条形图
- c# - 如何检查.NET中特定时区是否存在一个小时
- mysql - 如何使用 mysql 中的周数获取开始和结束周日期?
- python-3.x - 无法使用托管在 heroku 上的电报机器人刮掉歌词
- c++ - vivado hls 的可合成版本的问题