问题描述
项目中实现了类似“今日头条”中“西瓜视频”的功能,在列表Cell上播放视频,实现方案中,使用ZFPlayer作为播放器,ZFPlayer是一个基于AVPlayer的开源类。
在列表上播放视频,切换视频时,为了避免反复创建和销毁播放器,ZFPlayer实现了单例模式,在播放完一个视频之后,播放器不会被销毁。
通过Charles抓包,发现在播放完一个m3u8视频之后,还会隔一段时间一直加载一个m3u8文件,抓包截图如下:
发现问题
网上翻阅资料,对m3u8做了一些了解,简单来说,m3u8就是将一整个视频分割成小切片,以提高下载播放的速度,以上的例子中,一共加载了8个视频切片。
在播放m3u8的时候,会先下载一个.m3u8的索引文件,文件中记录了视频的一些信息及切片地址等,如下:
从上面这张图可以发现,文件中并没有指明#EXT-X-PLAYLIST-TYPE
,翻阅官方文档可知道,不指明#EXT-X-PLAYLIST-TYPE
、指明#EXT-X-PLAYLIST-TYPE:EVENT
这两种情况,都会被认为是一个直播流,因为被认为是一个直播流,在播放器没销毁的情况,播放器会一直加载m3u8索引文件,来获取新的视频切片信息。
只有指明#EXT-X-PLAYLIST-TYPE:VOD
的时候,才会被认为是一个视频点播源,通过Charles将请求回复Map Local,并添加上#EXT-X-PLAYLIST-TYPE:VOD
,经检验,播放完视频之后,不再加载.m3u8索引文件。
之后与后台沟通,是否能加上这个参数,后台表示视频转码使用的是腾讯的转码库,貌似不支持添加这个参数,表示疑问?
挖掘问题
没能及时发现问题,主要原因是因为对m3u8的不了解,以后还需要对这方面多了解多研究。