M3U8流视频数据爬⾍详解⼀:M3U8视频⽂件详解
M3U8流视频数据爬⾍详解⼀:M3U8视频⽂件详解
最近接触⼤数据和⼈⼯智能⽅⾯的⼯作,常常需要爬取视频数据。⽽现在⼤部分视频客户端都采⽤HTTP Live Streaming(HLS,Apple 为了提⾼流播效率开发的技术),⽽不是直接播放MP4等视频⽂件。其特点是将流媒体切分为若⼲TS⽚段(⽐如⼏秒⼀段),然后通过⼀个扩展的M3U8列表⽂件将这些TS⽚段批量下载供客户端播放器实现实时流式播放。因此,在爬取HLS的流媒体⽂件的思路⼀般是先下载M3U8⽂件并分析其中内容,然后在批量下载⽂件中定义的TS⽚段,最后将其组合成mp4⽂件或者直接保存TS⽚段。说说简单,其实在实际操作中,会遇到很多复杂的问题,例如m3u8⽂件下载不下来,ts⽚段⽂件被加密了,甚⾄加密ts⽚段的密钥也被加密了。本⽂将分享⼀个实际案例供⼤家参考。
HTTP Live Streaming(HLS)的优势
在开始深⼊讲解爬取即使之前,让我们先了解⼀下为什么现在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的数据结构和字段定义⾮常了解。M3U8是⼀个扩展⽂件格式,由M3U扩展⽽来。
M3U⽂件
M3U(Moving Picture Experts Group Audio Layer 3 Uniform Resource Locator)这种⽂件格式,本质上说不是⾳频视频⽂件,它并不能再脱机模式下读取⽹络资源⾳频视频,它是⾳频视频⽂件的列表⽂件,是纯⽂本⽂件。下载之后打开,播放软件并不是播放它,⽽是根据它的记录到⽹络地址进⾏在线播放。也就是说,M3U格式的⽂件只是存储多媒体播放列表(Playlist),提供了⼀个指向其他位置的⾳频视频⽂件的索引,播放的是那些被指向的⽂件。M3U⽂件的体量很⼩,也就是因为它⾥⾯没有任何⾳频⽂件。对于详细的M3U标准,可以参考国际标准组织的。
为了能够更好的理解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⽂件
M3U8也是⼀种M3U的扩展格式。不同之处在于M3U8的编码格式为UTF-8格式,⽽M3U⽤Latin-1字符集编码。下⾯我们将了解⼀下
M3U8中定义的⼏个⾮常重要的关键字:
#EXTM3U:每个M3U⽂件第⼀⾏必须是这个tag。
#EXT-X-VERSION此属性可⽤可不⽤。
#EXT-X-TARGETDURATION定义每个TS的最⼤duration。
#EXT-X-ALLOW-CACHE是否允许cache。
#EXT-X-MEDIA-SEQUENCE定义当前M3U8⽂件中第⼀个⽂件的序列号,每个ts⽂件在M3U8⽂件中都有固定唯⼀的序列号,该序列号⽤于在MBR时切换码率进⾏对齐。
#EXT-X-KEY定义加密⽅式,⽤来加密的密钥⽂件key的URL,加密⽅法(例如AES-128),以及IV加密向量。
#EXT-X-DISCONTINUITY当遇到该tag的时候说明这些属性发⽣了变化,例如file format,加密⽅式等。
#EXTINF:指定每个媒体段(ts⽂件)的持续时间,这个仅对其后⾯的TS链接有效,每两个媒体段(ts⽂件)间被这个tag分隔开。其格式可以是#EXTINF:,duration表⽰持续的时间(秒),如果协议版本⼩于3则duration必须为整数,否则可以是浮点数。
#EXT-X-ENDLIST表明M3U8⽂件的结束。live m3u8没有此tag。
演员廖京生#EXT-X-STREAM-INF不同带宽适配的不同码率的视频列表路径。其有⼀个主要参数BANDWIDTH表⽰每个媒体⽂件⽐特速率的上限,单位为每秒bit数。
顶级M3U8⽂件与⼆级M3U8⽂件
⼤家在视频⽹站上观看视频时,通常会有⼀个码率可以选择,例如“标清”,“⾼清”,“超清”,“蓝光”等。其实这些都是在顶级
M3U8⽂件中定义的。以下为⼀个顶级M3U8⽂件⽰例:
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=704,NAME=标清
edu.aliyun/hls/2452/stream/sd/4SBZFnkxAaTFxGcmC8kmEVs7PONigEDI.m3u8?courseId=137
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1096,NAME=⾼清
edu.aliyun/hls/2452/stream/hd/rqDyg23lwV87BcSiq3aDrRIQaGbjBs7t.m3u8?courseId=137
这个⽐较好理解,其实就是定义了两个码率对应的⼆级M3U8⽂件的下载地址。下⾯我们来看⼀下其中⾼清码率对应的⼆级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="edu.aliyun/hls/1109/clef/YnBGq7zAJf1Is7xIB5v8vI7AIORwwG9W",IV=0x0fe82567a6be41afda68d82d37 24976a
#EXTINF:8.583,
xuecdn2.aliyunedu/headLeader-0/20170519032524-ggauw1x00qo0okgk-conv/e_20170519032524-ggauw1x00qo0okgk-conv_hd_seg_0.ts
#EXT-X-DISCONTINUITY
#EXT-X-KEY:METHOD=AES-128,URI="edu.aliyun/hls/2452/clef/0VqtrHq9IkTfOsLqy0iC1FP9342VZm1s",IV=0xdebe4353e61b56e4ecfe0240ca 3f89f5
#EXTINF:10.080,
xuecdn2.aliyunedu/courselesson-50224/20170630095028-3xsfwyxw20cgwws8-conv/e_20170630095028-3xsfwyxw20cgwws8-conv_hd_seg_0.t s
#EXT-X-KEY:METHOD=AES-128,URI="edu.aliyun/hls/2452/clef/0VqtrHq9IkTfOsLqy0iC1FP9342VZm1s",IV=0x8a3ce90cf185********b94848 7c1729
#EXTINF:10.000,
xuecdn2.aliyunedu/courselesson-50224/20170630095028-3xsfwyxw20cgwws8-conv/e_20170630095028-3xsfwyxw20cgwws8-conv_hd_seg_1.t s
#EXT-X-KEY:METHOD=AES-128,URI="edu.aliyun/hls/2452/clef/0VqtrHq9IkTfOsLqy0iC1FP9342VZm1s",IV=0x1560e6de8540ce7f7d3377cbf38 1abbc
#EXTINF:10.000,
xuecdn2.aliyunedu/courselesson-50224/20170630095028-3xsfwyxw20cgwws8-conv/e_20170630095028-3xsfwyxw20cgwws8-conv_hd_seg_2.t s
#EXT-X-KEY:METHOD=AES-128,URI="edu.aliyun/hls/2452/clef/0VqtrHq9IkTfOsLqy0iC1FP9342VZm1s",IV=0x02df8ad1022c09c87fce78a7c29 6d53e
#EXTINF:10.000,
xuecdn2.aliyunedu/courselesson-50224/20170630095028-3xsfwyxw20cgwws8-conv/e_20170630095028-3xsfwyxw20cgwws8-conv_hd_seg_3.t s
#EXT-X-KEY:METHOD=AES-128,URI="edu.aliyun/hls/2452/clef/0VqtrHq9IkTfOsLqy0iC1FP9342VZm1s",IV=0x71d0bb1bd38ed564522cac46fd dd21ca
#EXTINF:10.000,
xuecdn2.aliyunedu/courselesson-50224/20170630095028-3xsfwyxw20cgwws8-conv/e_20170630095028-3xsfwyxw20cgwws8-conv_hd_seg_4.t s
#EXT-X-KEY:METHOD=AES-128,URI="edu.aliyun/hls/2452/clef/0VqtrHq9IkTfOsLqy0iC1FP9342VZm1s",IV=0x2aae5b93f21d772ca5942db2b9f eac8d
#EXTINF:10.000,
xuecdn2.aliyunedu/courselesson-50224/20170630095028-3xsfwyxw20cgwws8-conv/e_20170630095028-3xsfwyxw20cgwws8-conv_hd_seg_5.t s
...
bobo组合...
...
#EXT-X-KEY:METHOD=AES-128,URI="edu.aliyun/hls/2452/clef/0VqtrHq9IkTfOsLqy0iC1FP9342VZm1s",IV=0x3f1c20b9dd4459d0adf972eaba8 5e0a2
#EXTINF:10.000,
xuecdn2.aliyunedu/courselesson-50224/20170630095028-3xsfwyxw20cgwws8-conv/e_20170630095028-3xsfwyxw20cgwws8-conv_hd_seg_10 4.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⽂件都爬取下来。
EXT-X-KEY中的密钥⽂件
对于⼤多数的M3U8视频,⼀般是不加密的。对于⼀些重要的视频服务商,他们会对其视频做加密处理。M3U8视频⽬前的标准加密⽅式是使⽤AES-128进⾏加密处理。如果视频是加密的,就会在M3U8⽂件中出现以下信息:
王栎鑫老婆追星李现#EXT-X-KEY:METHOD=AES-128,URI="edu.aliyun/hls/2452/clef/0VqtrHq9IkTfOsLqy0iC1FP9342VZm1s",IV=0x3f1c20b9dd4459d0adf972eaba8 5e0a2
其中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⽂件
ts是⼀种视频封装格式,全称为MPEG2-TS。ts即”Transport Stream”的缩写。MPEG2-TS格式的特点就是要求从视频流的任⼀⽚段开始都是可以独⽴解码。那么在M3U8中为什么⽤ts⽂件⽽不⽤mp4⽂件呢?这是因为两个ts⽚段可以⽆缝衔接,播放器能连续播放,⽽mp4⽂件由于编码⽅式的原因,两段mp4不能⽆缝衔接,播放器连续播放两个mp4⽂件会出现破⾳和画⾯间断,影响⽤户体验。
因此,我们可以这样理解:M3U⽂件只是⾳频视频⽂件ts路径的封装或者容器,真正播放的是M3U8解析下载到本地的⼀段⼜⼀段的ts⾳频视频⽂件。
发布评论