HTTP Live Streaming (HLS) 是由 Apple 推出的基于 HTTP 的流媒体协议,它通过将音视频文件切分成一系列较小的分段文件,并通过 M3U8 播放列表进行索引,使得音视频可以实现流式传输,支持动态适应不同带宽的自适应流媒体传输。
HLS 是广泛使用的流媒体协议,特别适用于视频点播和直播服务。在音视频文件的流式传输中,HLS 的优点包括:无需专门的流媒体服务器,支持设备和平台的广泛兼容,以及通过分段传输来实现内容的快速加载。
HLS 将音视频内容分割为多个小的 .ts
(MPEG-TS) 文件(通常几秒钟的时长),并通过一个 .m3u8
播放列表文件索引这些分段。客户端根据网络带宽选择不同质量的分段进行播放,从而实现自适应比特率流。
HLS 主要组件:
.ts
文件)。.ts
文件。.ts
文件会被列出在一个 .m3u8
播放列表文件中。可以有多个 .m3u8
播放列表文件,分别对应不同的码率(低、中、高质量等)。.m3u8
文件,解析该文件后获取音视频分段,并开始请求对应的 .ts
分段进行播放。主播放列表(master.m3u8
):
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
low/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1400000,RESOLUTION=1280x720
mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1920x1080
high/index.m3u8
在主播放列表中,包含了多个不同质量的视频流(如低、中、高质量)。每个视频流有一个子播放列表文件(如 low/index.m3u8
,mid/index.m3u8
),该文件列出了具体的 .ts
文件。
子播放列表(low/index.m3u8
):
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
low/00001.ts
#EXTINF:10.0,
low/00002.ts
#EXTINF:10.0,
low/00003.ts
#EXT-X-ENDLIST
每个子播放列表列出了对应质量的视频分段,EXTINF
标签表示每个分段的时长。
.ts
文件,每个 .ts
文件通常是几秒钟的内容。.m3u8
文件会列出所有可用的流以及它们的码率和分辨率。每个流的播放列表会列出其对应的 .ts
文件。.m3u8
播放列表文件后,会根据当前网络状况选择合适的分辨率和码率,逐个请求对应的 .ts
文件进行播放。.ts
分段,保证视频播放的流畅性。例如,当网络带宽变差时,客户端会切换到低分辨率的视频流;带宽恢复时,客户端会切换回高分辨率流。.ts
文件进行播放。首先,您需要将音视频文件进行编码,并分段。您可以使用工具如 FFmpeg 来执行此操作。
假设您有一个名为 input.mp4
的视频文件,您想将其转换为 HLS 流并生成对应的 .m3u8
播放列表和 .ts
分段文件。
ffmpeg -i input.mp4 -profile:v baseline -level 3.0 -s 640x360 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls stream.m3u8
-i input.mp4
:输入视频文件。-profile:v baseline -level 3.0 -s 640x360
:设置视频编码器参数,指定分辨率。-hls_time 10
:每个 .ts
文件的时长(单位:秒)。-hls_list_size 0
:生成无限制长度的播放列表,适合直播。-f hls
:指定输出格式为 HLS。运行后,FFmpeg 会生成一个 stream.m3u8
播放列表文件以及多个 .ts
文件。
将生成的 .m3u8
播放列表文件和 .ts
分段文件上传到 Web 服务器。您可以使用任何支持 HTTP 的服务器(如 Apache、Nginx 等)来提供这些文件。
配置服务器支持 .m3u8
和 .ts
文件的正确 MIME 类型:
.m3u8
:application/vnd.apple.mpegurl
.ts
:video/MP2T
在 Nginx 配置文件中添加如下内容:
server {
location /hls/ {
add_header Access-Control-Allow-Origin *;
add_header Content-Type application/vnd.apple.mpegurl;
add_header Cache-Control no-cache;
# 映射 HLS 播放列表和 ts 文件
root /path/to/hls/files;
}
}
前端使用 标签或 HLS 播放器来播放
.m3u8
文件。大多数现代浏览器(如 Safari、Chrome、Firefox 等)都支持 HLS 流媒体播放。您也可以使用像 Video.js、hls.js(基于 JavaScript)等播放器来播放 HLS 流。
标签播放:
HLS 是一个强大的流媒体协议,适用于音视频文件的流式传输。它通过将音视频内容切割成多个小