视频自动检测是怎么工作的 — 原理与局限
检测原理(大致推测)
InShot 没有公开技术白皮书,但从实际行为可以反推出大致逻辑:
浏览器加载完页面 DOM 之后,App 的检测模块会:
- 扫描
<video>标签:HTML5 video 元素是最常见的视频嵌入方式,App 提取它的src属性或<source>子元素。 - 拦截网络请求:监听页面加载过程中发出的 HTTP 请求,识别 mp4、m3u8(HLS 流)、webm 等视频相关的 URL。
- 解析 Blob URL:有些网站用
blob:协议动态生成视频地址,App 可能通过 WebView 内部接口把它反查成实际的 CDN 链接。 - iframe 穿透:视频放在 iframe 里的话,递归进入 iframe 内部继续扫描。
检测完成后,在页面上匹配的视频区域附近弹出一个悬浮下载按钮,点一下就能选画质。
哪些情况能检测到
大部分公开可访问的网页视频都能命中:
- 直接用
<video>标签嵌入的视频 - 通过 CDN 直链分发的 mp4/mov 文件
- HLS 流媒体(m3u8 格式)
- 短视频平台的公开分享页面(非 App 内私有流)
哪些情况检测不到
下面这些场景是手机下载器的通病,这款也不例外:
| 场景 | 原因 |
|---|---|
| 需要 App 内播放的视频 | 视频流没有暴露在网页 DOM 里,WebView 根本看不到 |
| 严格 DRM 保护的内容 | 视频被加密,即使拿到 URL 也播不了 |
| RTMP 等私有协议 | 不走 HTTP,检测模块拦不到 |
| 需要多次跳转才能看到的视频 | 有些网站在视频加载前会跑一段 JS 做防爬虫检测,WebView 执行后可能暴露也可能被拦截 |
| 非常短的临时链接 | 部分网站的视频链接有几秒的有效期,检测还没扫完链接就失效了 |
命中率怎么提高
- 等页面完全加载完再看按钮——有些网站的视频是懒加载的,刚打开时 DOM 里还没有 video 标签。
- 桌面模式试试:某些网站在移动端和桌面端用不同的视频嵌入方式,切到桌面模式可能检测得到。
- 换个分享链接:同一个视频,从不同渠道分享出来的页面结构可能不一样——短视频平台分享到浏览器的链接通通常比 App 内部页面检测命中率高。