在开始深入讲解爬取即使之前,让我们先了解一下为什么现在HLS技术应用会这么广。首先,HLS技术比传统的流媒体技术,例如RTSP协议(流媒体协议有三种:RTMP,RTSP和http live streaming)的好处在于,一旦切分完成,之后的分发过程完全不需要额外使用任何专门软件,普通的Web网络服务器即可,这样就降低了对服务器的技术要求。而且对于大量使用的CDN服务,大大降低了CDN边缘服务器的配置要求,可以使用任何现成的CDN。
对于非实时视频,如果要在长视频中跳转,使用单个MP4格式的视频文件,并且用HTTP协议,那么需要代理服务器支持HTTP range request以获取大文件中的一部分。并非所有的代理服务器都对此有良好的支持。而HTTP Live Streaming则只需要根据列表文件中的时间轴找出对应的TS片段下载即可,不需要HTTP range request,对代理服务器的要求小很多,因为所有的代理服务器都支持小文件的高效缓存。
另外,用TS做流媒体封装还有一个好处,就是不需要加载索引再播放,大大减少了首次载人的延迟,提升了用户体验。
此外,HTTP Live Streaming的最大优势为自适应码率流播。客户端会根据网络状况自动选择不同码率的视频流,条件允许的情况下使用高码率,网络繁忙时使用低码率,并且自动在二者间随意切换。这对移动设备网络状况不稳定的情况下保障流畅播放非常有帮助。
如果想要开发M3U8视频爬虫,首先要对M3U8的数据结构和字段定义非常了解。M3U8是一个扩展文件格式,由M3U扩展而来。
M3U(Moving Picture Experts Group Audio Layer 3 Uniform Resource Locator)这种文件格式,本质上说不是音频视频文件,它并不能再脱机模式下读取网络资源音频视频,它是音频视频文件的列表文件,是纯文本文件。下载之后打开,播放软件并不是播放它,而是根据它的记录找到网络地址进行在线播放。也就是说,M3U格式的文件只是存储多媒体播放列表(Playlist),提供了一个指向其他位置的音频视频文件的索引,播放的是那些被指向的文件。M3U文件的体量很小,也就是因为它里面没有任何音频文件。对于详细的M3U标准,可以参考国际标准组织的RFC 8216:HTTP Live Streaming。
为了能够更好的理解M3U的概念,我们先简单做一个M3U文件。在笔记本中随便找几个MP3文件(这里只是为了说明M3U文件类似于播放列表的功能,其不仅仅局限于音频文件,也支持视频文件)依次输入这些文件的路径,例如:
E:\Users\m3u8\刘若英 - 漂洋过海来看你.mp3
E:\Users\m3u8\那英 - 默.mp3
E:\Users\m3u8\毛不易 - 无问.mp3
E:\Users\m3u8\花粥 - 二十岁的某一天.mp3
E:\Users\m3u8\周深 - 大鱼.mp3
每输入一首歌后,回车另起一行,输入所有的歌曲路径后,将文件另存为music.m3u
。注意,保存时文件类型选“所有文件(?.?)
”。
保存完毕后,一个播放列表就完成了。可用Winamp软件打开此类型文件来验证此文件。我将music. m3u拖入Winamp软件后,可以得到如图所示的包含5个音频文件的播放列表,双击列表即可享受音乐了!
M3U8也是一种M3U的扩展格式。不同之处在于M3U8的编码格式为UTF-8格式,而M3U用Latin-1字符集编码。下面我们将了解一下M3U8中定义的几个非常重要的关键字:
大家在视频网站上观看视频时,通常会有一个码率可以选择,例如“标清”,“高清”,“超清”,“蓝光”等。其实这些都是在顶级M3U8文件中定义的。以下为一个顶级M3U8文件示例:
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=704,NAME=标清
https://edu.aliyun.com/hls/2452/stream/sd/4SBZFnkxAaTFxGcmC8kmEVs7PONigEDI.m3u8?courseId=137
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1096,NAME=高清
https://edu.aliyun.com/hls/2452/stream/hd/rqDyg23lwV87BcSiq3aDrRIQaGbjBs7t.m3u8?courseId=137
这个比较好理解,其实就是定义了两个码率对应的二级M3U8文件的下载地址。下面我们来看一下其中高清码率对应的二级M3U8文件的内容。
要完全掌握一门技术还是要从实践入手。为了能够帮助大家快速入门,通过本教程以最快的速度掌握数据爬虫的知识,并且能够毫无困难的爬取视频数据。本文将利用真实的教学案例,一步一步教会大家如何实现M3U8视频爬虫。以下是上节中提到的高清码率对应的M3U8文件样例:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:19
#EXT-X-ALLOW-CACHE:YES
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://edu.aliyun.com/hls/1109/clef/YnBGq7zAJf1Is7xIB5v8vI7AIORwwG9W",IV=0x0fe82567a6be41afda68d82d3724976a
#EXTINF:8.583,
https://xuecdn2.aliyunedu.net/headLeader-0/20170519032524-ggauw1x00qo0okgk-conv/e_20170519032524-ggauw1x00qo0okgk-conv_hd_seg_0.ts
#EXT-X-DISCONTINUITY
#EXT-X-KEY:METHOD=AES-128,URI="https://edu.aliyun.com/hls/2452/clef/0VqtrHq9IkTfOsLqy0iC1FP9342VZm1s",IV=0xdebe4353e61b56e4ecfe0240ca3f89f5
#EXTINF:10.080,
https://xuecdn2.aliyunedu.net/courselesson-50224/20170630095028-3xsfwyxw20cgwws8-conv/e_20170630095028-3xsfwyxw20cgwws8-conv_hd_seg_0.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://edu.aliyun.com/hls/2452/clef/0VqtrHq9IkTfOsLqy0iC1FP9342VZm1s",IV=0x8a3ce90cf18587963953b948487c1729
#EXTINF:10.000,
https://xuecdn2.aliyunedu.net/courselesson-50224/20170630095028-3xsfwyxw20cgwws8-conv/e_20170630095028-3xsfwyxw20cgwws8-conv_hd_seg_1.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://edu.aliyun.com/hls/2452/clef/0VqtrHq9IkTfOsLqy0iC1FP9342VZm1s",IV=0x1560e6de8540ce7f7d3377cbf381abbc
#EXTINF:10.000,
https://xuecdn2.aliyunedu.net/courselesson-50224/20170630095028-3xsfwyxw20cgwws8-conv/e_20170630095028-3xsfwyxw20cgwws8-conv_hd_seg_2.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://edu.aliyun.com/hls/2452/clef/0VqtrHq9IkTfOsLqy0iC1FP9342VZm1s",IV=0x02df8ad1022c09c87fce78a7c296d53e
#EXTINF:10.000,
https://xuecdn2.aliyunedu.net/courselesson-50224/20170630095028-3xsfwyxw20cgwws8-conv/e_20170630095028-3xsfwyxw20cgwws8-conv_hd_seg_3.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://edu.aliyun.com/hls/2452/clef/0VqtrHq9IkTfOsLqy0iC1FP9342VZm1s",IV=0x71d0bb1bd38ed564522cac46fddd21ca
#EXTINF:10.000,
https://xuecdn2.aliyunedu.net/courselesson-50224/20170630095028-3xsfwyxw20cgwws8-conv/e_20170630095028-3xsfwyxw20cgwws8-conv_hd_seg_4.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://edu.aliyun.com/hls/2452/clef/0VqtrHq9IkTfOsLqy0iC1FP9342VZm1s",IV=0x2aae5b93f21d772ca5942db2b9feac8d
#EXTINF:10.000,
https://xuecdn2.aliyunedu.net/courselesson-50224/20170630095028-3xsfwyxw20cgwws8-conv/e_20170630095028-3xsfwyxw20cgwws8-conv_hd_seg_5.ts
...
...
...
#EXT-X-KEY:METHOD=AES-128,URI="https://edu.aliyun.com/hls/2452/clef/0VqtrHq9IkTfOsLqy0iC1FP9342VZm1s",IV=0x3f1c20b9dd4459d0adf972eaba85e0a2
#EXTINF:10.000,
https://xuecdn2.aliyunedu.net/courselesson-50224/20170630095028-3xsfwyxw20cgwws8-conv/e_20170630095028-3xsfwyxw20cgwws8-conv_hd_seg_104.ts
#EXT-X-ENDLIST
从该文件中,我们可以找到之前提到的部分标准关键字,比如#EXT-X-VERSION,#EXT-X-ENDLIST,#EXT-X-TARGETDURATION,#EXT-X-MEDIA-SEQUENCE,#EXTINF和#EXT-X-ENDLIST。可以看出,这个一个比较简单的M3U8文件,没有涉及到加密解密的部分。另外,大家可以看到在该文件中有大量的ts文件的链接地址。这个就是我们之前描述的真正的视频文件。其中任何一个ts文件都是一小段视频,可以单独播放。我们做视频爬虫的目标就是把这些ts文件都爬取下来。
对于大多数的M3U8视频,一般是不加密的。对于一些重要的视频服务商,他们会对其视频做加密处理。M3U8视频目前的标准加密方式是使用AES-128进行加密处理。如果视频是加密的,就会在M3U8文件中出现以下信息:
#EXT-X-KEY:METHOD=AES-128,URI="https://edu.aliyun.com/hls/2452/clef/0VqtrHq9IkTfOsLqy0iC1FP9342VZm1s",IV=0x3f1c20b9dd4459d0adf972eaba85e0a2
其中METHOD为加密方法,标准是AES-128(其它的类型还没有遇见过)。Key是密钥文件的下载地址(密钥为16字节文件,需要下载)。IV是加密向量(16个字节的16进制数)。可以说Key和IV是AES的必要信息,这里我们就不用深入讲解。后面的教学代码中会教会大家如何使用AES对称加密方法进行加密和解密(Key和IV作为参数直接调用就可以了)。如果文件中没有包含#EXT-X-KEY,则媒体文件将不会被加密。
128位AES在加密和解密的时候需要提供一个相同的16字节的初始化向量(IV),变换IV可以提高密钥的健壮性。如果EXT-X-KEY标签有IV属性,在使用密钥加密或者解密的时候必须使用此属性值作为IV。这个值必须被解释为128位的16进制数,而且必须有前缀0x。如果EXT-X-KEY标签没有IV属性,在加密或者解密媒体文件的时候必须使用序列号作为IV值。
ts是一种视频封装格式,全称为MPEG2-TS。ts即”Transport Stream”的缩写。MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码。那么在M3U8中为什么用ts文件而不用mp4文件呢?这是因为两个ts片段可以无缝衔接,播放器能连续播放,而mp4文件由于编码方式的原因,两段mp4不能无缝衔接,播放器连续播放两个mp4文件会出现破音和画面间断,影响用户体验。
因此,我们可以这样理解:M3U文件只是音频视频文件ts路径的封装或者容器,真正播放的是M3U8解析下载到本地的一段又一段的ts音频视频文件。