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

news2024/12/22 14:54:42

基本原理

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可以作为一种流媒体传输协议,用于将实时视频传输到监控平台或服务器。

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

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

相关文章

flutter --no-color pub get 超时解决方法

新建Flutter项目后&#xff0c;运行报错&#xff0c;需要执行pub get 点击Run ‘flutter pub get’ … … … 卡着&#xff0c;不动了&#xff0c;提示超时 是因为墙的问题 解决方案&#xff1a; 添加以下环境变量 变量名: PUB_HOSTED_URL 变量值: https://pub.flutter-io.cn …

【题解】【枚举】——[NOIP2018 普及组] 龙虎斗

【题解】【枚举】——[NOIP2018 普及组] 龙虎斗 [NOIP2018 普及组] 龙虎斗题目背景题目描述输入格式输出格式输入输出样例输入 #1输出 #1输入 #2输出 #2 提示 1.思路解析2.AC代码 [NOIP2018 普及组] 龙虎斗 通往洛谷的传送门 题目背景 NOIP2018 普及组 T2 题目描述 轩轩和…

记录仪方案_记录仪安卓主板定制_音视频记录仪PCBA定制开发

记录仪主板采用了强大的联发科MTK8768处理器&#xff0c;拥有出色的性能表现。它搭载了四个主频为2.0GHz的Cortex-A53核心与四个主频为1.5GHz的Cortex-A53核心&#xff0c;确保了高效的处理速度。此外&#xff0c;主板配备了4GB的RAM(可选8GB)&#xff0c;并且内置64GB的ROM(可…

数据集-目标检测系列 车牌检测识别 数据集 CCPD2019

车牌检测&识别 数据集 CCPD2019 DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” 贵在坚持&#xff01; 数据样…

Eclipse设置自动补全后 输入字符串类型变量后会自动追加String的解决方案

很简单&#xff0c;先打开eclipse&#xff0c;顶部找到window&#xff0c;点击preference 弹出一个设置窗口&#xff1b; 在窗口左侧选择Java>Editor>Content Assist&#xff1b;然后再右侧找到Disable insertion triggers except Enter 的选项&#xff08;禁用除Enter以…

uniApp上传文件踩坑日记

最近在做移动端app&#xff0c;开始接触uniapp。想着直接用PC端的前后端API去做文件上传&#xff0c;但是uniapp的底层把请求拆成了普通请求和文件上传请求&#xff0c;所以不能用一个axios去做所有请求的处理&#xff0c;拆成uni.request和uni.uploadFile去分别处理两种情况。…

Qt Quick:CheckBox 复选框

复选框不止选中和未选中2种状态哦&#xff0c;它还有1种部分选中的状态。这3种状态都是Qt自带的&#xff0c;如果想让复选框有部分选中这个状态&#xff0c;需要将三态属性&#xff08;tristate&#xff09;设为true。 未选中的状态值为0&#xff0c;部分选中是1&#xff0c;选…

Pytorch | 从零构建GoogleNet对CIFAR10进行分类

Pytorch | 从零构建GoogleNet对CIFAR10进行分类 CIFAR10数据集GoogleNet网络结构特点网络整体架构应用与影响Inceptionv1到Inceptionv2 GoogleNet结构代码详解结构代码代码详解Inception 类初始化方法前向传播 forward GoogleNet 类初始化方法前向传播 forward 训练过程和测试结…

PCIe_Host驱动分析_地址映射

往期内容 本文章相关专栏往期内容&#xff0c;PCI/PCIe子系统专栏&#xff1a; 嵌入式系统的内存访问和总线通信机制解析、PCI/PCIe引入 深入解析非桥PCI设备的访问和配置方法 PCI桥设备的访问方法、软件角度讲解PCIe设备的硬件结构 深入解析PCIe设备事务层与配置过程 PCIe的三…

jenkins 出现 Jenkins: 403 No valid crumb was included in the request

文章目录 前言解决方式:1.跨站请求为找保护勾选"代理兼容"2.全局变量或者节点上添加环境变量3.&#xff08;可选&#xff09;下载插件 the strict Crumb Issuer plugin4.重启 前言 jenkins运行时间长了&#xff0c;经常出现点了好几次才能构建&#xff0c;然后报了Je…

CentOS 7 安装、测试和部署FastDFS

目录 FastDFS环境搭建 安装 libfastcommon 库 安装FastDFS 查看编译后的文件 FastDFS配置 FastDFS启动 启动tracker服务 启动storage服务 查看storage是否已经注册到了tracker下 查看存储文件的目录 FastDFS重启 FastDFS关闭 使用fdfs_test进行测试 修改client.co…

【WRF教程第3.1期】预处理系统 WPS 详解:以4.5版本为例

预处理系统 WPS 详解&#xff1a;以4.5版本为例 每个 WPS 程序的功能程序1&#xff1a;geogrid程序2&#xff1a;ungrib程序3&#xff1a;metgrid WPS运行&#xff08;Running the WPS&#xff09;步骤1&#xff1a;Define model domains with geogrid步骤2&#xff1a;Extract…

Flutter组件————FloatingActionButton

FloatingActionButton 是Flutter中的一个组件&#xff0c;通常用于显示一个圆形的按钮&#xff0c;它悬浮在内容之上&#xff0c;旨在吸引用户的注意力&#xff0c;并代表屏幕上的主要动作。这种按钮是Material Design的一部分&#xff0c;通常放置在页面的右下角&#xff0c;但…

在Windows11上编译C#的实现Mono的步骤

在Windows11上编译Mono的步骤 1、 在win11打开开发者模式,在更新和安全选项里,如下图: 2、下载并安装64位的cygwin, 下载网站:www.cygwin.com 3、 安装 Visual Studio 2015 or later 的社区版本。 4、 下载Mono的windows最新版本。 5、 在cmd.exe里运行下面的命令来安…

[HNCTF 2022 Week1]你想学密码吗?

下载附件用记事本打开 把这些代码放在pytho中 # encode utf-8 # python3 # pycryptodemo 3.12.0import Crypto.PublicKey as pk from hashlib import md5 from functools import reducea sum([len(str(i)) for i in pk.__dict__]) funcs list(pk.__dict__.keys()) b reduc…

【记录50】uniapp安装uview插件,样式引入失败分析及解决

SassError: Undefined variable: "$u-border-color". 表示样式变量$u-border-color没定义&#xff0c;实际是定义的 首先确保安装了scss/sass 其次&#xff0c;根目录下 app.vue中是否全局引入 <style lang"scss">import /uni_modules/uview-ui/in…

如何写申请essay

俗话说&#xff1a;万事开头难。英国留学申请essay也是如此。申请essay怎么写呢&#xff1f;一篇essay的开头是否精彩直接关系到导师能否被你的文字吸引。一把而言&#xff0c;招生官每天阅读的essay在200封以上&#xff0c;每篇阅读在12分钟以内&#xff0c;所以你的essay开头…

14-zookeeper环境搭建

0、环境 java&#xff1a;1.8zookeeper&#xff1a;3.5.6 1、下载 zookeeper下载点击这里。 2、安装 下载完成后解压&#xff0c;放到你想放的目录里。先看一下zookeeper的目录结构&#xff0c;如下图&#xff1a; 进入conf目录&#xff0c;复制zoo_sample.cfg&#xff0…

【UE5】pmx导入UE5,套动作。(防止“气球人”现象。

参考视频&#xff1a;UE5Animation 16: MMD模型與動作導入 (繁中自動字幕) 问题所在&#xff1a; 做法记录&#xff08;自用&#xff09; 1.导入pmx&#xff0c;删除这两个。 2.转换给blender&#xff0c;清理节点。 3.导出时&#xff0c;内嵌贴图&#xff0c;选“复制”。 …

yolo 视频流播放并进行目标识别

根据视频流&#xff0c;实时的进行目标识别 一、下载 [lal](https://github.com/q191201771/lal/releases/tag/v0.37.4)二、安装 [FFmpeg](https://ffmpeg.org/)三、完整代码演示 需要前置了解YOLO的完整操作 使用labelImg标注&#xff0c;YOLO进行目标训练 一、下载 lal 下载…