下载 HLS 视频:youtube-dl 建功

一日一技

今天看到苹果官网开卖两款新的智能水杯 HidrateSpark PRO 和 PRO STEEL。能够自动记录饮水量到 Apple Health,并通过机身 RGB 灯光提醒喝水。这个喝水的频率是根据你的 Apple Watch 和 iPhone 收集到的卡路里去去计算。运动多了,就会提醒你多喝水。简直就是 WaterMinder 的硬件版。

在网页中,他的推广视频十分吸引,很有「果味」——无论是音乐节奏、相机旋转的方式再到末尾的爆炸图。自然地,我想把它下载发给朋友观看。

首先,我尝试右键视频,看看有没有直接下载的按钮。果不其然,正如我无法直接右键下载哔哩哔哩和 YouTube 视频,苹果也没有让人轻松下载视频的方法。

接着,F12 打开开发者工具,查看有没有完整视频 CDN 的位置,结果发现视频是通过串流,分开多个小部分传送过来,格式为 .m4s,并非一条完整的 mp4 视频 。No luck 🤷‍♂️

image-20220427150125050

youtube-dl

在网上查找了一段时间后,发现大名鼎鼎的 youtube-dl 可以应付这个情况。虽然这个程序的名字指的是 YouTube Download,但是它实质上可以下载几乎每个网站的视音频资源。

我先使用 -F 让他找出苹果水杯产品页面所有的视频和音频资源。

youtube-dl -F https://www.apple.com/shop/product/HQ212ZM/A/hidratespark-pro-steel-smart-water-bottle

其中 https://www.apple.com/shop/product/HQ212ZM/A/hidratespark-pro-steel-smart-water-bottle 是苹果这个水杯产品页面的 URL。

得到的结果如下:

[info] Available formats for hidratespark-pro-steel-smart-water-bottle:
format code          extension  resolution note
hls-audio-English-0  mp4        audio only [en]
hls-audio-English-1  mp4        audio only [en]
hls-401              mp4        640x360     401k , avc1.64001e, video only
hls-2200             mp4        960x540    2200k , avc1.64001f, video only
hls-3850             mp4        1280x720   3850k , avc1.64001f, video only
hls-6600             mp4        1920x1080  6600k , avc1.640028, video only
6                    x-m4v      unknown    (best)
[download] Finished downloading playlist: HidrateSpark PRO STEEL 32 oz. Smart Water Bottle - Silver

HLS 是 HTTP Live Streaming 的缩写,一个苹果公司开发的串流通讯协议。

看来「hls-600」正是我需要的。视频格式为 .mp4 ,清晰度为 1920x1080 。我没有注意到这行最后面写着「video only」,这是后话。

-f 后标明希望下载的格式(hls-600),-o 后标明希望输出的文件名字。这次利用 youtube-dl 下载视频:

youtube-dl -f hls-6600 https://www.apple.com/shop/product/HQ212ZM/A/hidratespark-pro-steel-smart-water-bottle -o apple_bottle.mp4

成功下载,奇怪的是视频没有音频。这时我才注意到下载下来只是「video only」的文件。我需要同时把音频和视频下载下来,再进行合并获得一条带声音的视频画面。

幸运的是,youtube-dl 自带了这个功能,不需要我们使用额外的视频剪辑软件进行合并。

和刚才只下载视频不同,这次我们不但要同时下载音频,还要把他们合并输出成一个完整的 mp4 视频。首先,在 -f 里加上 bestaudio 。然后加一个 --merge-output-format mp4(如果需要 mkv 格式则是 --merge-output-format mkv)。

再试试:

youtube-dl -f hls-6600+bestaudio --merge-output-format mp4 https://www.apple.com/shop/product/HQ212ZM/A/hidratespark-pro-steel-smart-water-bottle

现在我成功获取一条高清、带声音的视频了。

以上的步骤在其他网站大多都适用。只需要把我的目标 URL 从 https://www.apple.com/shop/product/HQ212ZM/A/hidratespark-pro-steel-smart-water-bottle 换成你希望找的视频网站即可。