|
```html 浏览器开发者工具里那个 Network 面板,下载下载能直接抓到大多数网页视频的网页无法真实地址。上周我想存一段 TED 演讲,下载下载页面上的网页无法下载按钮是灰的,右键也没有“另存为”。下载下载按 F12 打开 Network,网页无法刷新页面,下载下载在筛选框里敲 m3u8 或者 mp4,网页无法等视频开始播放,下载下载列表里立刻冒出一个 .m3u8 文件。网页无法复制那个链接,下载下载丢进 VLC 播放器,网页无法它就能直接播——VLC 的下载下载“媒体”菜单里有个“转换/保存”,选好输出格式,网页无法点开始,下载下载等进度条走完,文件就躺在硬盘上了。整个过程不到三分钟,比装一堆插件干净得多。 但 m3u8 不是普通视频文件,它是个播放列表,里面是一堆 .ts 碎片。直接下载 m3u8 得到的是个文本,得用 ffmpeg 合并。命令就一行:ffmpeg -i "https://xxx.m3u8" -c copy output.mp4。Windows 用户去 ffmpeg 官网下个压缩包,解压后把 bin 目录加到环境变量,或者干脆在 bin 目录里开 cmd。Mac 用 Homebrew 一句 brew install ffmpeg 完事。这条命令我用了不下五十次,从没出过岔子。唯一要注意的是链接里如果有 & 这类符号,得用引号把整个 URL 包起来。 有些网站把视频切成几百个小片段,每个 .ts 只有几秒。ffmpeg 会自己按顺序拼,但网络不稳的时候可能漏掉一两个。这时候可以改用 yt-dlp,它专门对付各种流媒体协议,连加密的 .m3u8 都能处理——前提是你有解密密钥。不过多数普通网站没这么复杂,ffmpeg 足够。我试过用 ffmpeg 抓一个在线课程的 m3u8,两小时视频,合并后音画同步,文件大小 1.2G,和原站几乎一样。 遇到 blob: 开头的地址就别在 Network 里瞎找了。那种视频是 MediaSource 扩展动态生成的,真实数据藏在 JavaScript 里。有个取巧的办法:打开 Chrome 的 chrome://media-internals,播放视频,看“属性”里的 kSourceUrl。或者装个叫 “The Stream Detector” 的扩展,它专门嗅探这类流。我帮同事下过一个企业培训视频,页面右键被禁用,F12 里全是 blob,最后用这个扩展抓到了 m3u8。扩展不是万能的,但比手动翻 JS 省事。 还有一类网站用 mp4 但加了 Referer 校验。直接下载会返回 403。curl 加个 -e 参数就行:curl -e "https://www.example.com" -O https://cdn.example.com/video.mp4。或者用浏览器扩展 “Referer Modifier” 临时改请求头。我碰到过一个新闻网站,视频地址是 https://cdn.news.com/xxx.mp4,浏览器里能播,wget 报错。加上 Referer 后立刻开始下载。这种校验很弱,纯粹是防君子不防小人。 实在搞不定的,录屏是最后手段。OBS Studio 免费,设置里选“窗口采集”或“显示器采集”,音频选“桌面音频”,点开始录制,播完点停止。画质有损失,但总比没有强。我录过一场直播,两小时,文件 3G,用 HandBrake 压到 500M,肉眼几乎看不出区别。录屏的缺点是得实时等,不能后台跑。不过对于加密流或者 DRM 保护的视频,录屏是唯一合法且可行的办法——别去碰那些破解 Widevine 的工具,法律风险太大。 下载完记得检查文件完整性。用 ffprobe output.mp4 看时长和编码,和原视频对一下。有次我合并的 m3u8 少了最后 10 秒,因为最后一个 ts 没下全。重新跑一遍 ffmpeg 就好了。网络差的时候可以给 ffmpeg 加 -reconnect 1 -reconnect_streamed 1 参数,让它自动重试。这些小细节没人会写在教程里,但踩过坑就知道有多重要。 ``` |