android - 使用 HLS 的实时流媒体性能 - 增加流的实时窗口意味着什么?
问题描述
我目前正在尝试通过“增加实时窗口”来改善实时流性能/重新缓冲问题,以避免太靠近流的实时边缘;但是我真的不明白增加实时窗口意味着什么,或者我什至会在哪里这样做(我猜清单文件中有一些东西?)。我了解 HLS 是什么以及它是如何工作的(大部分情况下),但我显然在这里遗漏了一条有价值的信息。
我一直在做研究,并遇到了以下实时窗口建议:
- iOS -这个堆栈溢出答案- >应该在客户端防止或处理这些错误(最后一段):
如果想要阻止它们,唯一的方法可能是手动将实时缓冲区的边缘及时设置回几秒钟。
- android - 在exoplayer hls 文档中->创建高质量 HLS 内容(最后一个标题/页面底部):
提供一个长寿命的窗口。一分钟或更长时间很棒
伟大的!是的,这些建议是有道理的。离实时边缘太近不一定是最好的主意..尤其是对于那些网络连接不佳的人;但是现在,我们该怎么做呢?
感谢您的帮助、评论等!
解决方案
直播性能可能意味着不同的事情,具体取决于您的目标:
- 如果您的目标是最大程度地减少由于下载视频延迟而导致缓冲或暂停播放的机会,那么在开始播放之前缓冲更多的流将对此有所帮助。
- 如果您的目标是减少延迟,例如让现场体育赛事尽可能接近实时,那么您通常希望尽快开始播放。
有帮助的是,如果被问到,您经常会发现客户和客户都想要。一些基于 CMAF 协议的最新低延迟方法有助于实现这一点,但最终,缓冲与延迟通常总是需要权衡取舍。
专注于第一个,然后我认为您在上面和评论中的理解是正确的-本质上在清单中提供更大的片段集将允许播放器在开始播放之前选择更多缓冲。
例如,从您上面提到的链接修改清单,此清单提供播放器信息以允许它最多请求 3 个段:
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10.0,
fileSequence1.ts
#EXTINF:10.0,
fileSequence2.ts
#EXTINF:10.0,
fileSequence3.ts
虽然这个提供了 6 个部分的信息:
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10.0,
fileSequence1.ts
#EXTINF:10.0,
fileSequence2.ts
#EXTINF:10.0,
fileSequence3.ts
#EXTINF:10.0,
fileSequence4.ts
#EXTINF:10.0,
fileSequence5.ts
#EXTINF:10.0,
fileSequence6.ts
请注意,播放器可以简单地提前开始播放,例如在一两个片段之后,如果它检测到或以某种方式知道它有一个高质量的流连接。
还值得注意的是,“实时窗口”一词在不同的上下文中可能具有多种含义。
如上所述,一个关键的解释显然是服务器保持给定段的可用性以允许客户端下载它的时间量。随着实时清单被修改并且较旧的片段退出,它们保留多长时间或保留多少,是最明显的“窗口”。
了解“窗口”在多长时间后服务器将尊重对给定段的请求也很有用。这显然是竞争条件的关键,但对于“CatchUp”或“重新开始”类型的服务也很重要,具体取决于它们的实现方式。
推荐阅读
- c++ - 为什么不是 cmath 的 pow 和 sqrt 模板?
- python - 将类属性设置为 lambda 属性时,如何让 Python 接受每个值?
- jenkins - 如何从 Jenkins 声明式管道替换 Artifactory File Spec “Spec Vars”
- javascript - 如何从 JS 中的 2 个对象数组中找到唯一元素
- r - 如何在我的dashboardHeader() 上放置图像(徽标)?
- java - 双向关系的垃圾收集
- reactjs - React Native Hook 问题 - 错误:无效的钩子调用。Hooks 只能在函数组件的主体内部调用
- linux - 在 bash 脚本中使用 pssh -I 选项的问题
- php - 如何组合来自两个独立 MYSQL 数据库的结果?
- javascript - 使用 json.encode 将数组从 php 传递到 Javascript 时出现未定义类型错误