本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容:
- 我的帖子已经打上 开源推广 标签: 是
- 我的开源项目完整开源,无未开源部分: 是
- 我的开源项目已链接认可 LINUX DO 社区: 是
- 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是
- 以上选择我承诺是永久有效的,接受社区和佬友监督: 是
以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出
我最近搞了一个 Android 开源项目 SurfSave,想发出来给佬友们试试看:
在一个 Android 浏览器的基础上。
- 浏览网页时自动检测符合条件的媒体请求
- 检测到视频后,可以直接使用内置播放器或者自己已有的播放器在线播放
- 也可以选择检测到的资源和清晰度下载
- 支持普通直链、HLS / DASH、yt-dlp 等不同下载方式
差不多就是:
浏览网页 → 检测视频 → 内置在线播放 / 外部播放器 / 下载保存
对默认播放器的小窗进行了一些优化,除了常见的暂停、放大、关闭之外,还有快进和后退等。(很难想象,很多小窗根本不支持这一点。这一部分也是我做这个项目的初始原因。)
项目使用 GPL-3.0 开源,支持 Android 7.0 及以上。
GitHub:

从浏览器首页、网页媒体检测,到在线播放和下载入口。
接下来是详细介绍
为什么会做这个东西
起因其实挺简单的。
我平时会直接在手机浏览器里看一些网页视频,但是很多网站自带的播放器体验实在一言难尽。
有的不能左右滑动进度,有的全屏逻辑很奇怪,有的播放器操作起来就是手感不好。
而我自己又有几个比较固定的习惯:
- 遇到喜欢的视频会想下载下来收藏
- 有时候想直接用手机里已经安装好的播放器看视频
- 经常使用小窗,一边看小说或者漫画,一边在旁边播放视频或者听声音
结果找了一圈,能同时比较顺手地完成:
浏览网页 → 检测视频 → 播放 / 外部播放器 / 下载 / 小窗
这一整套操作的软件,好像还真不多。
所以最后干脆自己折腾了一个,于是就有了 SurfSave。
SurfSave 也是我的一个 Vibe Coding 实验项目。没啥创新点,更多是把一些现有的架构整合了一下。目前肯定还有不少粗糙的地方和奇奇怪怪的 Bug,先发出来让大家帮忙踩踩坑。
SurfSave 是怎么使用的
它首先还是一个 Android 浏览器。
在正常浏览网页时,SurfSave 会尝试检测页面加载过程中出现的媒体请求。
检测到视频以后,可以进入媒体详情,查看候选资源,然后选择:
- 使用 SurfSave 内置播放器在线播放;
- 调用设备上已经安装的外部播放器;
- 选择候选资源和清晰度加入下载队列。
不需要自己手动寻找 m3u8 或媒体直链。
一个围绕网页视频,重新把浏览、检测、播放、下载和画中画串起来的浏览器壳。
在线播放和播放器选择
这是我自己比较需要的功能。
检测到网页视频以后,可以直接使用 SurfSave 内置播放器在线播放,不需要先把视频下载下来。
如果不喜欢内置播放器,也可以通过在线播放按钮旁边的小箭头,选择手机上已经安装的播放器。
第一次添加外部播放器时,会调用 Android 系统的播放器选择界面。使用过的播放器会记录在 SurfSave 的播放器列表中,之后可以直接切换。
比如平时习惯使用 VLC、MX Player、mpv 或其他播放器,就不必一直被网页自带的播放器绑住。
视频下载和下载队列
目前针对普通媒体直链、HLS / DASH、直播流和 yt-dlp 页面解析,分别做了不同的下载处理。
也支持部分 HLS AES-128 加密流、播放列表和批量解析。
下载任务有独立队列,可以:
- 调整并发数量;
- 对任务排序;
- 稍后下载;
- 检查重复任务;
- 查看每个任务的日志和具体报错。
另外还做了 Cookie 配置导入和导出。一些登录以后才能访问的视频,可以尝试携带 Cookie 下载。
下载完成后,视频会进入 SurfSave 的视频库,可以直接管理、播放或者分享。

下载任务、本地视频库和多标签页管理。
内置播放器和小窗
内置播放器既可以播放检测到的在线媒体,也可以播放已经下载到本地的视频。
目前支持:
- 在线和离线播放;
- 双击左右区域快退或快进;
- 水平滑动调整播放进度;
- 拖动时显示缩略图预览;
- 倍速播放;
- 字幕和音轨切换;
- 画面比例调整;
- Picture-in-Picture。
画中画不是下载完成以后才能使用。
只要在线媒体能够通过 SurfSave 内置播放器正常播放,就可以直接进入画中画;本地视频同样支持。
PiP 是我自己用得比较多的功能。
特别是看小说或者漫画的时候,我很喜欢在旁边挂个小窗播放视频或者听东西。
不知道有没有佬友和我一样有这种奇怪习惯。

左侧是网页视频在线画中画,右侧是内置播放器横屏播放。
浏览器本身的功能
为了让它不只是一个专门用来粘贴链接的下载器,浏览器本身也补了一些基础功能。
目前包括:
- 多标签页
- 历史记录和书签
- Cookie
- Google、Bing、百度和 DuckDuckGo等不同引擎的选择
- 长按链接后台打开
- 页面语言检测和 ML Kit 翻译
- DoH
- 可选的 Xray/libv2ray 代理
- 应用数据备份和恢复
目标还是尽量让它能够同时作为一个正常浏览器使用。
目前明确做不到的东西
这里提前说明一下,免得产生误解。
不支持下载 DRM / Widevine 内容这块有点难搞。
另外还有这些限制:
- 网站修改结构、接口或者登录策略后,媒体检测和 yt-dlp 解析可能暂时失效;
- 某些登录内容需要 WebView Cookie 或手动导入 Cookie;
- 外部播放器只能拿到媒体 URL 和标题,不会自动继承 WebView 中的 Cookie、Referer 或 Authorization;
- 因此,一些登录保护或者强防盗链媒体可能只能使用内置播放器;
- 直播只能从开始下载以后实时捕获,不能获取此前已经播出的部分;
- 在线播放效果还会受到网络、媒体编码和手机解码能力的影响。
所以它肯定不是个“全网万能视频下载神器”,我这还得学。
关于项目本身
项目使用 Kotlin / Android 开发。
播放器基于 Media3,媒体解析和处理涉及 yt-dlp、FFmpeg / FFmpegKit 等组件。
SurfSave 是在很多开源项目的基础上继续开发和重构出来的,同时也参考了 youtube-dl-android、youtubedl-android 和 Seal 等项目。
完整来源和第三方开源声明都保存在仓库中。
项目使用 GPL-3.0 开源。
最后
我自己平时已经在使用 SurfSave,但网页媒体的实现方式千奇百怪,一个人很难覆盖所有网站、Android 版本和设备型号。
如果遇到:
- 网页媒体检测不到;
- 下载失败;
- 在线或本地播放异常;
- 标签页、画中画或者横竖屏出现问题;
- UI 有奇怪的地方;
- 有什么特别需要补充的功能;
都可以直接在帖子下面反馈,或者提交 GitHub Issue:
如果反馈下载问题,可以附上 SurfSave 版本、Android 版本、网页地址和任务错误日志。
日志中如果包含 Cookie、账号或者其他隐私信息,记得先删除。
合理而且我有能力实现的功能,我会慢慢往里面加。
也欢迎各位大佬直接肘击代码。
后续计划着手增加网页去广的功能。(大概会是对特殊网站特殊处理的方式)