流媒体传输 - HLS 协议

news2024/12/24 8:51:44

HLS 全称是 HTTP Live Streaming,是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议,用于实时音视频流的传输。目前 HLS 协议被广泛的应用于视频点播和直播领域。

概述

原理介绍

通过将整条流切割成一个小的可以通过 HTTP 下载的媒体文件,然后提供一个配套的媒体列表文件,提供给客户端,让客户端顺序地拉取这些媒体文件播放,来实现看上去是在播放一条流的效果。由于传输层协议只需要标准的 HTTP 协议,HLS 可以方便的透过防火墙或者代理服务器,而且可以很方便的利用 CDN 进行分发加速,并且客户端实现起来也很方便.

整体架构

HLS 的架构分为三部分:Server,CDN,Client 。即服务器、分发组件和客户端。

下面是 HLS 整体架构图:

                                                              HLS 整体架构图

服务器用于接收媒体输入流,对它们进行编码,封装成适合于分发的格式,然后准备进行分发。

分发组件为标准的 Web 服务器。它们用于接收客户端请求,传递处理过的媒体,把资源和客户端联系起来。

客户端软件决定请求何种合适的媒体,下载这些资源,然后把它们重新组装成用户可以观看的连续流。

HLS 协议分析

HLS Playlist

其实,HLS 协议的主要内容是关于 M3U8 这个文本协议的,其实生成与解析都非常简单。为了更加直接地说明这一点,我下面举两个简单的例子:

【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

  

简单的 Media Playlist

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:2680
#EXTINF:7.975,
https://priv.example.com/fileSequence2680.ts
#EXTINF:7.941,
https://priv.example.com/fileSequence2681.ts
#EXTINF:7.975,
https://priv.example.com/fileSequence2682.ts

包含多种比特率的 Master Playlist

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000
http://example.com/low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000
http://example.com/mid.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000
http://example.com/hi.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS="mp4a.40.5"
http://example.com/audio-only.m3u8
  • HLS 通过 URI(RFC3986) 指向的一个 Playlist 来表示一个媒体流

  • 一个 Playlist 可以是一个 Media Playlist 或者 Master Playlist, 使用 UTF-8 编码的文本文件,包含一些 URI 跟描述性的 tags

  • 一个 Media Playlist 包含一个 Media Segments 列表,当顺序播放时,能播放整个完整的流

  • 要想播放这个 Playlist, 客户端需要首先下载他,然后播放里面的每一个 Media Segment

  • 更加复杂的情况是,Playlist 是一个 Master Playlist, 包含一个 Variant Stream 集合,通常每个 Variant Stream 里面是同一个流的多个不同版本 (如:分辨率,码率不同)

  • 一个 Playlist 文件必须通过 URI(.m3u8 或 m3u) 或者 HTTP Content-Type 来识别 (application/vnd.apple.mpegurlaudio/mpegurl)

  • 换行符可以用 \n 或者 \r\n

  • # 开头的是 tag 或者注释,以 #EXT 开头的是 tag, 其余的为注释,在解析时应该忽略

  • Playlist 里面的 URI 可以用绝对地址或者相对地址,如果使用相对地址,那么是相对于 Playlist 文件的地址

HLS Media Segments

  • 每一个 Media Segment 通过一个 URI 指定,可能包含一个 byte range

  • 每一个 Media Segmentduration 通过 EXTINF tag 指定

  • 每一个 Media Segment 有一个唯一的整数 Media Segment Number

  • 有些媒体格式需要一个 format-specific sequence 来初始化一个 parser, 在 Media Segmentparse 之前。这个字段叫做 Media Initialization Section, 通过 EXT-X-MAP tag 来指定。支持的 Media Segment 格式

HLS TAGS

  • Basic Tags: 用在Media Playlist和Master Playlist里面
    • EXTM3U: 必须在文件的第一行,标识是一个 Extended M3U Playlist 文件

    • EXT-X-VERSION: 表示 Playlist 兼容的版本

  • Media Segment Tags: 只能出现在Media Playlist里面
    • EXTINF: 用于指定 Media Segmentduration

    • EXT-X-BYTERANGE: 用于指定 URIsub-range

    • EXT-X-DISCONTINUITY: 表示不连续

    • EXT-X-KEY: 表示 Media Segment 已加密,该值用于解密

    • EXT-X-MAP: 用于指定 Media Initialization Section

    • EXT-X-PROGRAM-DATE-TIME: 和 Media Segment 的第一个 sample 一起来确定时间戳

    • EXT-X-DATERANGE: 将一个时间范围和一组属性键值对结合到一起

  • Media Playlist tags: 只能出现在Media Playlist里面
    • EXT-X-TARGETDURATION: 用于指定最大的 Media Segment duration

    • EXT-X-MEDIA-SEQUENCE: 用于指定第一个 Media SegmentMedia Sequence Number

    • EXT-X-DISCONTINUITY-SEQUENCE: 用于不同 Variant Stream 之间同步

    • EXT-X-ENDLIST: 表示结束

    • EXT-X-PLAYLIST-TYPE: 可选,指定整个 Playlist 的类型

    • EXT-X-I-FRAMES-ONLY: 表示每个 Media Segment 描述一个单一的 I-frame

  • Master Playlist tags: 只能出现在Master Playlist中
    • EXT-X-MEDIA: 用于关联同一个内容的多个 Media Playlist 的多种 renditions

    • EXT-X-STREAM-INF: 用于指定一个 Variant Stream

    • EXT-X-I-FRAME-STREAM-INF: 用于指定一个 Media Playlist 包含媒体的 I-frames

    • EXT-X-SESSION-DATA: 存放一些 session 数据

    • EXT-X-SESSION-KEY: 用于解密

  • Media or Master Playlist Tags: 可以出现在Media Playlist或者Master Playlist中,但是如果同时出现在同一个Master Playlist和Media Playlist中时,必须为相同值
    • EXT-X-INDEPENDENT-SEGMENTS: 表示每个 Media Segment 可以独立解码

    • EXT-X-START: 标识一个优选的点来播放这个 Playlist

HLS 播放

播放未加密 HLS

我们通过 VLC 播放器播放苹果官方提供的一个例子:http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8,并使用 Wirshark 对其中交互进行抓包。

GET /iphone/samples/bipbop/gear1/prog_index.m3u8 HTTP/1.1
Host: devimages.apple.com
Accept: */*
Accept-Language: zh_CN
User-Agent: VLC/3.0.8 LibVLC/3.0.8
Range: bytes=0-
​
    HTTP/1.1 206 Partial Content
    Accept-Ranges: bytes
    Content-Type: audio/x-mpegurl
    ETag: "50117c8233644c19b5ab49551b72507f:1239907352"
    Last-Modified: Thu, 16 Apr 2009 18:42:32 GMT
    Server: AkamaiNetStorage
    Date: Sun, 22 Nov 2020 15:01:49 GMT
    Content-Range: bytes 0-7018/7019
    Content-Length: 7019
    X-Cache: TCP_MEM_HIT from a184-26-91-45.deploy.akamaitechnologies.com (AkamaiGHost/10.2.0.2-31441410) (-)
    Connection: keep-alive
​
    #EXTM3U
    #EXT-X-TARGETDURATION:10
    #EXT-X-MEDIA-SEQUENCE:0
    #EXTINF:10, no desc
    fileSequence0.ts
    #EXTINF:10, no desc
    fileSequence1.ts
    #EXTINF:10, no desc
    fileSequence2.ts
    #EXTINF:10, no desc
    ......
    #EXTINF:1, no desc
    fileSequence180.ts
    #EXT-X-ENDLIST

我们可以看到返回的 M3U8 里面他有一个一个 ts 视频片段,这个一个一个视频片段就是我们需要的播放的视频片段。

#EXTINF` 表示每个 `ts` 切片视频文件的时长。 `#EXT-X-TARGETDURATION` 指定当前视频流中的切片文件的最大时长,也就是说这些 `ts` 切片的时长不能大于 `#EXT-X-TARGETDURATION` 的值。 `#EXT-X-MEDIA-SEQUENCE` 第一个 `ts` 分片的序列号 `#EXT-X-ENDLIST` 这个表示视频结束,有这个标志同时也说明当前的流是一个非直播流。 `#EXT-X-PLAYLIST-TYPE:VOD` 的意思是当前的视频流并不是一个直播流,而是点播流,换句话说就是该视频的全部的 `ts` 文件已经被生成好了 `#EXT-X-ALLOW-CACHE` 是否允许 `cache

播放加密 HLS

HLS 协议总结

优点

  • 客户端支持简单,只需要支持 HTTP 请求即可,HTTP 协议无状态,只需要按顺序下载媒体片段即可。

  • 使用 HTTP 协议网络兼容性好,HTTP 数据包也可以方便地通过防火墙或者代理服务器,CDN 支持良好。

  • Apple 的全系列产品支持,不需要安装任何插件就可以原生支持播放 HLS, 目前 Android 也加入了对 HLS 的支持。

  • 自带多码率自适应机制。

缺点

  • 相比 RTMP 这类长连接协议,延时较高,难以用到互动直播场景。

  • 对于点播服务来说,由于 TS 切片通常较小,海量碎片在文件分发,一致性缓存,存储等方面都有较大挑战。

改进

  • 由于客户端每次请求 TSM3U8 有可能一个新的连接请求,无法有效的标识客户端,一旦出现问题,基本无法有效的定位问题。

  • 一般工业级的服务器都会对传统的 HLS 做一些改进,常见优化是对每个 M3U8 文件增加 Session 来标识一条 HLS 连接。

  • 不管通过哪种方式,最终我们都能通过一个唯一的 id 来标识一条流,这样在排查问题时就可以根据这个 id 来定位播放过程中的问题。

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

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

相关文章

SpringBoot中拦截器的使用

SpringBoot中拦截器接口: public interface HandlerInterceptor {default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}default void postHandle(HttpServletRequest request, …

【jmeter】windows下使用 (测试MQTT)

1. 添加线程组 二、添加如下请求 1. 添加创建连接请求-选中线程组, 点击右键,添加>取样器>MQTT Connect设置MQTT连接 本次使用本机开启的MQTT服务进行测试,默认ip为127.0.0.1,端口默认1883 2. 添加发布请求-选中线程组 …

面试:各种热修复框架对比

目前Android热修复的技术方案大致可以归类为以下几种: 资源热替换代码热修复动态库替换 资源修复 创建新的AssetManager实例,利用反射加载外部(SD卡)需要热修复的资源路径通过当前Activity实例获取Resouces资源类,然后反射得到mAssets属性&…

powerlevel10k 颜色和图标的自定义设置

文章目录1. 颜色的更改2. 图标的更改3. 附录powerlevel10k 的设置向导命令是p10k configure如果想在这个预定好的设置上面做一些个人的自定义设置,就得更改 powerlevel10k 的配置文件:~/.p10k.zsh 下面的操作主要就是在这个配置文件上面更改。 1. 颜色的…

浅谈芯片验证中的仿真运行之 compilation unit 技术(实践篇)

前言 前面文章,讲述了一些关于SV语法下,编译问题的一些基本概念。其实,芯片验证中仿真工具编译仿真文件、RTL文件的一些规则,依据每一家仿真工具内部的编译原理,都是保密的,用户只要按照仿真工具的使用规则去使用,即可。最近,笔者遇到了一个问题,今天空下来,总结一下…

Windows本地安装Redis且设置服务自启

redis中文网:http://redis.cn/ 如果是安装Windows版的redis需要去GitHub上下载安装包 如果是在Linux上安装,可以直接使用命令进行安装 本次教程是基于Windows系统进行的 GitHub地址:https://github.com/microsoftarchive/redis 选择需要下…

Online Decision Transformer

摘要 最近的工作表明,离线强化学习 (RL) 可以表述为序列建模问题 (Chen et al., 2021; Janner et al., 2021),并通过类似于大规模语言建模的方法来解决。 然而,RL 的任何实际实例化还涉及在线组件,其中在被动离线数据集上预训练的…

Express:Express 中间件

中间件的概念 1. 什么是中间件 中间件(Middleware ),特指业务流程的中间处理环节。 2. 现实生活中的例子 在处理污水的时候,一般都要经过三个处理环节,从而保证处理过后的废水,达到排放标准。 处理污水…

aws cloudformation 堆栈集的创建和使用

资料 使用 AWS CloudFormation StackSets 跨多个 AWS 账户和区域配置资源AWS cloudformation示例模板堆栈集堆栈实例状态原因 很多组织使用大量的 AWS 账户,通常用 AWS Organizations 将这些账户组织为分层结构,分组为不同的组织部门 (OU)。并且希望确…

Teams app 的 SSO 机制

我们来继续我们的 Teams sample 之旅,上一个讲了 Tab app,那我们这里再深入一步,看一下如何使用 sso 机制。 sso 是一个很有用机制,它可以让我们的 teams app 能获取当前用户的身份。sso 很多时候比较难彻底理解,在开…

刷爆力扣之公平的糖果交换

刷爆力扣之公平的糖果交换 HELLO,各位看官大大好,我是阿呆 🙈🙈🙈 今天阿呆继续记录下力扣刷题过程,收录在专栏算法中 😜😜😜 该专栏按照不同类别标签进行刷题&#xff…

【数据链路层】循环冗余码CRC、后退N帧协议GBN、选择重传协议SR、CSMA/CA

文章目录循环冗余码CRC多帧滑动窗口连续ARQ协议后退N帧协议GBN选择重传协议SRCSMA/CA---针对无线局域网处理隐蔽站问题RTS,CTS循环冗余码CRC /*** 计算CRC16校验码** param bytes* return* [1,3,4,1,205,1,18,235,173]*/public static String CRC16(byte[] bytes) {…

终于见识到了微服务的天花板!SpringCloud全线手册,太强了

后台都是在问微服务架构的面试题怎么答,想聊聊微服务架构了。微服务架构一跃成为 IT 领域炙手可热的话题也就这两年的事,大量一线互联网公司因为庞大的业务体量和业务需求,纷纷投入了微服务架构的建设中,像阿里巴巴、百度、美团等…

Kamiya丨Kamiya艾美捷大鼠微量白蛋白酶联免疫吸附试验说明书

Kamiya艾美捷大鼠微量白蛋白酶联免疫吸附试验预期用途: 大鼠微量白蛋白酶联免疫吸附试验(ELISA)是一种高灵敏度的双位点酶联免疫吸附试验(ELISA)大鼠生物样品中微量白蛋白的测定。仅供研究使用。 引言 白蛋白&#x…

Java项目:ssm学生学籍管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 SSM项目-学生学籍管理系统。该项目分管理员、老师、学生三种用户角色。每种角色分别对应不同的菜单; 以下分别介绍各个角色对应的功…

[附源码]计算机毕业设计springboot基于Java的日用品在线电商平台

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

二进制数据的贝叶斯非参数聚类算法(Matlab代码实现)

目录 💥1 概述 📚2 部分运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 利用图像结构信息是字典学习的难点,针对传统非参数贝叶斯算法对图像结构信息利用不充分,以及算法运行效率低下的问题,该文…

GoLand2022.2.5版本Hello调动Greetings包

安装Goland2022.2.5 版本 1.官网下载goland-2022.2.5.dmg版本(Mac)版本。如果是windows版本也可以直接下载) 2.配置gopath,基本都是配置.我这里配置为/usr/local/go 作为全目录,如果是windows,直接在环境中配置path路…

Mysql基础知识篇(二)

1.UNION 与 UNION ALL 的区别? 如果使用 UNION,会在表链接后筛选掉重复的记录行如果使用 UNION ALL,不会合并重复的记录行从效率上说,UNION ALL 要比 UNION 快很多,如果合并没有刻意要删除重复行,那么就使…

自动化测试框架

自动化测试框架1.自动化测试框架核心功能1.数据驱动2.页面驱动3.关键字驱动2.关键字驱动实现-文档形式3.关键字驱动实现-表格形式1.自动化测试框架核心功能 这三种驱动测试可以结合使用来完成系统的自动化测试。可以将测试数据 1.数据驱动 将测试代码和测试数据分离&#xff…