上一篇文章记录了HLS视频的抓取流程,本文简单记录下一个DASH VOD视频的手动抓取流程以备忘。
DASH简介
DASH全称“Dynamic Adaptive Streaming over HTTP”。顾名思义,这种自适应流媒体技术最大的特点就是服务端将会存储不同码率的流,根据客户端的网络连接情况自动选择可以流畅播放、合适的流,并实现不同分辨率、码率流的无缝切换。
MPEG-DASH作为一种流媒体解决方案,依托现有的HTTP Web服务器,因此可以兼容绝大多数设备,并且不受限于任何编码格式。同时其可以使用Widevine等DRM技术,因此被NETFLIX、Amazon Prime Video、YouTube等大型流媒体网站广泛采用。
mpd索引文件
同HLS一样,MPEG-DASH同样有一个类似m3u8的索引文件,即Media Presentation Description (MPD),一个后缀名为.mpd的XML文件。
mpd文件会在每次播放前首先请求,其中记录了包括音视频参数、内容分段时长、不同流的码率及分辨率以及各自的URL等一切需要的信息。下图清晰总结了mpd文件中的内容及关系。
一个DASH文件可以包含一个或多个Periods,每个Period代表一段连续的视频片段。通常如果是VOD,那么只会有一个Period,如果是直播则会周期性的请求新的mpd文件。
一个Period由一个或多个AdaptationSets组成。通常情况下在一个VOD视频中,一个AdaptationSet包含同一视频内容的多个不同比特率的视频分段,另一个AdaptationSet包含同一音频内容的多个不同比特率的视频分段。
一个AdaptationSet由一组媒体内容配置可切换的Representations构成。显然,每一个Representation都包含了不同分辨率、码率的流以供选择。
每一个Representation都如同HLS的m3u8文件中一样,记录了segments的URL。
不同于HLS,DASH中有Initialization Segment的概念,该segment记录了媒体文件的解封装信息,通常命名为init。在线播放时将首先请求init文件,抓取后合并segments时必须将init文件放置于头部。
其余segments文件的URL,有可能以段列表(SegmentList)的形式存储,即每一个segments的URL都列出,也有可能以段模版(SegmentTemplate)的形式存储,即单列一个URL模板。抓取的时候只需将模板中不同的部分替换为通配符即可抓取。
视频抓取
1.抓取
抓取通常不会有障碍,如果需要的话附上cookies、User-Agent等HTTP Header即可。通过浏览器F12-Networks工具查看init文件与segments文件链接,或直接从mpd文件中复制,利用任意批量下载软件搭配通配符即可抓取下所有segments,例如IDM或shua。
2.合并
抓取下来的是许多segments,这里可以使用Windows自带的copy命令进行二进制连接。
假设init文件名为init.mp4,余下segments文件名为:media_0.m4s、media_1.m4s……media_100.m4s。
为了copy命令能够正确识别序号的先后顺序,首先需要用任意批量重命名工具将文件名的序号部分重命名为等长度,如:media_000.m4s、media_001.m4s……media_100.m4s。
然后在cmd中加载到segments存储目录,使用命令:
copy /b init.mp4+media_*.m4s encrypt.mp4
其中,该命令会按照加号前后的文件顺序依次合并,序号改为通配符,encrypt.mp4为输出文件名,这样就得到了完整媒体文件。
附录:解密
众所周知,DASH文件可以使用Widevine等DRM技术,解密的关键点同样在于获取Key与KID。
本文不会介绍任何破解DRM的方法,感兴趣的可以自行关键字搜索,相信会有所收获。有一点需要注意的是,这也与浏览器版本及其DRM模块有关,如自行测试成功需注意备份相关文件。
如果已经成功获取了DRM加密视频的Key,则将合并好的加密媒体文件、对应的mpd文件,mp4decrypt.exe置于同一目录下(可从mp4box套件中获取,也可以看看这个GUI),运行如下代码:
mp4decrypt --key 1:%KEY% encrypt.mp4 decrypt.mp4
1为你需要解密的媒体文件track ID,%KEY%为HEX格式的Key,encrypt.mp4为待解密的媒体文件名,decrypt.mp4为输出的解密后媒体文件名。
执行完毕后即可在同文件夹下生成解密后的媒体文件。
以上就是手动抓取并解密DASH VOD视频的流程。事实上很多地方都和HLS大同小异,互相参考即可。