M3U8 和 HLS 是什么关系?一文看懂流媒体协议
说实话,我一开始接触到 m3u8 这玩意儿的时候,整个人是懵的。
事情是这样的,有次我想下载某个网站的视频,抓包看了半天,发现视频地址不是常见的 .mp4,而是一个以 .m3u8 结尾的链接。我当时心想,这啥玩意?点开一看,里面全是密密麻麻的文本,不是代码胜似代码,找半天也没找到一个完整的视频文件。
后来才搞明白,这是 HLS 协议搞的鬼。
HLS,全称 HTTP Live Streaming,翻译成中文就是“HTTP 直播流”。这玩意儿是苹果公司推出来的一套流媒体传输协议,原本是为了给 iPhone 和 iPad 播视频用的,后来因为太好用,安卓、网页端全都跟上来了,慢慢就成了视频直播和点播的主流方案。
那 M3U8 又是啥?它和 HLS 到底是啥关系?
这么说吧,HLS 是规则,是整套的视频传输方案。而 M3U8 只是这套方案里的一个“清单文件”,你可以把它理解成一张菜单。
HLS 有个核心思想,就是不把整个视频一次性传给你,而是先把视频切成一堆几秒钟的小片段,比如一段 10 分钟的视频,会被切成 100 来个几分钱硬币大小的分片文件,这些分片通常以 .ts 结尾。传的时候,你的播放器一边下载小碎片,一边播放,播完一块接着下一块,无缝衔接。
那问题来了,播放器怎么知道先去下载哪块、后下载哪块?这就轮到 M3U8 出场了。M3U8 的内容就是一串串链接和地址,清清楚楚地写着:这段视频总共有多少片、每一片对应哪个 URL、该按什么顺序播放。
说白了,M3U8 就是 HLS 的导航图。没有这张图,你的播放器面对一堆乱序的 .ts 文件,根本无从下手。
M3U8 这个名字本身也有点来头。M3U 是老早以前就有的音频播放列表格式,在 MP3 播放器暴火的年代,大家用它来管理歌单。后来 HLS 沿用了这个格式,但因为要支持 UTF-8 编码,所以在 M3U 后面加了一个“8”,成了 M3U8。所以说穿了,M3U8 就是一个更高级的播放列表文件。
平时你在网上看直播,或者看某些视频平台的非会员内容,背后的技术大概率就是 HLS。哪怕你看着地址栏里全是 .mp4,实际上播放器内部转换之后,走的很可能是 HLS + M3U8 这一套。
我记得有段时间我特别迷各种 IPTV 源,折腾过不少电视直播的播放器。那些论坛里分享的直播源,经常就是一串 m3u8 的链接,丢进播放器里就能直接看。有些源不稳定,看一会儿就卡,折腾来折腾去,最后我干脆找了个网页版播放器 M3U8Player(https://m3u8player.link/)就图个省事。它们还支持直播流和本地文件的解析,上次给我妈找某个地方电视台的源,就是靠它搞定的——直接粘贴链接就能播,省得下载一堆软件。
说实话,HLS 这个协议为什么能玩得转,聪明就聪明在它把复杂的东西拆小了。一个巨大的视频文件,如果直接传,网络一抖动就可能整个卡死。但切成一小片一小片的,哪怕某一小片没下好,大不了重新请求一次,对整体播放影响不大。而且它还支持码率自适应,网络差的时候自动切换低画质的片段,保证你能看,不至于全程转圈圈。
当然了,这也不代表 HLS 没缺点。它天生有延迟,直播的时候通常比传统 RTMP 慢个几秒甚至十几秒。但对于大多数场景,比如看视频、刷剧、回放、非实时性的直播,这个延迟完全能接受。
所以,以后再看到某个视频地址是 .m3u8 结尾的,你就知道,这里面的视频其实是被拆成了无数小碎片,藏在服务器上,M3U8 就是那张“藏宝图”。你只要把这张图交给一个支持 HLS 的播放器,它就会自动按图索骥,把一串碎片拼起来,最终呈现出完整流畅的画面。