在流媒体技术之前,人们浏览网络上的音视频资料必须先下载到本地,经过漫长的等待之后,才可以看到或听到媒体内容。在流媒体技术出现之后,影像和声音信息经过压缩处理后放上网站服务器,由视频服务器向用户计算机顺序或实时地传送各个压缩包,让用户一边下载一边观看、收听,而不要等整个压缩文件下载到自己的计算机上才可以观看。
常用的流媒体协议主要有基于HTTP的渐进下载和基于RTSP/RTP 的实时流媒体协议。HLS(HTTP Live Streaming)是苹果公司实现的基于 HTTP 的流媒体协议,由于搭建方便,时效性高,广泛支持移动端,当前主流的视频内容提供网站都采用了基于HLS的流媒体分发技术。
在笔者的工作中发现,ChinaDaily和Yahoo上的视频都是采用HLS技术。这里以Yahoo上的视频为例,讲解此类文件的下载方式,在文末会给出工具的下载地址。
一个Yahoo!Japan上的视频新闻地址如下:https://headlines.yahoo.co.jp/videonews/nnn?a=20170515-00000083-nnn-soci,从页面源码中很难分析视频的下载地址或相关下载信息。笔者的经验是抓包逆推,从视频链接回溯到下载信息。比如我抓包获得了第一个视频地址如https://******/output_00001.ts,从中便可以推断它用的是流媒体协议。在网络截包中向后搜索output_00001.ts字样,便可以发现它出现在HLS协议播放列表文件m3u8中,文件地址类似https://*****/hls/Lf8oggKM2m_20LY-/video.m3u8?bw=500&session_token=9azOfXcZQ91tJI4iwT0qoXPL15yJhsgE1vOOo1w-&https=1。直接反向查找该地址无果,猜测最终地址为拼接所得,反向查找session_token后面的那串字符,可以再次跳入一个链接,提供了m3u8文件的真实下载地址类似https://****** /374368?appid=dj0zaiZpPVZMTVFJR0FwZWpiMyZzPWNvbnN1bWVyc2VjcmV0Jng9YjU-&output=json&space_id=2078710338&domain=headlines.yahoo.co.jp&ak=ed48189df5812ecc9e13b0875a21918c&device=pc&callback=jsonp_1494851675114_13395,经过多样本采集和逆推可发现,该地址中变化的是content/后面的数字id,此id可在视频下载页面的源文件中找到(contentid),至此,此类视频下载的流程已清楚。
下面重点介绍下HLS中最重要的播放列表m3u8文件。m3u8 是采用了 UTF-8 编码的 m3u 文件。它只是一个纯索引文件,一个文件片段的列表,客户端根据它里面承载的信息找到适配的视频文件的网络地址进行下载、解密(可选)、顺序播放。Yahoo采用的m3u8文件如下:
#EXTM3U:文件标记
#EXT-X-VERSION:版本号
#EXT-X-ALLOW-CACHE:客户端是否允许缓存下载文件,如果为NO,在客户端的临时文件里也是找不到已经看过的ts文件。
#EXT-X-TARGETDURATION:指定最大的媒体段时间长(秒)。所以#EXTINF中指定的时间长度必须小于或是等于这个最大值,一般10秒左右一个ts分片。
#EXT-X-KEY(注意了划重点):使用了该项表明此次HLS传输的ts媒体段有加密,加密方式为AES-128,加密密钥为16字节的key文件,下载地址在URI中,AES的加密向量IV附后。
#EXTINF:指定每个ts媒体段的持续时间和链接。
在HLS传输协议中,对流媒体加密是可选项,加密的好处不言而喻,用户即使采集到了所有的ts文件,也是无法直接观看的。当然,对搭建网站的技术要求也更高。
HLS网站的视频下载分析结束,下面就可以愉快的编程实现自动化啦,给出一个简单的算法流程。
最后给出工具的下载地址:链接: https://pan.baidu.com/s/1bpEgMTL 密码: 45nu