视频标签如何确定它需要多少缓冲区才能播放

How does the video tag determine how much buffer it needs for 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 相对较新,跨打包器、服务器端以及客户端的播放器和设备的支持可能没有您现在需要的那么广泛。