hls协议基础知识1

HLS简介

HLS (HTTP Live Streaming) 是由 Apple 公司开发的一种自适应比特率流媒体技术协议它通过将整个视频流拆分成一系列小的 HTTP 文件片段来实现,每个片段描述了整个视频流的一小段时间。在播放过程中,客户端可以从多个不同码率的替代流中选择,从而根据可用带宽自动调整视频质量,确保流畅的播放体验。

HLS 的主要特点包括:

  1. 自适应比特率:HLS 可以根据用户的网络状况自动调整视频的码率和分辨率,确保视频播放的连续性。

  2. 跨平台支持:HLS 得到了苹果设备 (iOS、macOS) 的原生支持,并广泛兼容其他平台如 Android、智能电视、游戏主机和网页浏览器。

  3. 直播和点播支持:HLS 既可用于直播视频传输,也适用于点播场景。

  4. 多语言和字幕支持:HLS 支持多音轨和字幕/闭塞字幕。

  5. 安全性和 DRM:HLS 提供加密和数字版权管理 (DRM) 支持,保护内容免受未经授权的访问。

  6. 与 HTTP 缓存兼容:HLS 流可被标准 Web 缓存、内容分发网络 (CDN) 和代理服务器缓存,提高了scalability和性能。

 小结:HLS 是一种广泛采用、灵活和可靠的流媒体技术协议,能够在各种设备和网络条件下提供高质量的视频传输。

环境搭建与测试

srs服务器

SRS是一个开源的流媒体服务器,全称为Simple Realtime Server。它支持多种实时流媒体协议,包括但不限于RTMP、WebRTC、HLS、HTTP-FLV、SRT等。SRS以其简单、实时和高效的特点,被广泛应用于直播和实时通信领域。

SRS的主要特点包括:

  1. 简单:基于协程技术,避免了异步回调难以维护的问题,支持云原生标准,如Docker镜像、Kubernetes部署、可观测性日志和监控指标等,提供了无门槛的应用体验。

  2. 实时:专注于实时流媒体网关,实现实时流媒体协议的接入和互相转换,不断迭代更新,以适应不同的流媒体需求。

  3. 高效:作为高性能流媒体服务器,SRS的性能是同类服务器的2到3倍,提供了完整的概念和一致性设计,实现高效的流媒体应用。

        SRS还提供了丰富的功能,如集群、协议网关、CDN功能等,适用于大规模集群如CDN业务的关键特性,例如RTMP多级集群、源站集群、VHOST虚拟服务器、无中断服务Reload、HTTP-FLV集群等。此外,SRS还提供丰富的应用接口,包括HTTP回调、安全策略、HTTP API接口、RTMP测速等。

小结:SRS的部署和使用也非常简单,可以通过简单的命令行操作完成下载、编译和运行。对于想要快速搭建流媒体服务器的用户来说,SRS是一个非常好的选择。

srs官⽹:https://github.com/ossrs/srs
码云的源速度快:https://gitee.com/winlinvip/srs.oschina.git
github的源速度慢:https://github.com/ossrs/srs.git
选择当前最新的release版本3.0

git clone https://gitee.com/ossrs/srs.git
    #可做可不做 查看分支版本限定版本
    git branch -al
    #为了方便使用给出删除
    git branch -d 3.0 
    #creator 3.0
    git checkout -b 3.0 remotes/origin/3.0release
cd trunk

vim conf/srs.conf

 配置文件

# main config for srs.
# @see full.conf for detail config.

listen              1935;
max_connections     1000;
srs_log_tank        file;
srs_log_file        ./objs/srs.log;
daemon              on;
http_api {
    enabled         on;
    listen          1985;
}
http_server {
    enabled         on;
    listen          8081;
    dir             ./objs/nginx/html;
}
rtc_server {
    enabled on;
    listen 8000; # UDP port
    # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#config-candidate
    candidate $CANDIDATE;
}
#设置统计监控指标,包括网络和磁盘使用情况。
stats {
      network 0;
      disk sda sdb xvda xvdb;
}

vhost __defaultVhost__ {
    hls {
        enabled         on;
        hls_path ./objs/nginx/html;
        hls_fragment 5; #分片时长 s
        hls_window 25; # 最大缓存time 秒
        }
    http_remux {
        enabled     on;
        mount       [vhost]/[app]/[stream].flv;
        hstrs on;
    }
	rtc {
        enabled     on;
        # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtmp-to-rtc
        rtmp_to_rtc off;
        # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtc-to-rtmp
        rtc_to_rtmp off;
    }

    play{
        gop_cache_max_frames 2500;
    }
}

启动

#启动srs服务器
./objs/srs -c conf/rtmp.conf
#查看srs日志
tail -n 10 ./objs/srs.log

#查看特定端口的使用情况 显示网络连接、路由表、接口统计等信息
netstat -an | grep 8081
#显示套接字统计信息 -a 所以 -l 使用
ss -al
ss -ln | grep 8081
#检查本地或远程主机上的开放端口
nmap -p 8081 localhost
#查看被进程打开或使用的文件描述符,包括网络端口。
lsof -i:8081
#显示当前运行在系统上的进程信息。
ps -aux | grep srs

测试

推流
ffmpeg -re -i time.mp4  -vcodec copy -acodec copy -f flv -y rtmp://192.168.126.129/live/livestream

拉流
ffplay  rtmp://192.168.126.129/live/livestream
ffplay  http://192.168.126.129:8081/live/livestream.flv
ffplay  http://192.168.126.129:8081/live/livestream.m3u8

分别推flv和MP4文件测试 

 

HLS架构

以服务器视角谈论hls

ts切片:

hls以gop为一组进行分片划分,分片是ts文件同时循环更新的过程。
对于直播流:
1.由于分片数量是固定的,导致分片时长也是固定的。过时分片也就会删除,比如 1 2 3 4 5 6,分片数量为5 当6分片时,1就会drop。
2.文件结构
.m3u8 index file 存储分片信息,当有new ts则会更新一次。
.ts 存储ts文件
3.通过http 读取服务器文件 读取顺序:.m3u8  .ts1  .ts2 ... 
不断的解析m3u8得到ts播放序列,随后根据序列读取ts,把ts发送c端,c端播放ts。

推流端:ffmpeg obs librtmp 以rtmp格式推流

服务端:格式重采样rtmp->ts格式,流分割器(Stream Segmenter)负责将编码器输出的MPEG-2 TS流分割为⼀系列连续的、⻓度均等的⼩ TS⽂件(后缀名为.ts),并依次发送⾄内容分发组件中的 Web服务器进⾏存储。每次产生ts文件会改动.m3u8索引⽂件。

对于直播来说,需要设置滑动窗口最长缓存的Time,会将过期的ts删除,保证time范围内是最新的ts文件。如图

对于点播(视频文件播放)来说,无需删除ts文件。

拉流端:每个播放器有自己的ts播放设计,比如拉取到m3u8文件,

1.可以选择从滑动窗口第一个ts播放,也就会导致高延迟,但是优化了播放卡顿几率。

2.也可以选择播放最新ts(一般是最后两个ts防止单个播放不平滑),播放内容的延迟低。

比如ffplay采用第一种方法。

hls在srs服务器的应用

在 HLS 协议中,视频流是被分成多个小的 MPEG-TS 分片文件(例如 livestream-145.ts、livestream-146.ts 等)。M3U8 文件则是用来描述这些分片文件的列表和元信息。

vim objs/nginx/html/live/livestream 
livestream-145.ts   livestream-148.ts   livestream.m3u8
livestream-146.ts   livestream.html     livestream_sd.html
livestream-147.ts   livestream_ld.html 
.ts MPEG-TS 分片文件,也就是前面提到的视频流分片。
.m3u8 这是 HLS 播放列表文件,它包含了这些分片文件的信息,供客户端播放器使用。
.html    提供一个网页播放器界面,嵌入视频播放器的代码,并引用了 HLS 播放列表文件。

vim objs/nginx/html/live/livestream.m3u8

#EXTM3U  # 指定这是一个 M3U8 格式的文件
#EXT-X-VERSION:3  # 指定 HLS 协议版本为 3
#EXT-X-MEDIA-SEQUENCE:145  # 指定当前序列号为 145
#EXT-X-TARGETDURATION:10  # 指定每个视频分片的目标时长为 10 秒
#EXTINF:9.200, no desc  # 指定第一个视频分片时长为 9.2 秒,没有描述信息
livestream-145.ts  # 第 145 个视频分片的文件名
#EXTINF:8.920, no desc  # 指定第二个视频分片时长为 8.92 秒,没有描述信息
livestream-146.ts  # 第 146 个视频分片的文件名
#EXTINF:9.240, no desc  # 指定第三个视频分片时长为 9.24 秒,没有描述信息
livestream-147.ts  # 第 147 个视频分片的文件名
#EXTINF:4.560, no desc  # 指定第四个视频分片时长为 4.56 秒,没有描述信息
livestream-148.ts  # 第 148 个视频分片的文件名

内容分发

一般采用HTTP协议传输HLS流媒体

  • 采用HTTP协议进行传输

    • 内容分发系统会将媒体文件切分成小的TS文件片段
    • 同时生成m3u8索引文件来描述这些TS文件的顺序和地址
  • 部署简单

    • 可以使用普通的Web服务器或Web缓存系统作为内容分发系统
    • 只需要对.m3u8和.ts文件关联正确的MIME类型即可
  • nginx配置优化缓存策略

    • 由于m3u8索引文件需要频繁更新
    • 应该对m3u8文件的缓存时间(TTL)进行适当调整
    • 确保客户端每次请求都能获取到最新的m3u8文件
  • 适用于大规模部署

    • 基于标准HTTP协议传输
    • 可利用成熟的CDN和Web缓存技术进行内容分发
    • 几乎不需要对服务器进行特殊配置

HTTP的内容分发方案具有部署简单、扩展性强等优点,非常适合大规模流媒体内容的传输和分发。

以客户端视角谈论hls

HLS客户端的基本工作流程如下:

  1. 客户端通过访问Web页面上的URL链接获取HLS流的索引文件(m3u8文件)。
  2. 索引文件描述了当前可用的媒体文件(TS文件)、解密密钥以及替代流的位置信息。
  3. 客户端依次下载索引文件中列出的每个媒体文件(TS文件)。
  4. 在缓冲了足够数量的媒体文件后,客户端将它们按顺序拼装成连续的TS流,送入播放器进行解码和渲染。
  5. 对于加密的媒体文件,客户端还需要根据索引文件获取解密密钥,进行解密。
  6. 对于点播视频,客户端会一直下载直到遇到索引文件中的#EXT-X-ENDLIST标签。
  7. 对于直播视频,客户端会周期性地向服务器重新请求索引文件的更新版本,以获取新的媒体文件和密钥。

需要注意的是,HLS并不是真正意义上的实时流媒体系统,存在一定的时延:

  1. 客户端至少需要缓冲两个媒体文件才能开始播放,以确保音视频之间的无缝切换。
  2. 服务端编码器和流分割器需要生成第一个媒体文件,这也会带来一定的延迟。

以HLS协议角度探讨cs端

HLS 协议编码格式要求

视频的编码格式:H264
⾳频的编码格式:AAC、MP3、AC-3
视频的封装格式:ts
保存 ts 索引的 m3u8 ⽂件

协议优势

HLS 相⽐ RTMP 在服务器端做负载均衡要简单得多,从而导致多码率自适应、服务器冗余等优点,能很好地适应移动网络环境。

        服务器可以为同⼀节⽬源准备多份以不同码率和质量编码 的替换流,并为每个替换流都⽣成⼀个衍⽣的索引⽂件。在主索引⽂件中通过包含⼀系列指向其他衍⽣索 引⽂件的URI指针来找到相应的替换流。

 以多码率适配流为例子:

#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系统的典型时延约为30秒左右。这是HLS在实时性和延迟性方面的一个重要特点。HLS 协议在直播的视频延迟时间很难做到 10 s 以下延时,⽽ RTMP 协议的延时可以降到 1s 左右。

 

小结

HLS流媒体系统中服务器和客户端的特点:

  1. 服务器多码率支持:

    • 服务器可以为同一节目源准备多份不同码率和质量的替换流
    • 每个替换流都有对应的衍生索引文件(m3u8)
    • 主索引文件会包含指向这些衍生索引文件的URI链接
  2. 客户端自适应切换:

    • 移动客户端可以根据网络条件的变化,动态切换到不同码率的替换流
    • 通过选择对应的m3u8文件,下载合适的媒体文件(TS)
  3. 服务器冗余备份:

    • 服务器可以生成一套并行的备份媒体流和索引文件
    • 主索引文件会同时包含主流和备份流的链接
    • 当主服务器失效时,客户端可切换到备份服务器获取内容

HLS的特殊流式机制:

  • HLS并不传输完整的数据流,而是分段的媒体文件(TS)
  • 客户端不断下载并播放这些短文件,实现类似直播的效果
  • 这种技术特点决定了HLS的延迟会高于传统的流媒体协议

总结

本文主要简述了hls基本知识点,以及测试环境搭建。最后从客户端,服务器,hls协议的角度出发,探讨了hls协议特性。

协议学习

草稿-pantos-http-live-streaming-06 --- draft-pantos-http-live-streaming-06  

学习资料分享

0voice · GitHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值