m3u8格式探究

2,136

最近一直在研究一个问题,如何用video控件自适应视频大小,这个视频比较特殊,前几秒是宽屏广告视频,内容视频却是竖屏的,由于这个视频包含两个不同分辨率的视频源,导致播放器只能适应广告部分的尺寸,后续内容却被拉伸过度,浏览了各大视频网站资源和做了大量测试,发现播放资源为mp4时,手机和浏览器均不能适应,为m3u8时,可以自动适应。

分析:

1.直接下载m3u8格式文件,内容为文本,无法直接播放。

2.通过浏览器抓包,发现浏览器加载了3个新资源

https://v.6ncl.com/v/ca4bedca5d034d3f8cb0353e1efc68be/index.m3u8
https://v.6ncl.com/v/ca4bedca5d034d3f8cb0353e1efc68be/380kb/hls/index.m3u8
https://v.6ncl.com/v/ca4bedca5d034d3f8cb0353e1efc68be/380kb/hls/dxw7O0V3.ts

https://xxxx/index.m3u8

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=640000,RESOLUTION=640x1130
640kb/hls/index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=380000,RESOLUTION=360x636
380kb/hls/index.m3u8

https://xxxx/380kb/hls/index.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:6.08,
dxw7O0V3.ts
#EXTINF:6,
ikRlbFre.ts
#EXTINF:6,
1gw3AKT4.ts
#EXTINF:6,
FDVbUfSD.ts
#EXTINF:5.96,
kUUm77NL.ts
#EXTINF:6,
dE0DVvfW.ts
#EXTINF:6,
I2o7maLE.ts
...

https://xxxx/380kb/hls/dxw7O0V3.ts

G@ 90a61ec - H.264/MPEG-4 AVC codec - 
Copyleft 2003-2017 - http://Gwww.videolan.org/x264.html -
options: cabac=1 ref=5 deblock=1:0:0 analyse=0x3:0x113
me=hex subme=8 psy=1 rc=crf mbtree=1 crf=23.0 qcomp=0.60
qpmin=0 qpmax=69 qpstep=G4 
vbv_maxrate=380 vbv_bufsize=1140 crf_max=0.0 nal_hrd=none filler=0 
ip_ratio=1.40 aq=1:1.00€eˆ„ßÔĕÅÈ"X¦Æ×YT®¤À5mEÂlϨ»5Ö¤`0EÚñ¸gËbŠDSÝ"jêÌ>¬¤Ú%AyôÍ
³S¯ReÃ@Þ¥¸5ÚâKšïûBhÒ04%KGñÏxbehª!ŽÈ%"åM·UcÁSõ
«”/~§Y)<›húß<—yül/œ¼üÅÆBý^IïݲÜÑùWãI»ó¢ôC«O‡Sô 
...

第一个文件预加载文件,内部包含2个m3u8地址,第二个文件名称刚好出现在第一个文件内,第三个ts文件名称又出现在第二个文件中。

我首次接触,只能大胆猜测一下,看名称第一个文件应该和分辨率相关,播放器用来切换清晰度?第二个文件应该类似于资源列表,是一个短视频的集合,第三个ts文件应该就是视频的真实流。

网上查阅了一番,写了一些测试代码将ts一一下载后,可以直接播放,将所有ts流写入到一个文件可以合并成一个完整视频,和猜想的情况大致一致,但是为什么m3u8可以重置播放器分辨率呢?难道是分段的视频一个一个加载到播放器,每次加载都相当于加载了一个新视频,重新初始化视频相关参数?而mp4只加载一次,所以后续内容视频大小只能和广告使用同一分辨率?如若真是这样,我可不可以一边播放一边重新读取视频分辨率?