如何从视频直链下载 MP4 视频
如何从视频直链下载 MP4 视频
看到一个视频,右键没有"另存为",浏览器地址栏里也没有 .mp4。你八成遇到的是两种情况之一:要么是 M3U8/MPD 这种分片流,要么就是直链但被藏起来了。这篇文章只讲后者:怎么把藏起来的直链挖出来,怎么判断它是不是真的能下,以及下不动的时候到底卡在哪。
先搞清楚:什么叫视频直链
直链就是那种"一个 URL 直接指向一个文件"的下载。你拿到地址,丢进下载器,一个请求就把整个 MP4、WebM、MOV、MKV 拉下来。不像 HLS、DASH 那样要先拼清单再逐片下载。
| 视频直链 | HLS / DASH 流 | |
|---|---|---|
| 地址指向 | 单个文件 | 清单 + 分片 |
| 下载方式 | 一个请求 | 先解析清单,再逐片下载合并 |
| 失败表现 | 403 / 404 / 空文件 | 花屏、无声、合并失败 |
下面这些内容都围绕直链展开。如果你拿到的其实是 .m3u8 或 .mpd 地址,别在这篇里耗——去看 M3U8/HLS 流媒体下载入门 或者 如何下载带声音的 DASH 视频,方向不对,方法全是白搭。
如何确认它是视频直链
只看 .mp4 后缀不够,很多网站会在 CDN 后面加一堆签名参数,甚至把后缀藏掉。判断标准就一个:请求返回的 Content-Type 是不是 video/*。
方法一:开发者工具看 Network
打开视频页面,F12 进开发者工具,切到 Network 面板,筛选 mp4 或 webm,开始播放视频:
- 找到一个 URL 里带
.mp4/.webm的请求。 - 点开看响应头的
Content-Type。 - 是
video/mp4或video/webm,这就是直链。
方法二:curl 直接验证
拿到疑似地址后,用 curl 看它到底返回什么(把地址换成你自己的):
curl -sI "https://cdn.example.com/course/lesson1.mp4" | head -n 10
重点看两行:
HTTP/1.1 200 OK
Content-Type: video/mp4
Content-Length: 52428800
Content-Type 是 video/mp4 说明地址是对的。如果返回的是 text/html,说明这根本不是视频,是一个网页——你复制错地址了。直链的检测原理和格式支持范围,见 视频嗅探 — 支持的视频格式。
用 FlowPick 扩展下载
第 1 步,打开视频实际播放的页面,播放几秒,让直链真的被请求一次。
第 2 步,打开 FlowPick 扩展,在资源列表里筛选"视频",挑出 video/mp4、video/webm 类型的条目,别选缩略图或封面图。
第 3 步,确认右侧预览能正常播放,格式无误后点下载。
第 4 步,下载完成后打开文件,确认能播放再关掉原页面。

扩展跑在源页面上下文里,Referer、Cookie 自动带上,大部分防盗链校验直接过。这是扩展比在线工具强的地方,在线工具跑在自己域名下,带不了目标站点的登录态。两者差异见 在线工具 — 与扩展的区别。
如果你只是偶尔下一个、没有防盗链校验,也可以用 在线视频下载器,粘贴直链地址就能下。
常见错误逐个拆
403 Forbidden:请求头不对
视频很少真的"没权限",更多是校验没过:
- Referer 校验:要求请求来自特定页面,空 Referer 直接拒绝。
- Cookie / 登录态:没带登录 Cookie,或已过期。
- 临时令牌:URL 里的
?token=过期了。
用 curl 复现一下,确认是不是 Referer 的问题:
# 不带任何头,看裸请求返回什么
curl -s -o /dev/null -w "%{http_code}\n" "https://cdn.example.com/course/lesson1.mp4"
# 带上页面 Referer 再试
curl -s -o /dev/null -w "%{http_code}\n" \
-H "Referer: https://www.example.com/course/123" \
"https://cdn.example.com/course/lesson1.mp4"
带 Referer 就好了,说明是防盗链。换扩展下,扩展在源页面里跑,Referer 自动补齐,v1.1.1 之后还内置了防盗链代理,预览和下载都会自动带上正确请求头。在线工具做不到这点。代理细节见 FlowPick v1.1.1 更新。
404 Not Found:地址过期或拿错了
直链最烦的就是"昨天还能下,今天 404"。常见三种:
- 临时签名 URL 过期:云存储(OSS、COS 等)的直链带有效期,过几分钟到几小时就失效。
- 文件被清理:上传者删了文件,或 CDN 缓存被清。
- 复制错地址:你复制的是播放页地址,不是文件直链。
地址真失效就没救——回到原视频页面重新检测一次,拿新的直链再下。
CORS 错误:在线工具特有的坑
如果你在用在线工具下载且报 CORS 错误,这不是你操作的问题,是工具本身的限制:在线工具跑在 flowpick.com 域名下,浏览器同源策略会拦跨域读取。换扩展,扩展有独立权限,不受同源策略限制,检测范围和成功率都高一截。细节见 视频嗅探 — 扩展与在线工具的检测差异。
文件不完整:服务器不支持断点续传
下载能开始,但暂停后从 0 重来,或者下到一半失败——这跟服务器支不支持 HTTP Range 有关。Range 允许客户端只请求文件的一部分,断点续传全靠它。
测一下服务器支不支持:
curl -s -o /dev/null -w "%{http_code}\n" \
-H "Range: bytes=0-1023" \
"https://cdn.example.com/course/lesson1.mp4"
# 206 = 支持 Range,可以断点续传
# 200 = 返回完整文件,说明不支持
返回 206 没问题;返回 200(完整文件)说明不支持 Range,那就别中途暂停,一次下完。这是服务器能力问题,换工具也一样。
下载下来打不开怎么办
文件下下来了、体积也正常,但播放器报"格式不支持"或黑屏。这里要分清两个概念:容器和编码。.mp4 是容器,里面装的可能是 H.264,也可能是 H.265/HEVC 或 AV1。容器支持不等于编码支持,播放器得能解码里面那层编码才能放出来。
遇到编码不支持,用 格式转换 转成兼容性更好的 H.264 MP4 就行。你的浏览器到底能播什么格式,参考 浏览器兼容性。
大文件(几百 MB)下载到一半页面卡住,是浏览器把文件暂存在内存里的原因。FlowPick 优先走 File System Access API(选目录后流式写入,不占内存),不支持时退回 Blob 模式,大文件就可能卡。对策很简单:优先选"选择保存目录",别用默认下载;实在不行就下低画质版本。Blob 模式的硬限制见 已知限制。
分不清直链、M3U8、MPD 怎么办
拿到的地址后缀带 .m3u8 或 .mpd,那根本不是直链,是流媒体清单。别硬下:
.m3u8→ M3U8 下载工具 或 HLS 入门教程.mpd→ DASH 下载工具 或 DASH 视频下载教程
小结
直链下载就四步:找到视频真正播放的页面 → 从 Network 或 FlowPick 里挖出 video/* 的地址 → 用 curl 验证没拿错 → 下载完先测再走。遇到 403 换扩展、404 重新检测、CORS 别用在线工具、文件不完整先查 Range。剩下那些疑难杂症,视频直链下载失败排查 里按症状全列出来了。请只下载你有权保存的视频。
相关文章
- 视频直链下载失败:403、404 与文件不完整 —— 这篇博客的完整排查版,带 curl 诊断命令
- 如何下载 M3U8/HLS 流媒体 —— 直链的隔壁亲戚,分片流下载入门
- 如何下载带声音的 DASH 视频 —— 音视频分离的 MPD 流怎么下
- 视频嗅探 — 直接视频文件 —— 直链检测原理和格式范围
- FlowPick 是怎么在浏览器里合并几百个视频分片的 —— 分片流背后的合并原理
推荐阅读
- 如何下载 Bilibili 视频 —— 一个站里直链、DASH、HLS 三种格式全有
- FlowPick vs. yt-dlp —— 浏览器点几下 vs 命令行敲半天
- 批量下载网页图片 —— 不只是视频,图片也能一键批量抓
- 流媒体下载到底合不合法? —— 动手之前先看看这条红线