video标签如何确定canplay需要多少缓冲

Posted

技术标签:

【中文标题】video标签如何确定canplay需要多少缓冲【英文标题】:How does the video tag determine how much buffer it needs for canplay 【发布时间】:2021-01-28 01:35:16 【问题描述】:

我正在为我的视频使用 2 秒的块。这些块被分解成 WebSocket 消息,我试图让视频播放器立即播放而不等待整个块。我添加了一个延迟,并看到缓冲区随着每条消息的增加而增加,但它仍在等待整个块在播放之前。

video.canplay 在播放之前需要多少缓冲区,有没有办法减少这个数量,所以如果它有任何缓冲区,它就会播放它?

【问题讨论】:

(1) 视频标签要求 URL 为 .src,因此您如何播放“块”并不明显。 (2) 等待 2 秒的视频下载有什么问题? 【参考方案1】:

首先值得一提的是,对于 IP OTT 流媒体视频而言,2 秒实际上是非常好的延迟 - 与使用当今技术的流媒体解决方案相比,您将很难将其降低很多。

如果您需要实时视频,那么 WebRTC 等技术是常用的方法 - 它们以视频质量换取延迟。

更详细地了解您的问题,如今大多数视频都是使用 HLS 或 DASH 进行流式传输的。这些流式传输协议将视频分成片段或片段,这些片段由 html5 视频播放器(如 DASH.js)读取,并使用媒体源扩展机制 (MSE) 馈送到浏览器视频播放器。视频标签通常不会像 cmets 中提到的那样直接将片段或片段设置为 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 相对较新,因此跨打包程序、服务器端以及客户端跨播放器和设备的支持可能不像您现在需要的那样广泛。

【讨论】:

以上是关于video标签如何确定canplay需要多少缓冲的主要内容,如果未能解决你的问题,请参考以下文章

jQuery如何操作video标签里面的autoplay属性

如何确定 linux 串行端口上剩余的写入/输出缓冲区空间量?

v-html里的video手机打开是白屏

为 <video> 对象设置缓冲

html5 video标签如何在可以在视频完全加载进浏览器后执行JS函数?

video/audio API 事件