【音视频】HLS拉流抓包分析
一、测试环境
1.1 服务器
在Ubuntu下启动SRS服务器
./objs/srs -c conf/srs.conf
1.2 推流
使用ffmpeg推流RTMP到SRS服务器
ffmpeg -re -i .\2.mp4 -codec:v h264 -codec:a aac -f flv rtmp://10.22.79.251/live/video
1.3 查看服务器ts列表
推流后,进入对应的推流文件夹下,可以查看到.m3u8
文件,以及ts
切片
cd objs/srs/nginx/html/live
ls
.m3u8
文件是随着时间动态改变的,类似一个滑动窗口,每次最新的文件去顶替最旧的文件
cat video.m3u8
1.4 ffplay拉流
使用ffplay下载对应的.m3u8
文件,ffplay内部会根据列表下载对应的ts
文件
ffplay -i http://10.22.79.251:8081/live/video.m3u8
二、HLS抓包分析
这里简单分析抓包的内容,主要是分析HTTP的请求和响应报文
2.1 WireShark抓包
设置WireShark
过滤条件
ip.addr==10.22.79.251 and http and tcp.port==8081
可以发现,抓取到了许多GET请求报文,主要是两类:
- 请求下载.m3u8文件
- 请求下载.ts文件
响应报文也对应上面:
- 响应下载.m3u8文件的请求
- 响应下载.ts文件的请求
2.2 请求下载.m3u8报文
在 HLS 工作流程中,客户端需要先获取m3u8 索引文件(也就是报文中请求的video.m3u8
),通过解析索引文件里的切片列表(.ts
视频片段地址)、码率信息等,才能依次拉取视频流播放。这个请求,就是客户端发起的 “获取 m3u8 索引” 的核心动作。
2.2.1 状态与协议
1. 请求行(Request Line)
GET /live/video.m3u8?hls_ctx=3j4yt616 HTTP/1.1
GET
方法:HLS 中,客户端通过GET
从服务端拉取静态 / 动态生成的 m3u8 索引文件,是最基础的资源获取方式。/live/video.m3u8
:HLS 索引文件路径,服务端需按此路径返回对应的 m3u8 内容(包含视频切片列表、码率切换规则等)。hls_ctx=3j4yt616
:自定义查询参数(非 HLS 标准字段),可能是:- 会话标识:服务端用它区分不同客户端会话、维护播放状态(如鉴权 token、流唯一标识);
- 防盗链 / 校验:通过随机串或加密参数,防止非法请求;
- 多终端适配:传递设备信息(如分辨率、码率偏好),让服务端返回适配的 m3u8 内容。
HTTP/1.1
:HLS 依赖 HTTP 协议传输,HTTP/1.1
的长连接(keep-alive
)特性,可让客户端在同一 TCP 连接里连续拉取 m3u8、ts 切片,减少连接开销。
2. 请求头(Request Headers)
-
User-Agent: Lavf/62.0.102
标识客户端类型,Lavf
是 FFmpeg 的 “Libavformat” 库(常用于音视频处理、拉流工具 ),说明发起请求的可能是基于 FFmpeg 开发的播放器、推流 / 拉流程序。服务端可据此做兼容性适配(如返回不同格式的 m3u8 扩展信息)。 -
Accept: */*
客户端声明 “接受任意类型响应”,因 HLS 中 m3u8 本质是文本文件(Content-Type: application/x-mpegURL
或application/vnd.apple.mpegurl
),此配置足够覆盖,确保服务端返回的 m3u8 能被识别。 -
Range: bytes=0-
请求 “从第 0 字节开始的全部内容”,HLS 里 m3u8 通常是小文本文件,直接完整拉取即可。若服务端支持,也可用于 “续传”(但 m3u8 动态更新频繁,一般用不到)。 -
Connection: keep-alive
要求保持 TCP 连接,HLS 播放时需连续拉取 m3u8(定时刷新索引)和 ts 切片,长连接可复用连接,提升播放流畅度、降低延迟。 -
Host: 10.22.79.251:8081
指定服务端 IP 和端口,HLS 服务端需绑定此地址提供 m3u8、ts 资源,客户端通过它精准定位服务。 -
Icy-Metadata: 1
2.2.2 HLS 流程里的后续交互
客户端发送此请求后,服务端需:
- 校验参数:检查
hls_ctx
合法性(如是否鉴权、是否对应有效流); - 返回 m3u8:找到
/live/video.m3u8
对应的文件(或动态生成,如按hls_ctx
拼接 ts 切片地址 ),设置正确的Content-Type
(application/x-mpegURL
)返回; - 客户端解析:拿到 m3u8 后,解析出
#EXTINF
(切片时长)、#EXT-X-STREAM-INF
(多码率信息)、ts
切片地址,然后按序发起GET
请求拉取视频流,实现播放。
2.3 响应请求下载.m3u8文件报文
这是一条HTTP 1.1 响应报文,与 HLS(HTTP Live Streaming,基于 HTTP 的自适应码率流媒体传输协议 )场景强相关,是服务端对客户端获取 m3u8
索引文件请求的回应
2.3.1 状态与协议
HTTP/1.1 200 OK
HTTP/1.1
:服务端用 HTTP 1.1 协议响应,支持长连接(但此报文Connection: Close
主动关闭,不过 HLS 可通过多次请求适配 )。200 OK
:状态码表示请求成功,服务端已找到并准备返回客户端请求的m3u8
资源(HLS 播放流程的关键一步:拿到索引文件才能解析视频切片)。
2.3.2 响应头(Response Headers)与 HLS 关联
1. Connection: Close
服务端告知客户端:本次响应后关闭 TCP 连接。
- HLS 中,客户端后续会频繁请求
m3u8
(定时刷新索引)和ts
切片,虽然当前连接关闭,但 HTTP 1.1 可通过新连接继续请求,或服务端也可能根据配置改用长连接(这里是明确主动关闭)。
2. Content-Type: application/vnd.apple.mpegurl
HLS 标准响应类型,标识返回的内容是 m3u8
索引文件(苹果定义的 MPEG - DASH 流媒体索引格式 )。
- 客户端(如播放器)看到此头,会按 HLS 协议解析内容(识别
#EXTINF
切片时长、#EXT-X-STREAM-INF
多码率信息等 )。
3. Content-Length: 298
返回的 m3u8
文件大小为 298 字节,客户端可校验接收数据是否完整(防止网络丢包导致解析失败 )。
4. Server: SRS/6.0.134(Hang)
暴露服务端软件:SRS(Simple - RTMP - Server,轻量级流媒体服务器 ),版本 6.0.134
。
- SRS 常被用于直播场景,支持 RTMP 推流转 HLS 拉流,这里作为 HLS 服务端提供
m3u8
索引。
5. 下载的.m3u8文件
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-TARGETDURATION:9
#EXTINF:8.333, no desc
video-1.ts?hls_ctx=3j4yt616
#EXTINF:8.333, no desc
video-2.ts?hls_ctx=3j4yt616
#EXTINF:7.434, no desc
video-3.ts?hls_ctx=3j4yt616
#EXT-X-DISCONTINUITY
#EXTINF:8.334, no desc
video-4.ts?hls_ctx=3j4yt616
TS 切片详情
-
#EXTINF:8.333, no desc
+video-1.ts?hls_ctx=3j4yt616
8.333
:该 TS 切片的实际播放时长(秒);no desc
:自定义描述(无实际意义,可填写切片标题、编码信息等);video-1.ts?hls_ctx=3j4yt616
:切片的网络地址,hls_ctx=3j4yt616
是会话参数(用于服务端鉴权、关联播放会话,确保切片与请求匹配)。
-
#EXTINF:8.333, no desc
+video-2.ts?hls_ctx=3j4yt616
- 与第一个切片时长相同(8.333 秒),按序列号
2
顺序播放。
- 与第一个切片时长相同(8.333 秒),按序列号
-
#EXTINF:7.434, no desc
+video-3.ts?hls_ctx=3j4yt616
- 时长略短(7.434 秒),仍符合
#EXT-X-TARGETDURATION:9
定义的最大时长,序列号为3
。
- 时长略短(7.434 秒),仍符合
-
#EXT-X-DISCONTINUITY
- 特殊标签:标记流不连续(可能是编码格式、分辨率、时间戳突变,例如推流端中途切换编码器导致切片参数变化)。
- 作用:播放器需重置解码器状态(如清空缓存、重新初始化解码参数),避免画面花屏或声音卡顿。
-
#EXTINF:8.334, no desc
+video-4.ts?hls_ctx=3j4yt616
- 时长 8.334 秒,序列号为
4
(因#EXT-X-DISCONTINUITY
标记,该切片与前一个切片可能存在参数差异,播放器需适配)。
- 时长 8.334 秒,序列号为
2.3.3 HLS 场景下的后续流程
客户端收到此响应后:
- 解析
m3u8
内容:读取#EXTINF
(切片时长)、#EXT-X-STREAM-INF
(多码率列表)、ts
切片地址(如live/video_1.ts
); - 拉取视频流:按
m3u8
索引,依次发起GET
请求拉取ts
切片,实现连续播放; - 定时刷新:若
m3u8
含#EXT-X-REFRESH
或客户端策略,会定时重新请求m3u8
(对应Next request in frame
),确保获取最新切片列表(直播场景关键,保证流实时更新 )。
2.4 请求下载.ts文件报文
这是一个HTTP GET 请求报文,用于在 HLS(HTTP Live Streaming,基于 HTTP 的自适应码率流媒体传输协议)场景中,拉取视频切片文件(video-4.ts
)
2.4.1 状态与协议
GET /live/video-4.ts?hls_ctx=3j4yt616 HTTP/1.1
GET
方法:客户端通过GET
从服务端拉取TS 视频切片(HLS 中,视频流被分割为多个.ts
小文件,按序播放实现连续视频 )。/live/video-4.ts
:请求的TS 切片路径,对应 m3u8 索引文件中#EXTINF
条目里的切片地址(如之前解析的video-4.ts?hls_ctx=3j4yt616
)。hls_ctx=3j4yt616
:自定义查询参数(与 m3u8 索引关联),作用:- 会话标识:服务端用它关联播放会话(如鉴权、流唯一标识);
- 防盗链/校验:防止非法请求,确保切片与 m3u8 索引匹配。
HTTP/1.1
:基于 HTTP 1.1 协议,支持长连接(Connection: keep-alive
),减少多次请求的连接开销。
2.4.2 请求头(Request Headers)与 HLS 关联
1. User-Agent: Lavf/62.0.102
标识客户端类型:Lavf
是 FFmpeg 的“Libavformat”库(常用于音视频处理、播放器 ),说明发起请求的是基于 FFmpeg 的播放工具(或直播拉流程序 )。
- 服务端可据此适配响应(如兼容旧版 HLS 特性)。
2. Accept: */*
客户端声明“接受任意类型响应”,因 TS 切片是二进制视频流(Content-Type: video/MP2T
),此配置确保服务端返回的内容能被识别。
3. Range: bytes=0-
请求“从第 0 字节开始的全部内容”,TS 切片是完整的视频片段,直接拉取即可。若网络中断,可用于续传(但 HLS 切片小、动态更新,一般用不到 )。
4. Connection: keep-alive
要求保持 TCP 连接,HLS 播放时需连续拉取多个 TS 切片(按 m3u8 索引顺序),长连接可复用连接,提升播放流畅度、降低延迟。
5. Host: 10.22.79.251:8081
指定服务端 IP 和端口,HLS 服务端需绑定此地址提供 TS 切片,客户端通过它精准定位服务。
6. Icy-Metadata: 1
源自 ICEcast 流媒体协议的扩展头,用于传递音频流元数据(如主播名、歌曲名 )。若服务端支持,会在 TS 流里携带元数据;即使不支持,也不影响视频播放(可能是客户端通用配置 )。
2.4.3 HLS 流程里的上下文
客户端发送此请求前,已完成:
- 获取 m3u8 索引:解析到
video-4.ts?hls_ctx=3j4yt616
切片地址(如之前的 m3u8 报文 ); - 按序拉取切片:前 3 个切片(
video-1.ts
、video-2.ts
、video-3.ts
)已请求,此为第 4 个切片,保证播放连续性。
2.5 响应请求下载ts报文
这是一条HTTP 1.1 响应报文,是服务端对客户端拉取 HLS 视频切片(video-4.ts
)请求的回应:
2.5.1 状态与协议
HTTP/1.1 200 OK
HTTP/1.1
:服务端用 HTTP 1.1 协议响应,支持长连接(但此报文Connection: Close
主动关闭,不过 HLS 可通过多次请求适配 )。200 OK
:状态码表示请求成功,服务端已找到并返回客户端请求的TS 视频切片
(HLS 播放流程的核心:拿到切片才能拼接播放 )。
2.5.2 响应头
1. Connection: Close
服务端告知客户端:本次响应后关闭 TCP 连接。
- HLS 中,客户端后续会频繁请求其他
TS 切片
(按 m3u8 索引顺序),虽然当前连接关闭,但 HTTP 1.1 可通过新连接继续请求,或服务端也可能根据配置改用长连接(这里是明确主动关闭)。
2. Content-Length: 1456060
返回的 TS 切片
大小为 1,456,060 字节(约 1.39MB ),客户端可校验接收数据是否完整(防止网络丢包导致播放卡顿/花屏 )。
3. Content-Type: video/MP2T
TS 切片的标准 MIME 类型(MPEG-2 Transport Stream ),标识返回的是视频流数据。
- 客户端(如播放器)看到此头,会按
video/MP2T
解析内容(解码 TS 流,渲染视频画面 )。
4. Server: SRS/6.0.134(Hang)
暴露服务端软件:SRS(Simple-RTMP-Server,轻量级流媒体服务器 ),版本 6.0.134
。
- SRS 常被用于直播场景,支持 RTMP 推流转 HLS 拉流,这里作为 HLS 服务端提供
TS 切片
。
2.5.3 TS 切片内容解析
报文下方的 ISO/IEC 13818-1
、MPEG2 Program Association Table
等,是 Wireshark 对 TS 切片
的解析:
ISO/IEC 13818-1
:MPEG-2 传输流的标准协议,PID
(Packet Identifier )用于标识流中的不同内容(如视频、音频、节目信息 )。MPEG2 Program Association Table
:节目关联表,描述 TS 流中包含的节目、音视频 PID 映射关系,是播放器解码的基础。Packetized Elementary Stream
:打包的基本流,包含实际的视频/音频数据,播放器需解包、解码后渲染。
2.5.4 HLS 场景下的后续流程
客户端收到此响应后:
- 解码播放:按
video/MP2T
解析 TS 切片,解包音视频数据,渲染画面、播放声音; - 请求下一切片:根据 m3u8 索引,发起下一个
TS 切片
请求(如video-5.ts
),保证播放连续性; - 处理延迟:若
Time since request
过大,播放器可能因缓冲不足出现卡顿,需依赖服务端优化切片生成速度或客户端增加缓冲。
2.6 请求下载第二个ts报文
这是一个HTTP GET 请求报文,用于在 HLS(HTTP Live Streaming,基于 HTTP 的自适应码率流媒体传输协议)场景中,拉取视频切片文件(video-5.ts
)
2.6.1 状态与协议
GET /live/video-5.ts?hls_ctx=3j4yt616 HTTP/1.1
-
GET
方法:客户端通过GET
从服务端拉取TS 视频切片(HLS 中,视频流被分割为多个.ts
小文件,按序播放实现连续视频 )。 -
/live/video-5.ts
:请求的TS 切片路径,对应 m3u8 索引文件中#EXTINF
条目里的切片地址(如之前解析的video-5.ts?hls_ctx=3j4yt616
)。 -
hls_ctx=3j4yt616
:自定义查询参数(与 m3u8 索引关联),作用:- 会话标识:服务端用它关联播放会话(如鉴权、流唯一标识);
- 防盗链/校验:防止非法请求,确保切片与 m3u8 索引匹配。
-
HTTP/1.1
:基于 HTTP 1.1 协议,支持长连接(Connection: keep-alive
),减少多次请求的连接开销。
2.6.2 请求头
1. User-Agent: Lavf/62.0.102
标识客户端类型:Lavf
是 FFmpeg 的“Libavformat”库(常用于音视频处理、播放器 ),说明发起请求的是基于 FFmpeg 的播放工具(或直播拉流程序 )。
- 服务端可据此适配响应(如兼容旧版 HLS 特性)。
2. Accept: */*
客户端声明“接受任意类型响应”,因 TS 切片是二进制视频流(Content-Type: video/MP2T
),此配置确保服务端返回的内容能被识别。
3. Range: bytes=0-
请求“从第 0 字节开始的全部内容”,TS 切片是完整的视频片段,直接拉取即可。若网络中断,可用于续传(但 HLS 切片小、动态更新,一般用不到 )。
4. Connection: keep-alive
要求保持 TCP 连接,HLS 播放时需连续拉取多个 TS 切片(按 m3u8 索引顺序),长连接可复用连接,提升播放流畅度、降低延迟。
5. Host: 10.22.79.251:8081
指定服务端 IP 和端口,HLS 服务端需绑定此地址提供 TS 切片,客户端通过它精准定位服务。
6. Icy-Metadata: 1
源自 ICEcast 流媒体协议的扩展头,用于传递音频流元数据(如主播名、歌曲名 )。若服务端支持,会在 TS 流里携带元数据;即使不支持,也不影响视频播放(可能是客户端通用配置 )。
2.6.3 HLS 流程里的上下文
客户端发送此请求前,已完成:
- 获取 m3u8 索引:解析到
video-5.ts?hls_ctx=3j4yt616
切片地址(如之前的 m3u8 报文 ); - 按序拉取切片:前 4 个切片(
video-1.ts
、video-2.ts
、video-3.ts
、video-4.ts
)已请求,此为第 5 个切片,保证播放连续性。
2.7 响应第二个请求下载ts报文
这是一条HTTP 1.1 响应报文,是服务端对客户端拉取 HLS 视频切片(video-5.ts
)请求的回应
2.7.1 状态与协议
HTTP/1.1 200 OK
HTTP/1.1
:服务端通过 HTTP 1.1 协议响应,支持长连接(但此报文Connection: Close
主动关闭,HLS 可通过多次请求适配 )。200 OK
:状态码表示请求成功,服务端已找到并返回客户端请求的TS 视频切片
(HLS 播放流程的核心:拿到切片才能拼接播放 )。
2.7.2 响应头(Response Headers)与 HLS 关联
1. Connection: Close
服务端告知客户端:本次响应后关闭 TCP 连接。
- HLS 中,客户端后续会频繁请求其他
TS 切片
(按 m3u8 索引顺序),当前连接关闭后,HTTP 1.1 可通过新连接继续请求,或服务端也可能根据配置改用长连接(这里明确主动关闭)。
2. Content-Length: 2112556
返回的 TS 切片
大小为 2,112,556 字节(约 2.02MB ),客户端可校验接收数据是否完整(防止网络丢包导致播放卡顿/花屏 )。
3. Content-Type: video/MP2T
TS 切片的标准 MIME 类型(MPEG-2 Transport Stream ),标识返回的是视频流数据。
- 客户端(如播放器)看到此头,会按
video/MP2T
解析内容(解码 TS 流,渲染视频画面 )。
4. Server: SRS/6.0.134(Hang)
暴露服务端软件:SRS(Simple-RTMP-Server,轻量级流媒体服务器 ),版本 6.0.134
。
- SRS 常用于直播场景,支持 RTMP 推流转 HLS 拉流,这里作为 HLS 服务端提供
TS 切片
。
2.7.3 TS 切片内容解析
报文下方的十六进制数据,是 Wireshark 对 TS 切片
的原始解析:
video/MP2T
格式:TS 切片遵循 MPEG-2 传输流标准,包含PAT
(节目关联表)、PMT
(节目映射表)、音视频数据等。- 解码依赖:客户端需解析这些二进制数据,提取
PAT/PMT
找到音视频流 PID,再解码播放。
2.7.4 HLS 场景下的后续流程
客户端收到此响应后:
- 解码播放:按
video/MP2T
解析 TS 切片,解包音视频数据,渲染画面、播放声音; - 请求下一切片:根据 m3u8 索引,发起下一个
TS 切片
请求(如video-6.ts
),保证播放连续性; - 处理延迟:若
Time since request
过大,播放器可能因缓冲不足出现卡顿,需依赖服务端优化切片生成速度或客户端增加缓冲。
2.8 第二次下载m3u8文件
这是一个 HTTP GET 请求报文,用于在 HLS(HTTP Live Streaming,基于 HTTP 的自适应码率流媒体传输协议)场景中,拉取 HLS 索引文件(video.m3u8
)
2.8.1 状态与协议
GET /live/video.m3u8?hls_ctx=3j4yt616 HTTP/1.1
-
GET
方法:客户端通过GET
从服务端拉取 HLS 索引文件(.m3u8
),这是 HLS 播放的第一步(客户端需先拿到.m3u8
,才能解析后续的 TS 视频切片地址 )。 -
/live/video.m3u8
:请求的 HLS 索引文件路径,服务端需按此路径返回.m3u8
文件(包含 TS 切片列表、码率信息、播放参数等 )。 -
hls_ctx=3j4yt616
:自定义查询参数(非 HLS 标准字段),作用:- 会话标识:服务端用它区分不同客户端会话、维护播放状态(如鉴权 token、流唯一标识);
- 防盗链/校验:通过随机串或加密参数,防止非法请求;
- 多终端适配:传递设备信息(如分辨率、码率偏好),让服务端返回适配的
.m3u8
内容。
-
HTTP/1.1
:基于 HTTP 1.1 协议,支持长连接(Connection: keep-alive
),减少多次请求的连接开销(HLS 需频繁请求.m3u8
和 TS 切片 )。
2.8.2 请求头
1. User-Agent: Lavf/62.0.102
标识客户端类型:Lavf
是 FFmpeg 的“Libavformat”库(常用于音视频处理、播放器、拉流工具 ),说明发起请求的是 基于 FFmpeg 的应用程序(如直播拉流程序、自定义播放器 )。
- 服务端可据此适配响应(如返回更简洁的 HLS 扩展头,或兼容旧版 FFmpeg 的特性 )。
2. Accept: */*
客户端声明“接受任意类型响应”,因 .m3u8
本质是文本文件(Content-Type: application/x-mpegURL
或 application/vnd.apple.mpegurl
),此配置确保服务端返回的内容能被识别。
3. Range: bytes=0-
请求“从第 0 字节开始的全部内容”,.m3u8
通常是小文本文件,直接完整拉取即可。若服务端支持,也可用于“续传”(但 .m3u8
动态更新频繁,一般用不到 )。
4. Connection: keep-alive
要求保持 TCP 连接,HLS 播放时需频繁请求 .m3u8
(定时刷新索引)和 TS 切片,长连接可 复用连接,提升播放流畅度、降低延迟。
5. Host: 10.22.79.251:8081
指定服务端 IP 和端口,HLS 服务端需绑定此地址提供 .m3u8
和 TS 切片,客户端通过它精准定位服务。
6. Icy-Metadata: 1
源自 ICEcast 流媒体协议的扩展头,用于传递音频流元数据(如主播名、歌曲名 )。若服务端支持,会在 .m3u8
或 TS 流里携带元数据;即使不支持,也不影响 HLS 视频播放(可能是客户端通用配置带的冗余头 )。
2.8.3 HLS 流程里的上下文
客户端发送此请求后,期望服务端:
- 校验参数:检查
hls_ctx
的合法性(如是否鉴权、是否对应有效流 ); - 返回
.m3u8
:找到/live/video.m3u8
对应的文件(或动态生成,如按hls_ctx
拼接 TS 切片地址 ),设置正确的Content-Type
(application/x-mpegURL
或application/vnd.apple.mpegurl
)返回; - 客户端解析:拿到
.m3u8
后,解析出#EXTINF
(切片时长)、#EXT-X-STREAM-INF
(多码率信息)、TS 切片地址(如video-1.ts
),然后按序发起GET
请求拉取视频流,实现播放。
2.9 响应请求下载第二个m3u8报文
这是一条HTTP 1.1 响应报文,用于向客户端返回 HLS 流媒体的 m3u8
索引文件
2.9.1 状态与协议
HTTP/1.1 200 OK
HTTP/1.1
:服务端通过 HTTP 1.1 协议响应,支持长连接(但此报文Connection: Close
主动关闭,HLS 可通过多次请求适配 )。200 OK
:状态码表示请求成功,服务端已找到并返回客户端请求的m3u8
索引文件(HLS 播放流程的起点:客户端需先拿到m3u8
才能解析 TS 切片 )。
2.9.2 响应头
1. Connection: Close
服务端告知客户端:本次响应后关闭 TCP 连接。
- HLS 中,客户端后续会频繁请求
m3u8
(定时刷新索引)和TS 切片
,当前连接关闭后,HTTP 1.1 可通过新连接继续请求,或服务端也可能根据配置改用长连接(这里明确主动关闭)。
2. Content-Type: application/vnd.apple.mpegurl
HLS 标准响应类型,标识返回的内容是 m3u8
索引文件(苹果定义的 MPEG-DASH 流媒体索引格式 )。
- 客户端(如播放器)看到此头,会按 HLS 协议解析内容(识别
#EXTINF
切片时长、#EXT-X-STREAM-INF
多码率信息等 )。
3. Content-Length: 298
返回的 m3u8
文件大小为 298 字节,客户端可校验接收数据是否完整(防止网络丢包导致解析失败 )。
4. Server: SRS/6.0.134(Hang)
暴露服务端软件:SRS(Simple-RTMP-Server,轻量级流媒体服务器 ),版本 6.0.134
。
- SRS 常用于直播场景,支持 RTMP 推流转 HLS 拉流,这里作为 HLS 服务端提供
m3u8
索引。
2.9.3 m3u8
内容解析
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:3
#EXT-X-TARGETDURATION:9
#EXTINF:7.434, no desc
video-3.ts?hls_ctx=3j4yt616
#EXT-X-DISCONTINUITY
#EXTINF:8.334, no desc
video-4.ts?hls_ctx=3j4yt616
#EXTINF:8.333, no desc
video-5.ts?hls_ctx=3j4yt616
#EXTINF:8.333, no desc
video-6.ts?hls_ctx=3j4yt616
- 关键字段作用:
#EXT-X-MEDIA-SEQUENCE:3
:切片起始序列号为3
,后续切片按序播放;#EXT-X-TARGETDURATION:9
:单个切片最大时长9
秒,指导客户端缓冲;#EXT-X-DISCONTINUITY
:标记流不连续(如编码变更),需客户端重置播放状态。
2.9.4 HLS 场景下的后续流程
客户端收到此响应后:
- 解析
m3u8
:读取TS 切片
地址(如video-3.ts
)、时长、不连续标记; - 拉取 TS 切片:按
m3u8
索引,依次请求TS 切片
(如video-3.ts
、video-4.ts
),实现连续播放; - 定时刷新:若
m3u8
含#EXT-X-REFRESH
或客户端策略,会定时重新请求m3u8
(对应Next request in frame
),确保获取最新切片列表(直播场景关键 )。
更多资料:https://github.com/0voice