http-live-streaming - Video.js HLS 选择质量低于预期的 TS 片段

标签 http-live-streaming video.js bandwidth

我正在使用 video.js 播放 m3u8 文件中具有多种质量的 HLS 视频流。我注意到 video.js 选择的质量低于给定质量的预期。我用另一个 HLS 播放器(Chrome 的“Native MPEG-Dash + HLS Playback”扩展)检查了相同的流和带宽,它提供了一个档次的质量,没有缓冲。这是一致的。

我还修改了 m3u8 文件,作弊,篡改了规定的带宽,以反射(reflect)相关 TS 片段的带宽比实际的要低。然后我在相同的条件下再次播放视频。这次 video.js 捕获了作弊的机会,选择了更高质量的视频,仍然没有缓冲。我的结论是,虽然video.js能够提供更高的质量,但它选择了较低质量的文件,可能是为了安全起见,比其他播放器具有更高的安全裕度。

问题:如何降低 video.js 的安全裕度?与总是播放较低质量的内容相比,我更喜欢较高的质量但存在一定的缓冲风险。

最佳答案

编辑:这似乎不适用于 iOS 中的 Safari。但它可能仍然有帮助。

——

我确实花了很多年时间才花时间逐步完成所有 video.js 代码并最终弄清楚为什么会发生这种情况,但这绝对是值得的!

启用日志记录!

首先,我建议启用调试日志记录。您可以在控制台中输入此内容,或将其合并到您网站的 JS 中。这将向您显示有关它为您做出的决定的详细信息。不要忘记在生产时将其关闭。

videojs.log.level('debug')

VideoJS 启发式

VideoJS 通过基于启发式排除一些视频轨道(表示)来确定要播放的第一个片段。

  • 它将排除已知带宽小于文件带宽的表示(以尝试防止缓冲)。
  • 默认情况下,它会排除屏幕上视频的宽度和高度小于视频文件的表示形式。

但是,默认情况下,它不会使用设备像素比(在典型的智能手机或视网膜显示屏上可能为 2 或 3)来计算所显示播放器的宽度和高度,除非您启用 useDevicePixelRatio 选项。

因此,对于我的 8 秒循环视频,它将首先选择 360px 版本而不是 1080 版本。而且看起来很糟糕!

TLDR;

因此,一旦我设置了这两个选项,我的手机上就会得到 1080 的视频大小,但在分辨率为 1 倍的模拟旧手机上会得到较小的 720。

hls: {   
   limitRenditionByPlayerDimensions: true,
   useDevicePixelRatio: true
}

更多选项

您还可以将以下选项添加到 hls。我不会推荐带宽,除非您确实需要忽略带宽并仅根据播放器的尺寸选择版本:

useNetworkInformationApi
Uses browser API to estimate bandwidth. This maxes out at 10Mbps (to avoid [fingerprinting][1]) but if video.js thinks the bandwidth is higher based on observation it will use the higher value.

bandwidth
Override bandwidth estimate. To make the player ignore bandwidth when making decisions about which version to pick you can set this to `bandwidth: 10e6` which is 10Mbps or even `Number.MAX_VALUE`

我刚刚向相关的 Github 问题添加了注释 How does videoJS determines quality of first segment?建议更改默认值或改进文档。

关于http-live-streaming - Video.js HLS 选择质量低于预期的 TS 片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67890641/

相关文章:

video-streaming - AVPlayer - 获取可用带宽/比特率流的列表并强制其中之一

youtube - Video.js YouTube 视频

ruby-on-rails - 测量 SAAS 应用带宽使用情况

tcp - 用户带宽和下载间隔之间的权衡

node.js - Nodejs + ffmpeg 如何消除直播中的失真

用于直播的 Azure MediaServices - 延迟时间很长

ffmpeg - 循环图像 ffmpeg HLS

javascript - 如何将 360 视频插入 video.js

html - 为什么我在 IE9 中播放 Video.js 时遇到问题

Javascript 文件大小,这有什么区别吗?