HLS协议实现多码率和多音轨

HLS是一种常见的流媒体协议。HLS是由m3u8索引文件和一系列流媒体分片文件构成。

一个简单的m3u8索引文件如下:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXTINF:9.009,
http://media.example.com/first.ts
#EXTINF:9.009,
http://media.example.com/second.ts
#EXTINF:3.003,
http://media.example.com/third.ts

播放器在获得了索引文件后,就可以按顺序下载ts分片文件并播放。但如果我们有多种不同码率的ts文件要提供呢?

这时我们就需要两级索引文件,一级索引文件中放置不同码率的m3u8索引文件位置,二级索引文件中再放置媒体分片。播放器下载一级索引文件后,可以根据网络状态和用户喜好选择一个码率进行下载和播放。一个简单的一级索引如下:

#EXTM3U
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="English", \
DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="en", \
URI="main/english-audio.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="Deutsch", \
DEFAULT=NO,AUTOSELECT=YES,LANGUAGE="de", \
URI="main/german-audio.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="Commentary", \
DEFAULT=NO,AUTOSELECT=NO,LANGUAGE="en", \
URI="commentary/audio-only.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=1280000,CODECS="...",AUDIO="aac"
low/video-only.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,CODECS="...",AUDIO="aac"
mid/video-only.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=7680000,CODECS="...",AUDIO="aac"
hi/video-only.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=65000,CODECS="mp4a.40.5",AUDIO="aac"
main/english-audio.m3u8

在这个索引文件中,除了有low/video-only.m3u8、mid/video-only.m3u8和hi/video-only.m3u8三路不同码率索引文件多信息,还有三路不同语种的音轨的索引文件的信息,根据这些信息,播放器就可以支持多码率和多音轨了。

HLS 协议格式要求:

  • 视频的封装格式 TS(流媒体文件);
  • 保存 TS 索引的 M3U8 文件;
  • 视频的编码格式:H264 (只要 MPEG-TS 支持,基本都可以,只是有些格式不是免费的;音频类似);
  • 音频的编码格式:AAC、MP3、AC-3。

HLS 协议优势:

  • 使用标准 HTTP 传输数据,具有较好的网络穿透及防屏蔽性,更易于内容分发网络传输;
  • HLS 协议本身是支持码率自适应的,客户端可以根据实际网络状况切换到合适的码率播放;
  • HLS 内容发布服务更简单,对系统设备要求较低,更容易实现负载均衡,并且 HLS 是无状态协议的 HTTP,客户端只需要下载即可。

HLS 协议劣势:

  • 延时较大,尤其是在直播的情况下,很难做到 10s 以内的延时(不排除网上各种改进版本及算法);
  • 内容生成时对编码端性能要求较高。

本文结尾底部,领取最新最全C++音视频学习提升资料,内容包括(C/C++Linux 服务器开发,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓文章底部

HlS 系统架构

下图来自 Apple 官网:

HLS 支持直播或者点播,同时支持加密和认证。从概念上来说,HTTP通常包括三部分:服务器端、发布端、客户端。

HLS 服务器端

服务器端主要负责将输入的媒体数据进行编码、封装,并将封装之后的文件切片,以满足发布端的要求。其输出可以是音视频原始数据,也可以是编码之后的数据,也可以是封装好的 TS 数据。这也输入最终会通过分片工具切分成发布端需要的格式。这里涉及三部分:

  • 多媒体编码器 (Media Encoder):多媒体编码器主要把采集自音视频设备的实时信号编码,封装。编码中必须选择客户端支持的格式,比如 h264 视频+ aac 音频。目前 HLS 支持的封装格式是 MPEG-TS 或者 MPEG 基本流(MPEG-ES,仅支持纯音频)。编码完成之后,编码器可以把封装之后的格式通过本地网络或者其他机制传递给分片工具(segmenter)。

  • 分片工具(segmenter):按照输入源的不同,通常分为流分片器、文件分片器。顾名思义,二者主要区别在于输入的文件格式上。 流分片器输出的是从本地网络滴入的 MPEG-TS 流,而文件分片器处理的是封装好的 TS文件。它们的工作原理类似:将 MPEG-TS 切分成一系列等时长的媒体文件,但保证这些小的分片是可以无缝重建的,播放时音视频是连续的。分片工具还会创建索引文件(M3U8),其中包含指向单独媒体文件的索引信息。每当分片器完成一个新的媒体文件,它将更新索引文件。该索引用于记录媒体文件的位置及可访问性。在此过程中,分片工具可以加密每个分片,并为其创建密钥文件。

HLS 分发端

HLS 分发端较为简单,只要使用标准的网络服务器即可。它们负责接受客户端请求,并将处理好的多媒体文件和资源发送给客户端。如果并发量较大,可能需要边缘网络或其他内容分发网络。
分发系统是一个 web 服务器或者 web 缓存系统,它们能够通过 HTTP 向客户端发送媒体文件及索引文件。多数情况下,分发内容之前无需额外配置服务器、模块,仅需很少的配置就在 web 服务器上正常工作。

HLS 客户端

客户端负责选择合适的请求资源,下载器资源,然后解码显示(整成播放器的功能)。
客户端从获取索引文件开始,通常使用给定的 URL 来识别该流的信息。这个索引文件一般给出了可用媒体文件、解密密钥和其他可选流的位置。客户端选定流之后,就开始顺序下载每个可用的媒体文件。每个文件中包含特定流的连续分片。只要客户端下载到足够的数据,就可以开始解码数据并显示了。
如果需要,客户端负责读取所有解密密钥、认证或为用户提供用于认证或解密的接口。
客户端可以一直持续这个过程,直到它遇到索引文件中的 #EXT-X-ENDLIST 标签;若不存在该标签,则表示该索引文件是一个直播源,客户端需要定期更新索引文件,重复上述过程。

较为常用的 HLS 系统中,使用硬编码器将输入的音频编码为 AAC、将输入的视频编码为 h264,并将二者复用到 MPEG-TS 中,之后使用分片工具将其切分为一系列小的 TS 文件;这些文件将可以放到 web 服务器上。分片工具同时会创建并维护一个索引文件(HLS 中称为 M3U8),其中包含可用媒体文件的列表。索引文件的URL会在 web 服务器上发布。客户端可以读取该索引文件,然后顺序请求列出的媒体文件,这些分片可以无缝播放。

原文链接

猜你喜欢

转载自blog.csdn.net/m0_60259116/article/details/125393254
今日推荐