关于HLS直播Buffer PlayQueue多图分析

news2024/11/17 13:29:11

文章目录

  • 前言
    • hls配置
    • m3u8
  • 单码流
    • 1.开始进入播放页,默认是暂停态
    • 2.等几十秒后的状态
    • 3.开始播放后的状态
    • 其他
  • 多码流

前言

hls配置

backBufferLength:60 // 默认无限制 缓存媒体播放后要保留的最长持续时间(以秒为单位)。
liveSyncDurationCount:3 // 默认值3 播放将从片段 N-3 开始,N 是实时播放列表的最后一个片段。即开始播放时提前下载最后三个。
maxBufferLength: 30 // 默认30s 如果缓冲区长度小于此值,将加载一个新片段。跟maxBufferSize有关系可能打印30s单不能大于maxBufferSize。
maxMaxBufferLength: 600 // 默认600s 兜底方案最大只能存储这么多。
maxBufferSize: 60000000  // 默认值:60 MB 如果缓冲区大小大于此值,则不会加载任何片段。
// 根据级别比特率计算我们可以从这个负载级别获得的最大缓冲区长度。
// 最后都会转换为时间,缓冲区不超过60 MB
// 可能超过30秒 	
protected getMaxBufferLength(levelBitrate?: number): number {
  let maxBufLen;
  if (levelBitrate) {
    maxBufLen = Math.max(
      (8 * config.maxBufferSize) / levelBitrate,
      config.maxBufferLength
    );
  } else {
    maxBufLen = config.maxBufferLength;
  }
  return Math.min(maxBufLen, config.maxMaxBufferLength);
} 
// 当前buffer的时间长度 单位秒
const bufferLen = bufferInfo.len;
// 计算出的最大buffer时间长度 单位秒
const maxBufLen = this.getMaxBufferLength(levelInfo.maxBitrate);
if (bufferLen >= maxBufLen) {
      return;
}

上面的结果是如果单码流就是配置的maxBufferLength: 30,没有入参levelBitrate

如果是多码流,会根据码流的levelBitrate计算,例如 比特率 8247438 bit/s = 1Mb/s

约等于58秒

m3u8

每个TS 6秒

20个TS

每个TS大约55.9MB/10 = 5.59MB

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:3396240
#EXTINF:6.000000,
segment_4_20230211_1676110830.ts
#EXTINF:6.000000,
segment_4_20230211_1676110836.ts
#EXTINF:6.000000,
segment_4_20230211_1676110842.ts
#EXTINF:6.000000,
segment_4_20230211_1676110848.ts
#EXTINF:6.000000,
segment_4_20230211_1676110854.ts
#EXTINF:6.000000,
segment_4_20230211_1676110860.ts
#EXTINF:6.000000,
segment_4_20230211_1676110866.ts
#EXTINF:6.000000,
segment_4_20230211_1676110872.ts
#EXTINF:6.000000,
segment_4_20230211_1676110878.ts
#EXTINF:6.000000,
segment_4_20230211_1676110884.ts
#EXTINF:6.000000,
segment_4_20230211_1676110890.ts
#EXTINF:6.000000,
segment_4_20230211_1676110896.ts
#EXTINF:6.000000,
segment_4_20230211_1676110902.ts
#EXTINF:6.000000,
segment_4_20230211_1676110908.ts
#EXTINF:6.000000,
segment_4_20230211_1676110914.ts
#EXTINF:6.000000,
segment_4_20230211_1676110920.ts
#EXTINF:6.000000,
segment_4_20230211_1676110926.ts
#EXTINF:6.000000,
segment_4_20230211_1676110932.ts
#EXTINF:6.000000,
segment_4_20230211_1676110938.ts
#EXTINF:6.000000,
segment_4_20230211_1676110944.ts

单码流

我用的最后一个level(level4)。

1.开始进入播放页,默认是暂停态

实际如下图,分析一下 1:42/2:00说明什么?

  • 2:00说明当前一个Media Playlist 有 20个Ts * 每个TS 6秒 = 120S,即从我下载这个Media Playlist,最少已经直播了2分钟了。
  • 1:42说明我要从倒数第三个TS文件播放 120S - 3个TS * 6秒 = 1:42,即我比直播最少延迟了 18 s

这里的初始下载并缓存3个ts取决于配置liveSyncDurationCount:3

2.等几十秒后的状态

图中的1:42代表我们还是没有播放还是上面的初始状态。

2:30: 代表直播流媒体服务器已经直播到相对2:30秒了,即实际上我们大概等了30秒了,延迟了48秒

下图看到我们的播放轴还在1:42,下载了6个ts,缓存了6个ts,也就是我们等了30s,按理说应该多下载5个ts,为什么这里只多下载了3个呢,最后面的2个没有下载?

这里跟maxBufferLength = 30有关系,小于30s将下载新片段。

往前最多下载多少个ts数,取决于能最多的缓存ts数,所以一共下了6个ts,后边就不下了。

3.开始播放后的状态

按照上面一样的分析方式,下图为播放了一会儿后的状态。

视频播放到2:06,流媒体实时播放到3:00,对比上面我们从1:42开始播的,即播放了24s延迟了54秒

Buffer了10个ts,即大约60s,其中有播放过的16s。即往前buffer6个ts 36s,往后buffer了4个ts 16s。

播放一段时间后

总共缓存了16个ts,其中播放完的缓存了10个 = 60s,这取决于配置backBufferLength:60往前缓存了6个取决于配置maxBufferLength = 30,针对单码流是这样的。多码流的话去看下配置中的解析。

其他

暂停长时间不播,或者模拟中间网速不好没下载到ts的情况,然后再继续播放。

**补个刚好的图,**即将跳跃到最新位置

跳跃后的状态

立马发出3个请求取决于配置liveSyncDurationCount:3,并且往前的缓存基本上也都是3了

多码流

基本跟单码流差不多。具体看截图哈。

往前最多缓存了10ts = 60秒,因为这是多码流所以是按照60M/ level的比特率 与配置的30s取最大值,这里为58s。所以大约是10个ts。

看下跳跃情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/339434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【优化算法1】模拟退火算法(含MATLAB实例)

模拟退火算法(含MATLAB实例)模拟退火算法1.1 简介1.2 原理1.3 MATLAB实例模拟退火算法 1.1 简介 模拟退火算法的思想借鉴于物体退火过程:当温度很高时,物体内能比较大,其内部粒子处于快速无序运动状态;当…

【计算机网络期末复习】第一章 概述

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📣专栏定位:为想复习学校计算机网络课程的同学提供重点大纲,帮助大家渡过期末考~ 📚专栏地址: ❤️如果有收获的话,欢迎点…

第一个C语言代码(visual studin创建调试以及项目文件功能讲解)

这里我主要使用visual Studio进行编程 目录 一.创建项目 二.编写代码 1.代码编写 2.代码分析 3.main() 4.注释符 5.{} 花括号 6.声明 7.赋值 8.printf()函数 9.return 0; 一.创建项目 这里大家可能会比较疑惑,为啥都是C,没看见C的项目&…

C++:AVL树

AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下,时间复杂度为O(N); 两位俄罗斯的数学家G.M.Ade…

机试_4_数学问题

在机试中,我们经常会面对这样一类问题,它们并不涉及很深奥的算法和数据结构,而只与数理逻辑相关,将这类题目称为数学问题。 这类问题通常不需要用到特别高深的数学知识,而只需要掌握简单的数理逻辑知识。本文重点记录…

解决访问GitHub时出现的“您的连接不是私密连接”的问题!

Content问题描述解决办法问题描述 访问github出现您的连接不是私密连接问题,无法正常访问,如下图所示: 解决办法 修改hosts文件。hosts文件位于:C:\Windows\System32\drivers\etc\hosts 首先在https://www.ipaddress.com/查找两…

Linux之case语句和循环语句

一、case语句1.case语句的结构case语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句只是判断一个…

Linux高级命令之查找文件命令

查找文件命令学习目标能够说出查找文件使用的命令1. find命令及选项的使用命令说明find在指定目录下查找文件(包括目录)find命令选项:选项说明-name根据文件名(包括目录名)字查找find命令及选项的效果图:2. find命令结合通配符的使用通配符:是一种特殊语句,主要有星…

Linux中几个在终端中有趣的命令

uhh…最近我不知道该更新些什么,所以就更新Linux几个很有趣的命令 文章目录前言1.命令:sl安装 sl输出2. 命令:telnet命令:fortune安装fortune4.命令:rev(反转)安装rev5. 命令:factor…

第二章 Opencv图像处理基本操作

目录1.读取图像1-1.imread()方法2.显示图像2-1.imshow()方法2-2.waitKey()方法2-3.destroyAllWindows()方法2-4.小总结3.保存图像3-1.imwrite()方法4.查看图像属性4-1.常见的三个图像属性1.读取图像 要对一幅图像进行处理,第一件事就是要读取这幅图像。 1-1.imread(…

Vue驼峰与短横线分割命名中有哪些坑

目录 0.前言 驼峰和短横线分割命名注意事项 组件注册命名 父子组件数据传递时命名 父子组件函数传递 0.前言 Vue驼峰命名法指的是将变量以驼峰形式命名,例如 userName、userId 等,而短横线分隔符法则指的是用短横线分隔变量名,例如 user…

Python 高级编程之生成器与协程进阶(五)

文章目录一、概述二、生成器1)生成器和迭代器的区别2)生成器创建方式1、通过生成器函数创建2、通过生成器表达式创建3)生成器表达式4)yield关键字5)生成器函数6)return 和 yield 异同7)yield的使…

RocketMQ底层源码解——事务消息的实现

1. 简介 RocketMQ自身实现了事务消息,可以通过这个机制来实现一些对数据一致性有强需求的场景,保证上下游数据的一致性。 以电商交易场景为例,用户支付订单这一核心操作的同时会涉及到下游物流发货、积分变更、购物车状态清空等多个子系统…

Linux高级命令之压缩和解压缩命令

压缩和解压缩命令学习目标能够使用tar命令完成文件的压缩和解压缩1. 压缩格式的介绍Linux默认支持的压缩格式:.gz.bz2.zip说明:.gz和.bz2的压缩包需要使用tar命令来压缩和解压缩.zip的压缩包需要使用zip命令来压缩,使用unzip命令来解压缩压缩目的:节省磁盘空间2. ta…

如何在VMware虚拟机上安装运行Mac OS系统(详细图文教程)

一、安装前准备 虚拟机运行软件:VMware Workstation Pro,版本:16.0.0 。VMware Mac OS支持套件:Unlocker。Mac OS系统镜像。 如果VMware 在没有安装Unlocker的情况下启动,在选择客户机操作系统时没有支持Mac OS的选项…

Mock.js初步使用(浏览器端)

Mock.js&#xff1a;生成随机数据&#xff0c;拦截 Ajax 请求。官方地址&#xff1a;http://mockjs.com/第一个demodemo.html<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>mockjs demo</title> </head> <…

STM32单片机OLED显示

OLED接口电路STM32单片机OLED显示程序源代码#include "sys.h"#define OLED_RST_Clr() PCout(13)0 //RST#define OLED_RST_Set() PCout(13)1 //RST#define OLED_RS_Clr() PBout(4)0 //DC#define OLED_RS_Set() PBout(4)1 //DC#define OLED_SCLK_Clr()PCout(15)0 //SCL…

详解Python文件pyinstaller打包

本文python文件打包用到的是pyinstaller库并且以如下格式的文件为例 其中bird.py用到了images文件夹当中的png pyinstaller有两种打包方式: 方法1:文件夹模式 onedir 在终端用命令 pyinstaller -D flappybird.py执行完后文件格式如下 可以看到多了.idea,pycache,build,dis…

Linux系列 备份与分享文档

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.备份与分享文档 1.使用压缩和解压缩工具 &#xff08;1&…

Java零基础教程——数据类型

目录数据类型数据类型的分类运算符算术运算符符号做连接符的识别自增、自减运算符赋值运算符关系运算符逻辑运算符短路逻辑运算符三元运算符运算符优先级数据类型 数据类型的分类 引用数据类型&#xff08;除基本数据类型之外的&#xff0c;如String &#xff09; 基本数据类…