HLS视频

目录

[1.HLS 是怎么把视频"切开"播放的](#1.HLS 是怎么把视频“切开”播放的)

[2.HLS 里最重要的两个东西](#2.HLS 里最重要的两个东西)

3.点播和直播有什么区别

4.自动切换清晰度

[5.为什么 HLS 用得这么广](#5.为什么 HLS 用得这么广)


1.HLS 是怎么把视频"切开"播放的

平时看直播或在线视频时,我们很少关心视频是怎么传过来的。点下播放按钮,画面很快出现,网络变差时清晰度还会自动降低。这套体验背后,常见的实现方案之一就是 HLS。

HLS 全称是 HTTP Live Streaming,由苹果提出。它的核心思路并不复杂:把一个完整的视频切成许多小片段,再通过普通的 HTTP 服务发送给播放器。

2.HLS 里最重要的两个东西

一个是播放列表,通常以 .m3u8 结尾;另一个是视频分片,常见格式是 .ts,现在也经常使用基于 MP4 的 .m4s

播放器首先请求 m3u8 文件。这个文件本身不是视频,而是一份文本清单,里面记录了分片地址、时长、顺序等信息。例如:

复制代码
#EXTM3U
#EXT-X-TARGETDURATION:6
#EXTINF:6.0,
segment001.ts
#EXTINF:6.0,
segment002.ts
#EXTINF:5.5,
segment003.ts

播放器读到这份清单后,会依次下载 segment001.tssegment002.ts 等文件,并把它们连续播放。对观众来说是一段完整视频,实际上传输的是一批几秒钟的小文件。

3.点播和直播有什么区别

点播视频的内容已经准备完成,因此 m3u8 中会列出全部分片,并在结尾出现:

复制代码
#EXT-X-ENDLIST

直播则不一样。直播还在持续产生内容,服务器会不断生成新分片,同时更新 m3u8。播放器每隔一段时间重新请求播放列表,发现新的分片后继续下载。

为了避免播放列表无限增大,直播通常只保留最近的一段内容。旧分片会从列表中移除,所以普通 HLS 直播往往只能看到当前画面附近的内容。如果服务端保留历史分片,也可以实现回看和时移播放。

4.自动切换清晰度

HLS 的另一个关键能力是自适应码率。

服务端可以提前准备多套视频,例如 1080P、720P 和 480P,每套视频都有自己的播放列表。最外层再提供一个主播放列表:

复制代码
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=854x480
480p/index.m3u8

播放器会根据当前网速、缓冲区长度和设备性能选择合适的版本。网络稳定时切到高清,下载速度下降时改用低码率分片,尽量避免卡顿。切换通常发生在分片之间,因此不需要从头加载视频。

5.为什么 HLS 用得这么广

HLS 建立在 HTTP 之上,视频分片可以直接放在普通 Web 服务器或 CDN 中,不需要额外维护一套复杂的传输协议。HTTP 缓存、鉴权、HTTPS 和负载均衡等成熟方案也都能直接使用。

它的代价是延迟。传统 HLS 必须等待视频编码、切片、更新播放列表,再由播放器下载并缓存几个分片。假设每个分片长 6 秒,最终延迟很容易达到十几秒甚至更高。

缩短分片可以降低延迟,但会增加请求数量和服务端压力。现在还有 Low-Latency HLS,也就是 LL-HLS。它会进一步把分片拆成更小的部分,让播放器不必等整个分片生成完再开始下载,可以把延迟压到几秒左右。

理解 HLS,抓住三件事就够了:m3u8 负责描述内容,媒体分片负责承载音视频,播放器负责持续下载并根据网络情况切换码率。看似连续的视频,本质上就是一张不断更新的清单,加上一串按顺序播放的小文件。

相关推荐
宵时待雨1 小时前
linux笔记归纳18:传输层协议TCP
linux·网络·笔记·网络协议·tcp/ip
吴声子夜歌1 小时前
Shell编程——条件测试与比较
linux·运维·shell
音草1 小时前
Linux 基础指令入门:常用命令、Shell 原理与权限管理
linux
aosky1 小时前
Linux 写内容到文件的几种方式
java·linux·服务器
苍何2 小时前
小米版 Codex,干活有点猛啊
后端
苍何2 小时前
直播!用 AI 实时生成游戏,速来看
后端
苍何2 小时前
免费版 Typeless来了,不限额度,夯!
后端
吴声子夜歌2 小时前
Shell编程——函数
linux·运维·shell
Charlie_Byte3 小时前
Integer 缓存机制(JDK 17 源码)
后端