javascript - video标签如何确定canplay需要多少缓冲
问题描述
我正在为我的视频使用 2 秒的块。这些块被分解成 WebSocket 消息,我试图让视频播放器立即播放而不等待整个块。我添加了一个延迟,并看到缓冲区随着每条消息而增加,但它仍然在等待整个块播放之前。
在播放之前需要多少缓冲区,video.canplay
有没有办法减少这个数量,所以如果它有任何缓冲区,它会播放它?
解决方案
一开始可能值得一提的是,对于 IP OTT 流媒体视频来说,2 秒实际上是非常好的延迟 - 你将很难让它比使用当今技术的流媒体解决方案低得多。
如果您需要实时视频,那么 WebRTC 等技术是常用的方法——它们以视频质量换取延迟。
更详细地查看您的问题,如今大多数视频都是使用 HLS 或 DASH 流式传输的。这些流式传输协议将视频分成片段或片段,这些片段由 HTML5 视频播放器(如 DASH.js)读取,并使用媒体源扩展机制 (MSE) 馈送到浏览器视频播放器。视频标签通常不会像评论中提到的那样直接将片段或片段设置为 src。
决定视频需要多长时间才能开始播放的主要因素是片段的大小以及视频想要确保播放不中断的缓冲区量。
大多数播放器都会有一些方法来配置后者 - 例如 DASH.JS 有方法 MediaPlayer.updateSettings 并且文档包括一个示例:
player.updateSettings({
streaming: {
liveDelayFragmentCount: 8
abr: {
maxBitrate: { audio: 100, video: 1000 }
}
}
});
(来自:https ://cdn.dashjs.org/latest/jsdoc/module-MediaPlayer.html )
现在还有一个新标准 CMAF,它适用于 HLS 和 DASH,并允许更低的粒度,这意味着播放器甚至可以在收到完整片段之前开始播放视频。
CMAF 本质上允许可解码视频块的大小更小,因此您需要在解码器和播放器开始工作之前接收更少的内容 - 它在 MPEG 标准中进行了描述(https://mpeg.chiariglione.org/standards /mpeg-a/common-media-application-format)和下图从这个描述给出了一个很好的说明:
值得注意的是,由于 CMAF 相对较新,因此跨打包程序、服务器端以及客户端跨播放器和设备的支持可能不像您现在需要的那样广泛。
推荐阅读
- ruby-on-rails - rails puma nginx 111:连接被拒绝
- c - 如果二进制文件的内容出现在另一个二进制文件中,如何在 C 中搜索?
- c# - 从 XMLDocument 中提取数据
- asp.net - 使用存储过程将数据表中的数据和声明的变量插入表中
- ruby-on-rails - 如何在rails json的两个表中插入多个记录并将数据保存
- matlab - 如何使用 cconv 在 2 个函数之间进行循环卷积?
- angular - Angular - 防止模板渲染时元素颜色闪烁
- javascript - 1-many 关系的前向访问通常是如何实现的?
- unit-testing - 如何测试 rails view-helper 方法的 xss 保护
- java - 删除 ArrayList 之间的关系