首页 > 其他分享 >什么是HLS(HTTP Live Streaming)?

什么是HLS(HTTP Live Streaming)?

时间:2023-06-12 20:34:37浏览次数:49  
标签:播放器 视频 HTTP HLS EXT 切片 Live 播放列表

HLS

Easy Tech

#013#

2009年,Apple推出了HLS(HTTP Live Streaming)——基于HTTP的自适应码率流媒体传输协议。HLS描述了一组通过互联网提供音视频服务的工具和程序。一个视频可以被分割成多个视频切片,这些切片的传送位置和顺序在一组被称为播放列表的XML文件中,该文件以文件扩展名m3u8结尾。人们可以使用兼容了HLS的播放器播放视频。

审校者注:原文说HLS使用了XML文件,是一个错误的说法,为了保留和原文一致,翻译并未去纠正这个错误,实际上,HLS 使用的是M3U8 文件,它是基于M3U扩展的UTF-8文本文件

在本篇文章中,我们将深入了解实现HLS视频流的程序和工具。如果你对这一领域不太了解,可以先阅读什么是视频点播(VOD)?理解ABR及其工作原理这两篇文章。

 HLS的历史

2009年,Apple在推出iPhone 3时,同时推出了HLS。目的是提升iPhone用户的媒体传输体验,并且使用户不再遇到带宽波动和传输受到干扰等问题。从那时起,Apple便一直定期改进HLS,使它成为可靠、被广泛支持的视频传输协议。

Apple的网站上有大量相关文档,包括创作指南、HLS简介、HTTP实时流媒体等。你也可以参考相关规范,查看HLS的更多细节并对它有更多了解(其中有对各种标签的清晰解释,以及ABR视频流的详尽介绍)。

 HLS的架构

HLS并不需要高级的硬件来传输视频,它是一个简单高效的协议。通过HLS,你可以使用常规的Web服务器存储和分发内容。但是它需要将数据存储在适当的格式中,且客户端软件能够获取并处理HLS视频内容。让我们一起来看看HLS视频传输服务的架构是什么样子。 

什么是HLS(HTTP Live Streaming)?_java

HLS架构 (图片来自Apple)

编码器:该编码器可以生成H.264/AVC或者HEVC内容,并遵守Apple创作规范中指定的标准。这些指南非常全面且具体。比如,它们为每个所支持的编解码器指定容器格式。对于H.264来说,你必须使用fMP4或者TS(Transport Stream)。当你在创建自己的HLS流媒体服务器时,请务必阅读指南内容。

打包器(Packager):打包器获取视频后,将其切割成短的视频切片(如10秒长)。比如,一个小时的电影会被切割成360个10秒长的视频切片,然后创建一个被称为播放列表的文件,其中包含视频名字、位置以及切片播放序列(和描述编解码器、分辨率和码率等的元数据一起)。创建这些视频切片的过程被称为视频分片,或者更为人所熟知的打包。

Web服务器:是指被请求时任何能够提供文件的Web服务器。当客户端发起请求时,HLS服务器需要提供的文件是播放列表(m3u8文件),以及实际的A/V内容(TS切片或者 fMP4)。

播放器/客户端:任何理解HLS协议和能够播放HLS流媒体(音频和视频)的播放器。播放从下载播放列表开始,然后使用播放列表连续下载视频切片,再渲染到屏幕。

 HLS播放列表示例

HLS播放列表有两种类型:主清单(master manifest)和子清单(child / media manifest)。让我们通过一个例子来理解它们是如何联系起来的。假设你已将一部电影以3个不同的分辨率进行编码:1080p、720p和480(也指表征,rendition)。在使用HLS协议封装后,你会得到1个主清单和3个子清单。

审校者注:最新的HLS RFC https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis-10 已经使用Multivariant Playlist 和 Media Playlist,原因是master/slave 被认为有负面的文化影响。2020年夏天,计算机行业对master/slave 这两个词的使用引起了人们的注意,在大量抗议活动和日益加剧的社会动荡中,这两个词被认为是不合时宜且过时的,这最终导致了这两个词出现各种中性的替代词。

主清单将描述视频不同部分的表征及其规范(包括音频和视频编解码器、语言和码率)。子清单将列出各个表征的所有视频切片(位置、名字和序列)。所以在这种情况下,你将得到3个子清单——分别是1080p、720p和480p。

下面是一个主清单示例,给出了构成编码和视频流阶梯(streaming ladder)的三种不同的表征信息。

#EXTM3U 
#EXT-X-MEDIA:URI="subtitle/lang_en/subtitle_index.m3u8",TYPE=SUBTITLES,GROUP-ID="subtitles",LANGUAGE="en",NAME="English",DEFAULT=YES,AUTOSELECT=YES 
#EXT-X-STREAM-INF:BANDWIDTH=893752,AVERAGE-BANDWIDTH=560289,RESOLUTION=854x480,CODECS="avc1.4D401F,mp4a.40.2",SUBTITLES="subtitles" 
media-4/index.m3u8 
#EXT-X-STREAM-INF:BANDWIDTH=1494976,AVERAGE-BANDWIDTH=891779,RESOLUTION=1280x720,CODECS="avc1.640028,mp4a.40.2",SUBTITLES="subtitles" 
media-5/index.m3u8 
#EXT-X-STREAM-INF:BANDWIDTH=3262928,AVERAGE-BANDWIDTH=1894009,RESOLUTION=1920x1080,CODECS="avc1.640028,mp4a.40.2",SUBTITLES="subtitles" 
media-6/index.m3u8 
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=161304,RESOLUTION=854x480,CODECS="avc1.4D401F",URI="media-4/iframes.m3u8" 
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=241392,RESOLUTION=1280x720,CODECS="avc1.640028",URI="media-5/iframes.m3u8" 
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=532416,RESOLUTION=1920x1080,CODECS="avc1.640028",URI="media-6/iframes.m3u8"

下面给出了用于主清单的标签解释:

  • EXT-X-STREAM-INF: 表示可用于电影播放的替代表征(alternative rendition)。
  • EXT-X-I-FRAME-STREAM-INF: 表示仅I帧表征,用于快速搜索/快进快退模式,并在搜索时显示缩略图(至少包括流行用例中的两个)。

下面是子清单的一小段,属于主清单所指向的表征之一。

#EXTM3U
#EXT-X-VERSION:4
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:4.000000,
segment-0.ts
#EXTINF:4.000000,
segment-1.ts
#EXTINF:4.000000,
segment-2.ts
#EXTINF:4.000000,
segment-3.ts
#EXTINF:4.000000,
segment-4.ts

HLS标签解释

下面是一些在m3u8文件中常见标签的解释:

  • EXTM3U: 表示该文件是一个扩展的m3u文件。每个HLS播放列表必须以此标签开始。
  • EXT-X-PLAYLIST-TYPE: 该标签取两个值(VOD或EVENT)中的任意一个。如果是VOD播放列表,那么服务器自始至终不能改变这个列表。如果是EVENT,服务器也不能改变或者删除该列表中已有内容,但是可以在后面追加内容。
  • EXT-X-INDEPENDENT-SEGMENTS:该标签表示每个视频切片中的每一个媒体示例无需其他切片的信息就可以被解码。并适用于播放列表中的所有切片。
  • EXT-X-TARGETDURATION: 指定媒体文件的最长持续时间(以秒为单位)。
  • EXTINF:该标签指定媒体切片的持续时长。后面应该接续相关媒体切片的URI(必须如此)。你应该确保EXTINF的值小于或者等于它所指的媒体文件的实际时长。

  HLS的最小切片时长是多少?

早些时候,Apple会推荐使用10秒切片时长(EXTINF)值来打包视频,但现在已经越来越少见。内容提供商越来越多地将切片时长减少到4秒和6秒,主要原因如下所示:

  • 减少首屏延迟、加入时间、延迟:Apple在播放器端要求,播放开始前,必须缓冲3个视频切片。这么做又意味着什么呢?如果你以5 mbps的速度编码,那么每秒视频的“花费”5 Mbit。如果你已经打包的切片时长是10秒的视频,然后需要缓冲3个切片,这样即使在视频还没开始播放的情况下,你就需要去下载150 Mbit(5 mbps * 10 seconds * 3个视频切片)或者18.75MB的视频。
  • 减少重新缓冲的影响:如果下载一个片段需要10秒,那么在这10秒内,网络条件可能发生很多变化。网络速度可能下降,这将导致播放器的缓冲区在下载视频时被耗尽,造成缓冲问题。使用较短的HLS片段在这种情况下更有意义,因为可以在更短的时间内获得得分片,让播放器有机会对网络条件做出更好的反应。

  如何将TS视频打包进HLS格式?

商业打包器:在开源和商业领域中,HLS受到了广泛的打包支持。USP(Unified Streaming)和Wowza是我马上想到的支持HLS的两家公司,他们支持开箱即用的HLS的打包。

在开源方面,你可以使用Shaka packager和FFmpeg来将视频打包成HLS格式。

  HLS的播放支持

播放器支持:作为广为流行的格式,HLS被大部分头部播放器公司和浏览器默认支持。我能想到的支持HLS的播放器公司包括CastLabs、Bitmovin、THEOPlayer、NexPlayer、Kaltura和JWPlayer等。支持HLS的开源播放器包括HLS.js和带有HLS.js插件的VideoJS。

以上提到的公司也为iOS/tvOS、Android等提供支持HLS播放的App。谷歌的Exoplayer也可以原生支持HLS播放。

浏览器支持:HLS播放在Safari中也获得了原生支持(这意味着你可以将HLS播放列表放到浏览器中,按下Enter键后,就可以直接播放视频,而不需要外部播放器)。但通常情况下,公司使用开源或者商业播放器(上文列出的那些)来播放HLS视频。

  测试你的HLS播放列表?

要测试你的视频流,你可以使用参考 HLS.js播放器(https://hls-js.netlify.com/demo/)。你可以粘贴自己的URL上去,并检查是否符合参考的 HLS 播放器。确保你的视频流来自Https 链接,否则播放器会崩掉。或者,你可以关闭安全检测或使用 CORS 插件强制播放。下面是所呈现的页面:

什么是HLS(HTTP Live Streaming)?_linux_02

你还可以使用Demo页底部的工具来分析视频流性能。

什么是HLS(HTTP Live Streaming)?_网络_03

  小   结

Hi,伙计们,今天就告一段落了。希望你们能够理解HLS协议的工作原理以及使用HLS传输视频时都需要什么。在后续的文章中,我会告诉你如何使用FFmpeg创建HLS视频流,并将其传输到全世界!

标签:播放器,视频,HTTP,HLS,EXT,切片,Live,播放列表
From: https://blog.51cto.com/u_13530535/6465240

相关文章

  • HTTP/3特性分析及未来发展
    Robin讲HTTP/3#005#到现在为止,我们主要对比了QUIC和TCP中的性能特性。那么HTTP/3和HTTP/2之间的区别是什么?我们在第一部分讨论过,HTTP/3实际上是HTTP/2-over-QUIC,所以新版本中并没有推出什么真正重要的新特性。这与从HTTP/1到HTTP/2不同,其中的变化更多,并推出了如头压缩、流优先级和......
  • 使用RestTemplate发送http请求导致请求头被过滤
    问题描述:  服务内需要使用http请求访问第三方接口,由于安全问题,第三方接口为防止跨域问题,在Nginx增加了请求头(Host,Origin,Refere)判断规则,判断不通过便返回404。一次调用过程,确保请求地址,请求头,参数均没问题后,却一直404。 原因:  RestTemplate中默认使用的connector会......
  • 计算机网络协议之http协议(四)
    一、HTTP协议概述HTTP协议又称超文本传输协议,是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。HTTP协议的特点如下:基于客户/服务器模式。在HTTP/0.9和1.0中每次连接只处理一个请求。服务器不保留与客......
  • QT的http post
    QT+=network#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>#include<QWidget>#include<QObject>#include<QDebug>#include<QHttpMultiPart>#include<QNetworkAccessManager>#include<QNetw......
  • python使用HTTP隧道代理代码示例模板
    以下是使用HTTP隧道代理的Python代码示例模板:```pythonimportrequests#设置代理服务器地址和端口号proxy_host="your_proxy_host"proxy_port="your_proxy_port"#设置代理服务器的用户名和密码(如果需要)proxy_username="your_proxy_username"proxy_password="your_proxy_p......
  • PHP使用HTTP隧道代码示例模板
    以下是使用PHP实现HTTP隧道的代码示例模板:```php<?php//目标网站的URL$targetUrl='ExampleDomain';//获取客户端请求的HTTP方法和请求头$method=$_SERVER['REQUEST_METHOD'];$headers=getallheaders();//创建与目标网站的连接$ch=curl_init();curl_setopt($ch,CURLOPT......
  • 13、镜像仓库Habor的安装、高可用、https加密
    Docker之分布式仓库Harbor安装Harbor下载地址:https://github.com/vmware/harbor/releases安装要求:4CPUMEM:8GBDISK:160GB环境准备:四台主机两台主机harbor服务器,地址10.0.0.101|102两台主机harbor客户端上传和下载镜像一键安装docker、docker-compose、harbor脚本#!/bi......
  • HTTP代理出现错误代码204是什么意思
    当咱们使用HTTP代理时,经常会出现错误码。其中最常见的是204错误码。那么,什么是204错误码?它表示什么意思呢?首先,204是HTTP协议定义的一种响应状态码。HTTP是一种在网络上传输超文本数据的协议,当我们使用HTTP代理访问网站时,会通过HTTP协议进行通信。204状态码表示服务器已......
  • delphi通过TNetHttpClient监测小红书笔记有无新增评论
    一、实现原理及步骤 每隔一定时间间隔(比如2分钟),抓取特定笔记ID的全部评论,统计出评论数量及子评论数量,与前一次抓取的数量比较,如数量增加,说明有新增评论。然后通过排序评论,找出最新添加的评论。二、技术要点1、评论接口https://edith.xiaohongshu.com/api/sns/web/v2/comment......
  • 网站http免费升级到https(阿里云)
    1、购买阿里云免费的ssl证书通过下面链接购买免费的ssl证书:https://common-buy.aliyun.com/?spm=a2c4g.11186623.2.6.767e1a63RfnkBE&commodityCode=cas#/buy显示这个界面不能购买点那个蓝色字体购买免费的【证书资源包】2、申请证书前往阿里云ssl证书控制台----SSL证书----免费证......