1. 当前位置: 网站首页 >  路由器百科 >  看视频为什么能随便拖进度条?视频根本不是一个整文件,我数了数,10分钟被切成了64片

看视频为什么能随便拖进度条?视频根本不是一个整文件,我数了数,10分钟被切成了64片

视频分片原理:m3u8清单与64个ts片段,拖进度条只拉对应片段

周五晚上陪娃看动画片,小家伙不让快进,我趁他去洗手的空当把进度条拖到中间,画面唰一下就出来了。搁十年前用下载软件的年代,这事想都不敢想——一个几百MB的视频文件,你拖到哪它就得从哪开始等。我当时就在想,现在这视频到底是怎么发给我的?上回写CDN那篇我说清楚了视频从哪台服务器来,这回我把更上游的一件事扒明白了:视频网站压根就没打算把一个完整的文件发给你。

先说清楚:你看到的"一个视频",其实是一筐碎片

找个公开的测试视频源,我把它的清单原样拉了下来。一段10分34秒的720p视频,你猜它是什么形状?64个小文件,每个大概10秒钟,编号从462排到525,一个不差。我下了其中三个片段看体积:第一个1.92MB,中间那个1.65MB,最后一片只有0.63MB——最后那片短,只有4.584秒,是凑整剩下的零头。

这套切法有个行业标准,叫HLS,苹果当年为了iPhone搞出来的。清单文件后缀是.m3u8,本来是个播放器插件的老格式,被拿来当了"货物清单";切片后缀是.ts。你平时看到的大多数视频App和网页播放器,背后都在跑这一套或者它的变体。B站和YouTube用的叫DASH,思路一模一样,清单格式不同,而且B站是画面和声音切成两条轨道分开送,所以有的下载器下B站视频会得到一个纯画面一个纯声音的文件,得合流一遍才能看。

这个切法我越想越觉得精。为啥不干脆发整个文件?你算笔账:45分钟一集剧,720p按这个码率得400多MB。你点开看3分钟觉得难看关掉了,服务器白传400MB;你拖到第40分钟,前面的39分钟全是白传。切成10秒一片之后,你看到哪,它才发到哪,一片一片按需发货。

两张菜单:一张管清晰度,一张管每一片

拉下来的清单其实有两层,跟餐厅的点菜系统似的。第一层叫主清单,我拉的这份只有752字节,还没一截短信长。里面就干一件事:列档位。我数了数5个清晰度,每档后面跟着一行字——240p的写着246440,意思是这一档最高每秒要24.6万比特;1080p那档写着6221600,每秒6.2Mbit,折合每秒要下0.78MB左右。

第二层才是真正的货物清单。选定720p那档之后,下到的文件3606字节,里面老老实实列着64行,每行一个片段的文件名,名字前面标着这一片多长。我数了数,64片里57片标的是整整10.000秒,剩下那几个是9.95、10.05这种数——切的时候不能把一个画面关键帧从中间剁开,只能在关键帧边界下刀,所以偶尔差个半秒。

清单层体积里面写了啥谁来读
主清单m3u8752字节5个清晰度档+各档码率分辨率播放器先要它,挑档
媒体清单m3u83606字节64个片段的文件名和时长播放器照着挨个拉
ts片段本体每片0.6~1.9MB10秒钟的视频+音频拉回来直接播

顺便说一句,这清单本身就是个网址,跟URL那篇讲的一样,问号参数、路径一个不少。所以你从网上"下载到的m3u8文件"十有八九不是视频,是张菜单——菜单才几KB,视频几百MB,下错的东西打开当然是空的。

拖进度条那一瞬间,播放器干了三件事

现在你能想明白拖进度条为啥快了。你把进度条拖到第7分钟,播放器掏出清单一算:7分钟等于420秒,每片10秒,那就是第43片。然后它只干一件事——从第43片开始要货,前面的42片碰都不碰。要回来1.9MB,一秒多的功夫画面就出来了。顺带一提,这些片段走的是HTTP协议,规规矩矩跑在TCP上,跟你开网页是同一套,所以防火墙、路由器都拿它当普通下载对待;视频通话为什么另走UDP,TCP和UDP那篇讲过,实时通话等不起重传,看片等得起。

播放器手边还会囤货。正常播放时它不是播一片拉一片,一般会往后多拉三五片垫着,网络抖一下也不至于立刻卡住。你网页看着看着去干别的,回来接着播不卡,多半是囤的货还没消化完——这跟浏览器缓存那篇是两层缓存,浏览器存的是网页文件,视频App囤的是切片,一个道理:手边有货,心里不慌。

那为什么有的片源拖过去就是转圈?我踩过两回。一回是那种野站子,切片切得特别大,一片快30秒、七八MB,拖一下要等一大坨货到齐,体验立马垮掉;还有一回切片对得不齐,播放器算出来的片号跟实际时间对不上,画面出来位置不对,又得重拉。切得好不好,直接决定一个片源的手感。

换清晰度为啥不卡?换张菜单而已

看剧看到一半手动从720p切到1080p,画面停下来半秒钟就接着播,进度还在原地。咋做到的?播放器只是把第二层清单换了一份——从720p那张换成1080p那张,接下来拉的片段换成高码率版本的。你刚才看到第43片,那就从1080p清单的第43片继续,进度条一点没动。

自动降档也是这套逻辑。晚上高峰期你家的网要是吃不住1080p每秒0.78MB的进货速度,播放器一算账:拉一片超时了,囤货见底了,自动退回480p那张清单接着拉。所以「画质自己变糊了」不是手机坏了,是它在用降画质换不停顿。480p那档每秒只要10万比特出头,啥网络都喂得饱。你要是嫌它降得太勤,先按宽带兆数那篇算算自家套餐,再看是不是该查WiFi了。

我家电视之前总在晚高峰掉画质,起初我怀疑电视网卡,后来才发现是那阵子上传被云盘备份吃满了,下行跟着遭殃——这毛病在电视联网那篇里展开写过。掉画质这个动作本身,其实是播放器在保护你的观看体验,方向没毛病。

直播慢半分钟,也是切片的锅

点播的清单末尾有一行ENDLIST,意思是"货全了,64片一片不少"。直播的清单没这行,而且清单本身是活的——每隔几秒刷新一次,末尾新添一两片,像卷帘门一样往上走。主播那边每过10秒产出一小片,推给服务器,服务器把清单加一行,你这边刷新清单、拉最新一片,整条链路就是这么滚下去的。

所以直播天生慢。主播说出一句话,要等它被切成完整一片、传上服务器、进CDN分发、再被你拉下来,这一圈下来二三十秒很正常。有人较真"看球赛直播比邻居有线电视慢半分钟",邻居进球欢呼你这边还在倒脚——这事真赖不着你的路由器,是切片直播的固有代价,除非平台把切片切得特别短,但切太短清单刷新太频繁,服务器又扛不住。延迟和流畅,直播平台永远在这两头找平衡。

下载器、NAS和它,是两个世界

知道这套原理,几件事就通透了。第一,网上那些"m3u8下载器",原理就是把清单里64个片段挨个拉下来再拼成一个文件,所以它们慢,而且清单里的地址是带时效的,过期的清单下了也白下。第二,我家NAS里存的电影是完整的整文件,电视通过SMB直接拉整文件播,跟切片是两套路数——整文件的好处是想拖哪拖哪全在自己硬盘里,坏处是4K原盘一片80GB,NAS播放那篇里我写过电视百兆网卡被它噎住的事。

第三,真遇到看视频卡,排查思路完全不一样了:拖进度条转圈,多半是那个片源切得烂或者服务器远;整段播放一直糊,是带宽喂不饱当前档位;晚高峰必卡白天不卡,先查CDN调度和出口,再回头查自家WiFi。别一卡就重启路由器,那是最冤的一步。

症状八成是谁的锅先干什么
拖进度条转圈半天片源切片太大或服务器远换个清晰度档试试,或换片源
画质自己变糊带宽喂不饱当前档位测下行速度,查谁在抢带宽
晚高峰必卡白天正常CDN节点挤或小区出口拥塞流量下对照,带时段证据报修
直播比别人慢半分钟切片直播固有延迟别折腾,换有线电视看球

收尾给个顺序:下次视频卡,先看是拖动卡还是播放卡,再看画质有没有偷偷降档,然后按延迟那篇的分段法定位是家里还是外面的事,最后才轮到重启大法。至于那64个片段,我下完数完就删了——知道它长什么样,比留着它有用。

展开全文


版权说明 手机扫码阅读
版权所有:《数巢笔记》 => 《看视频为什么能随便拖进度条?视频根本不是一个整文件,我数了数,10分钟被切成了64片》
本文地址:https://www.shunot.com/lybk/1144.html
除非注明,文章均为 《SHUNOT》 原创,欢迎转载!转载请注明本文地址,谢谢。

发表评论

联系我们

在线咨询:点击这里给我发消息

微信号:master_135

工作日:9:00-23:00,节假日休息

扫码关注