当前位置: 首页 > news >正文

音视频学习(二十四):hls协议

基本原理

HLS协议通过将视频文件切分成多个小的媒体段(通常是10秒左右的.ts文件),并通过HTTP传输给客户端。视频播放过程中,客户端按顺序请求这些小段文件来逐步播放整个视频流。HLS还支持多种码率,以便适应不同网络条件的动态调整(自适应流)。

工作流程

HLS协议的基本工作流程包含以下几个步骤:

  1. 视频切片
    • 视频源文件通常是一个完整的长视频。
    • 视频文件被切割成若干个小的TS文件(MPEG-TS格式,通常每个视频片段持续10秒或更短)。
    • 这些切片(.ts文件)被存储在服务器上。
  2. 生成M3U8播放列表
    • 在切片完成后,生成一个以.m3u8为扩展名的播放列表文件,里面包含了TS片段的URL,客户端通过这个播放列表来加载视频片段。
    • .m3u8文件本质上是一个文本文件,列出了所有视频片段(或称“媒体段”)的URL地址,浏览器或播放器根据它来依次请求视频片段。
    • 还可以生成多种码率的M3U8文件,每种码率对应不同的网络条件。
  3. 客户端请求和播放
    • 客户端(如HLS支持的播放器或浏览器)请求.m3u8文件,播放器读取该文件并获取其中包含的视频片段链接。
    • 客户端根据当前网络状况,自动选择合适的码率进行播放。如果网络环境发生变化,播放器可以切换不同的码率流。

M3U8播放列表文件

M3U8文件是HLS的核心部分,它是一个UTF-8编码的播放列表,描述了视频段和相关的元数据。主要有两种类型的M3U8文件:

  • 主播放列表(Master Playlist):列出不同码率、不同分辨率的视频流。
  • 媒体播放列表(Media Playlist):每个流(一个码率)都有一个对应的媒体播放列表,列出具体的.ts文件。

基本结构

一个标准的 .m3u8 文件包含一系列以 #EXT 开头的扩展标记(例如:#EXT-X-VERSION#EXT-X-TARGETDURATION 等)和媒体段(视频片段)的 URL 链接。每个 .m3u8 文件包含的信息对播放流程至关重要,通常分为以下几种类型:

  • 播放列表头部(Header):定义播放器需要遵循的基本规则。
  • 媒体段(Media Segments):指向具体的视频片段(.ts 文件)的链接。
  • 播放列表尾部(Footer):包括结束标记等。

格式解析

头部信息

头部一般包含一些关于播放列表的全局信息,比如版本、最大时长等。

  • #EXTM3U: 每个 .m3u8 文件必须以这个标签开头,标识这是一个M3U播放列表。
  • #EXT-X-VERSION:<version>: 表示M3U8文件的版本号。版本号决定了该播放列表支持的特性。例如,#EXT-X-VERSION:3 表示使用 HLS 版本 3。
  • #EXT-X-TARGETDURATION:<duration>: 定义了每个媒体段的最大持续时间(单位为秒)。客户端用它来确定如何预缓存下一段内容。例如,#EXT-X-TARGETDURATION:10 表示每个段的最大持续时间为 10 秒。
  • #EXT-X-MEDIA-SEQUENCE:<sequence_number>: 指定媒体片段的起始序列号。每个媒体段的序号是递增的,通常从 0 开始。

媒体片段信息

每个媒体段(视频或音频片段)会在 .m3u8 文件中用 #EXTINF 标签标注,它表示该片段的持续时间(单位为秒)以及片段的文件名或URL。

  • #EXTINF:<duration>,: 这个标签后跟的是该视频片段的持续时间(以秒为单位)。例如,#EXTINF:10.0, 表示该片段的持续时间为 10 秒。
  • <media_segment_file>: 这部分指向媒体段文件的位置,通常是 .ts 文件的 URL。例如,segment1.tshttps://example.com/segment1.ts

例如:

#EXTINF:10.0,
segment1.ts
#EXTINF:10.0,
segment2.ts
#EXTINF:10.0,
segment3.ts

多码率支持(自适应流)

如果是一个支持多码率(或称自适应流)的 .m3u8 文件,则会包含多个播放列表,每个播放列表对应一个不同的码率(或分辨率)的视频流。

  • #EXT-X-STREAM-INF:: 这是主播放列表中的一行,标识一个子播放列表,并提供了相关的编码信息(如码率、分辨率等)。
  • BANDWIDTH=<bandwidth>: 指定该流的带宽需求,通常是以比特为单位。例如,BANDWIDTH=800000 表示这个流的带宽是 800 Kbps。
  • RESOLUTION=<width>x<height>: 指定视频的分辨率,例如 RESOLUTION=1920x1080

主播放列表文件会列出不同码率、不同分辨率的子播放列表链接。例如:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
low_quality.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1400000,RESOLUTION=1280x720
medium_quality.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2800000,RESOLUTION=1920x1080
high_quality.m3u8

结束标记

  • #EXT-X-ENDLIST: 这个标记表示播放列表的结束,特别用于点播(VOD)场景,表明媒体播放列表已结束,后续没有更多的媒体段。

加密与内容保护

  • #EXT-X-KEY: 用于指定加密信息,提供加密内容的密钥信息。例如,HLS支持AES-128加密,文件中的加密信息可以指定密钥的位置等:

示例

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
low_quality.m3u8#EXT-X-STREAM-INF:BANDWIDTH=1400000,RESOLUTION=1280x720
medium_quality.m3u8#EXT-X-STREAM-INF:BANDWIDTH=2800000,RESOLUTION=1920x1080
high_quality.m3u8

低码率流 (low_quality.m3u8) 示例

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
segment1.ts
#EXTINF:10.0,
segment2.ts
#EXTINF:10.0,
segment3.ts
#EXT-X-ENDLIST

常见的 .m3u8扩展标签

  • #EXT-X-DISCONTINUITY: 标记媒体段之间的时间戳或编码格式的不连续性。通常在不同的编码流之间使用。

  • #EXT-X-PROGRAM-DATE-TIME: 指定播放列表中某个时间点的实际日期和时间。

  • #EXT-X-ALLOW-CACHE:<YES|NO>: 指定客户端是否可以缓存媒体文件。

hls的特性

  • 自适应流:HLS支持多个不同码率的视频流,客户端根据当前带宽情况自动切换最佳码率,提供更好的观看体验。

  • 跨平台支持:HLS是基于HTTP协议,因此可以通过任何支持HTTP的客户端播放。它也得到广泛的浏览器和设备的支持(如iOS、Android、macOS、Windows等)。

  • 实时直播支持:HLS协议不仅支持视频点播(VOD),还可以支持实时直播流。

  • 广泛的CDN兼容性:因为HLS使用HTTP协议,它可以很容易地通过内容分发网络(CDN)进行分发,确保高效的视频传输。

  • 内容保护:HLS支持加密流,提供了对视频内容的保护,确保视频播放时不会被未经授权的用户访问。

hls的特点

优点:

  • 易于部署:HLS通过HTTP进行流媒体传输,几乎可以与任何Web服务器兼容,并且不需要特定的协议或协议支持。
  • 广泛支持:由于它是由苹果公司提出的,因此特别适用于iOS和macOS设备。此外,越来越多的浏览器和设备也支持HLS。
  • 自适应比特率:根据网络条件动态调整视频质量,避免播放卡顿。

缺点:

  • 延迟较高:HLS的延迟相对较高,尤其是实时直播场景中。通常会有15到30秒的延迟,虽然可以通过减少每段视频的长度来降低延迟,但代价是增加了请求次数和带宽消耗。
  • 效率问题:相比其他协议(如DASH),HLS的传输效率相对较低,特别是在高清和超高清视频内容中。
  • 视频切片的管理:在需要快速变化的直播场景中,视频切片的管理和更新可能会带来额外的复杂性。

HLS与其他流媒体协议对比

与RTMP(Real-Time Messaging Protocol)

  • HLS协议更适合基于HTTP传输的流媒体应用,并且具有较高的可扩展性。而RTMP主要用于低延迟的直播,通常在直播场景下使用较多。
  • HLS的延迟比RTMP要高。

与DASH(Dynamic Adaptive Streaming over HTTP)

  • DASH协议类似于HLS,也是基于HTTP的自适应流传输协议。DASH的优势是开源、标准化,且支持更细粒度的控制,但在设备兼容性上可能不如HLS广泛。

常见应用

  • 视频点播(VOD):HLS非常适合点播视频内容,特别是在需要跨多个平台(如iOS、Android、Web等)播放时。

  • 实时直播:通过HLS进行直播时,可以将直播内容分割成多个小片段,逐步传输给观众。

  • 视频监控:在一些视频监控应用中,HLS可以作为一种流媒体传输协议,用于将实时视频传输到监控平台或服务器。

相关文章:

音视频学习(二十四):hls协议

基本原理 HLS协议通过将视频文件切分成多个小的媒体段&#xff08;通常是10秒左右的.ts文件&#xff09;&#xff0c;并通过HTTP传输给客户端。视频播放过程中&#xff0c;客户端按顺序请求这些小段文件来逐步播放整个视频流。HLS还支持多种码率&#xff0c;以便适应不同网络条…...

UniDepth 学习笔记

摘要 准确的单目度量深度估计&#xff08;MMDE&#xff09;是解决三维感知和建模中下游任务的关键。然而&#xff0c;最近的MMDE方法的显著准确性仅限于其训练领域。这些方法存在适度的域间隙&#xff0c;也不能推广到看不见的域&#xff0c;这阻碍了它们的实际适用性。本文提出…...

PVE——OpenWRT 硬盘 size单位的调整

​​​​​ 问题&#xff1a;初始状态为120MB 还需要进行计算&#xff0c;如果通过图形界面添加磁盘会出现单位不变的情况。 进入命令行前记得给你的虚拟机拍照&#xff0c;防止误操作 通过ssh 进入PVE命令行 按需添加容量即可 不到1G 会显示M 超过1G 不是G整数均为M单位。 …...

Android-ImagesPickers 拍照崩溃优化

Android-ImagesPickers 作为老牌图片选择器&#xff0c;帮助了很多牛马宝宝&#xff0c;刚好最近用到了多相册选择以及拍照&#xff0c;可能是高版本机型问题&#xff0c;导致拍照后就闪退 原作者文章以及git Android实用视图动画及工具系列之九&#xff1a;漂亮的图片选择器…...

Linux dd 命令详解:工作原理与实用指南(C/C++代码实现)

这段代码是一个模仿 Linux dd 命令的工具&#xff0c;它用于在不同文件之间复制数据。dd 是一个非常强大的命令行工具&#xff0c;可以用于数据备份、转换和复制。下面我将详细解释这段代码的原理、实现方式以及如何运行和测试。 Linux dd 命令的工作原理 dd 命令是 Unix 和 …...

Golang学习历程【第一篇 入门】

Golang学习历程【第一篇 入门Hello World】 1. 学习文档2. Window 本地安装Go2.1 安装2.2 验证 3. 开发环境——VsCode3.1 VsCode 安装3.2 安装插件3.2.1 language 语言汉化插件安装3.2.2 Go插件安装 4. Hello World 入门4.1 建工程4.2 创建项目文件4.3 编写Hello World程序4.4…...

青少年编程与数学 02-004 Go语言Web编程 01课题、Web应用程序

青少年编程与数学 02-004 Go语言Web编程 01课题、Web应用程序 课题摘要:一、Web应用程序二、Web服务器&#xff08;一&#xff09;什么是Web服务器&#xff08;二&#xff09;Web服务器配置1. 选择服务器软件2. 安装服务器软件3. 配置服务器4. 安全设置5. 部署网站内容6. 测试服…...

【mysql】如何解决主从架构从库延迟问题

目录 1. 说明2.优化主库的写入性能3. 优化网络性能4. 增强从库的硬件性能5. 调整从库的配置6. 主从架构优化7. 监控和调优8.使用 GTID 和 Group Replication 1. 说明 1.在 MySQL 数据库中&#xff0c;从库延迟&#xff08;replication lag&#xff09;是指主库和从库之间的数据…...

前端学习-获取DOM对象(二十一)

目录 前言 目标 提问 学习路径 根据CSS选择器来获取DOM元素 其他获取DOM元素的方法 根据CSS选择器来获取DOM元素 选择匹配的第一个元素 语法 示例 参数 返回值 选择匹配的多个元素语法 参数 字符串返回值 示例 补充 其它获取DOM元素方法 根据id获取一个元素 …...

PCL点云库入门——PCL库中Eigen数学工具库的基本使用(持续更新)

0、前言 PCL点云库中的算法都基于Eigen数学工具库来实现的&#xff0c;因此&#xff0c;掌握Eigen库对于深入理解和应用PCL点云库至关重要。Eigen库不仅提供了高效的矩阵和向量运算&#xff0c;还支持复杂的线性代数、几何变换等操作&#xff0c;为PCL点云处理提供了强大的数学…...

CLion Inlay Hints - 取消 CLion 灰色的参数和类型提示

CLion Inlay Hints - 取消 CLion 灰色的参数和类型提示 1. Parameter hints for C/C1.1. Toggle parameter hints globally 2. Type hints for C/C2.1. Toggle type hints&#xfeff; globally 3. Toggle inlay hints globallyReferences https://www.jetbrains.com/help/clio…...

2025山东科技大学考研专业课复习资料一览

[冲刺]2025年山东科技大学020200应用经济学《814经济学之西方经济学[宏观部分]》考研学霸狂刷870题[简答论述计算题]1小时前[强化]2025年山东科技大学085600材料与化工《817物理化学》考研强化检测5套卷22小时前[冲刺]2025年山东科技大学030100法学《704综合一[法理学、国际法学…...

vue3 v-model实例之二,tab标签页的实现

<template><div><Tab v-model"activeTab" :list"tabs" /><div><p>当前激活的 Tab 索引: {{ activeTab }}</p></div></div> </template><script setup> import { ref } from vue; import Tab …...

东方通TongWeb7.0.4.9M4部署SuperMap iServer 11.2.1

一、软件版本 操作系统: CentOS Linux release 7.5.1804 (Core)JDK:11.0.18东方通&#xff1a;TongWeb7.0.4.9M4SuperMap iServer&#xff1a;11.2.1 JDK和TongWeb软件分享&#xff1a; 链接: https://pan.baidu.com/s/1HGDTPnPID0PEOMbg3FjTVQ?pwdbh8v 提取码: bh8v 东方通软…...

QT绘制同心扇形

void ChartForm::paintEvent(QPaintEvent *) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);// 设置抗锯齿painter.save();// 设置无边框&#xff08;不需要设置QPen&#xff0c;因为默认是不绘制边框的&#xff09;QPen pen(Qt::NoPen);// QPen pen…...

2012年西部数学奥林匹克试题(几何)

2012/G1 △ A B C \triangle ABC △ABC 内有一点 P P P, P P P 在 A B AB AB, A C AC AC 上的投影分别为 E E E, F F F, 射线 B P BP BP, C P CP CP 分别交 △ A B C \triangle ABC △ABC 的外接圆于点 M M M, N N N. r r r 为 △ A B C \triangle ABC △ABC 的内…...

8位移位寄存器的verilog语言

module shift_register (output reg [7:0] Q, // 8位移位寄存器输出input D, // 输入数据input rst, // 复位信号input clk // 时钟信号 );always (posedge clk) beginif (!rst)Q < 8b00000000; // 复位时将Q清零elseQ < {Q[6:0], D}; // 否则…...

【苍穹外卖】学习心得体会-随笔

前言 写了很久&#xff0c;终于可以完整运行项目了&#xff0c;记录下这几天的心得体会回顾一下知识点 第一天、Git 分布式版本控制工具 一、Git概述 定义&#xff1a;是分布式版本控制工具&#xff0c;用于管理软件开发中的源代码文件&#xff0c;像Java类、xml文件、html…...

MySQL学习之表的增删改

MySQL学习之表的增删改 语法总结&#xff1a; INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...); //指定字段添加数据 INSERT INTO 表名 VALUES (值1, 值2, ...); //给全部字段添加数据 INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, …...

电脑excel词典(xllex.dll)文件丢失是或损坏是什么原因?“xllex.dll文件缺失“要怎么解决?

Excel词典&#xff08;xllex.dll&#xff09;文件丢失或损坏&#xff1f;别担心&#xff0c;这里有解决之道&#xff01; 在日常的电脑使用和办公软件操作中&#xff0c;我们偶尔会碰到一些让人头疼的问题&#xff0c;比如Excel突然提示“Excel词典&#xff08;xllex.dll&…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...