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标准,可以参考国际标准组织的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文件

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=标清
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视频爬虫。以下是上节中提到的高清码率对应的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文件都爬取下来。

EXT-X-KEY中的密钥文件

对于大多数的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文件

ts是一种视频封装格式,全称为MPEG2-TS。ts即”Transport Stream”的缩写。MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码。那么在M3U8中为什么用ts文件而不用mp4文件呢?这是因为两个ts片段可以无缝衔接,播放器能连续播放,而mp4文件由于编码方式的原因,两段mp4不能无缝衔接,播放器连续播放两个mp4文件会出现破音和画面间断,影响用户体验。

因此,我们可以这样理解:M3U文件只是音频视频文件ts路径的封装或者容器,真正播放的是M3U8解析下载到本地的一段又一段的ts音频视频文件。

Captain QR Code

扫码联系船长

3 thoughts on “M3U8流视频数据爬虫详解一:M3U8视频文件详解

  • 2020年1月9日 at 上午8:10
    Permalink

    大佬,你好,我想问一下,我有一个加密的m3u8文件,有key和iv,但是我解密时把iv值也等于key解密,视频也能正常解密播放,请问此时的iv值有什么用呢,还有就是你说的没有iv值,用序列号作为iv,序列号是什么呢,在哪里获取?

    Reply
  • 2020年1月13日 at 下午2:31
    Permalink

    IV是加密向量。一般用在AES里面的。一般来说,KEY和IV是一对的,才能正常解密。理论上是不可能怎么解密出来的。建议你可以看一下AES的解密代码,就了解了。

    Reply

发表回复

您的电子邮箱地址不会被公开。