欧乐视频下载分析
准备
俗话说的好,磨刀不误砍柴工,万事都得先做准备与计划。
准备工具:
- 中间人代理,例如 Charles 或 Fiddler Classic 并信任其证书。
- Chrome / Firefox + 代理扩展,将代理流量转发到反代服务器。
youtube-dl
以及搭配使用的ffmpeg
二进制文件一份。现代的 JavaScript 代码编辑器,Atom、VSCode 或 WebStorm 均可;写完发现不需要
环境测试:
- 确保浏览器能正常将 HTTPS 流量转发至中间人代理并能监视解密后的流量。
开始
首先随便挑选一则视频。低调点找个不出名的片,例如《老虎》。
观察网络流量,可以发现网站发出了数个媒体请求:
https://europe.olemovienews.com <-- 主域名
\ /hlstimeofffmp4/20200726/vHmIrojb/mp4/vHmIrojb.mp4 <-- 文件 (分割前)
| /master.m3u8 <-- 主播放列表
\ /index-v1-a1.m3u8 <-- 第一个画质播放列表
接下来的就好办了,直接扔 youtube-dl 看看有没有加密:
$ youtube-dl https://europe.olemovienews.com/hlstimeofffmp4/20200726/vHmIrojb/mp4/vHmIrojb.mp4/master.m3u8
[generic] master: Requesting header
[generic] master: Downloading m3u8 information
[download] Destination: master-master.mp4
......
[hls @ 000001c512e77180] Skip ('#EXT-X-ALLOW-CACHE:YES')
[hls @ 000001c512e77180] Skip ('#EXT-X-VERSION:6')
[hls @ 000001c512e77180] Opening 'https://europe.olemovienews.com/hlstimeofffmp4/20200726/vHmIrojb/mp4/vHmIrojb.mp4/init-v1-a1.mp4' for reading
[https @ 000001c513389200] HTTP error 502 Cannot find server.
[hls @ 000001c512e77180] Failed to open an initialization section in playlist 0
[hls @ 000001c512e77180] Error when loading first segment 'https://europe.olemovienews.com/hlstimeofffmp4/20200726/vHmIrojb/mp4/vHmIrojb.mp4/seg-1-v1-a1.m4s'
https://europe.olemovienews.com/hlstimeofffmp4/20200726/vHmIrojb/mp4/vHmIrojb.mp4/index-v1-a1.m3u8: Server returned 5XX Server Error reply
ERROR: ffmpeg exited with code 1
竟然出错了。打开抓取的请求回应一看,提示找不到域名…
于是从 Charles 复制 cURL 指令出来到终端执行,请求回应的错误信息一模一样:
于是就随便试了下,把第一个头 Range
给去掉了,发现可以正常下载片段:
去搜索引擎搜了下 ffmpeg 与 Range
头方面的说明,发现也有人报告过 Range
头信息而导致 m3u8 下载失败的情况1;
而该追踪贴也提到了一点,即可利用 seekable
参数来关闭这个请求头。
最后就是让 youtube-dl 调用 ffmpeg 的时候传入这个参数了,即:
--external-downloader-args "-http_seekable 0"
因此,最终的下载指令:
youtube-dl \
--output '老虎.mp4' \
--external-downloader-args "-http_seekable 0" \
https://europe.olemovienews.com/hlstimeofffmp4/20200726/vHmIrojb/mp4/vHmIrojb.mp4/master.m3u8
下载后的文件参数如下:
$ mediainfo 老虎.mp4
General
Complete name : 老虎.mp4
Format : MPEG-4
Format profile : Base Media
Codec ID : isom (isom/iso2/avc1/mp41)
File size : 487 MiB
Duration : 1 h 25 min
Overall bit rate : 799 kb/s
Writing application : Lavf58.45.100
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : [email protected]
Format settings : CABAC / 4 Ref Frames
Format settings, CABAC : Yes
Format settings, Reference frames : 4 frames
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 1 h 25 min
Bit rate : 683 kb/s
Width : 1 280 pixels
Height : 538 pixels
Display aspect ratio : 2.40:1
Frame rate mode : Constant
Frame rate : 24.000 FPS
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.041
Stream size : 417 MiB (86%)
Color range : Limited
Color primaries : BT.709
Transfer characteristics : BT.709
Matrix coefficients : BT.709
Codec configuration box : avcC
Audio
ID : 2
Format : AAC LC
Format/Info : Advanced Audio Codec Low Complexity
Codec ID : mp4a-40-2
Duration : 1 h 25 min
Bit rate mode : Constant
Bit rate : 110 kb/s
Channel(s) : 2 channels
Channel layout : L R
Sampling rate : 48.0 kHz
Frame rate : 46.875 FPS (1024 SPF)
Compression mode : Lossy
Stream size : 67.2 MiB (14%)
Default : Yes
Alternate group : 1
获取 m3u8 链接
都不用分析,直接看播放器页面的 HTML 代码即可。作为一个 JS 对象塞到了 script
里面。
var player_aaaa={"flag":"play","encrypt":0,"trysee":0,"points":0,"link":"\/index.php\/vod\/play\/id\/20455\/sid\/1\/nid\/1.html","link_next":"","link_pre":"","url":"https:\/\/europe.olemovienews.com\/hlstimeofffmp4\/20200806\/ihrwqdhr\/mp4\/ihrwqdhr.mp4\/master.m3u8","url_next":"","from":"plyr","server":"no","note":"","id":"20455","sid":1,"nid":1}
结论
没有加密,没有真正的“高清”,凑合着看没啥问题。
如果是所谓“会员”的高清画质,可能会有加密?没有买会员,就不测试了。
some servers refuse to responde for requests with Range header(header set by ffmpeg): https://trac.ffmpeg.org/ticket/6125 ↩︎