youtubedl-android:把 yt-dlp 搬进安卓手机
文章目录
- youtubedl-android:把 yt-dlp 搬进安卓手机
- 能干什么?
- 怎么用?
- FFmpeg 和 Aria2c
- 基于这个库的 App
- 需要注意的地方
- 适合谁用
youtubedl-android:把 yt-dlp 搬进安卓手机
yt-dlp 这个工具,搞视频下载的应该都听过。它能从 YouTube、B 站、Vimeo 等几百个网站抓视频,命令行里敲一行就能下。但问题是,它只能在电脑上跑。想在手机上用?没门。
youtubedl-android 就是来解决这个问题的。它把 yt-dlp 打包成了 Android 库,让你在安卓 App 里直接调用 yt-dlp 的全部功能。项目拿了 1300 多个 Star,虽然不算爆火,但确实是实打实解决问题的工具。
能干什么?
说白了,就是让你的安卓 App 具备视频下载能力。具体来说:
下载视频。给它一个链接,它帮你抓下来,还能指定保存路径、选择画质格式。支持进度回调,下载到百分之多少、还剩几秒,都能拿到。
获取视频信息。不下载,只拿视频的标题、时长、分辨率这些元数据。做预览功能的时候用得上。
流式播放。不落盘,直接拿播放链接,配合 ExoPlayer 之类的播放器就能在线看。
停止下载。下载到一半不想下了,随时能停。
这些功能都是通过 yt-dlp 的命令行参数实现的,yt-dlp 支持的参数它都支持。
怎么用?
集成方式是标准的 Gradle 依赖,三行代码搞定:
implementation("io.github.junkfood02.youtubedl-android:library:0.18.1") implementation("io.github.junkfood02.youtubedl-android:ffmpeg:0.18.1") implementation("io.github.junkfood02.youtubedl-android:aria2c:0.18.1")aria2c 是可选的,装了之后下载速度会快一些,用的是多线程下载。
初始化也简单,在 Activity 的 onCreate 里调一下就行:
YoutubeDL.getInstance().init(this);下载视频的代码大概长这样:
File dir = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS), "youtubedl-android"); YoutubeDLRequest request = new YoutubeDLRequest("https://vimeo.com/22439234"); request.addOption("-o", dir.getAbsolutePath() + "/%(title)s.%(ext)s"); YoutubeDL.getInstance().execute(request, (progress, etaInSeconds) -> { // 这里拿到进度和剩余时间 });代码不多,逻辑也清晰。yt-dlp 的可执行文件和 Python 运行时都打包在库里了,不用额外配置环境。
FFmpeg 和 Aria2c
如果你需要音频提取、格式转换这些功能,得把 FFmpeg 也初始化了。比如你想从视频里提音频,或者把 WebM 转成 MP4,都得靠它。
Aria2c 是下载加速器。默认的下载方式是单线程,装了 Aria2c 之后可以多线程下,速度能快不少。初始化的时候多一行代码就行。
基于这个库的 App
这个库本身只是个 SDK,不带界面。但已经有两个不错的 App 是基于它做的:
dvd 是作者自己做的视频下载 App,界面简洁,功能完整,适合直接用。
Seal 是另一个开发者做的,功能更丰富,界面也更好看,算是把这个库的能力发挥得比较彻底。
两个都是开源的,可以下载体验,也可以看源码学习怎么用这个库。
需要注意的地方
Android 10 以上系统有 Scoped Storage 限制,App 只能直接访问 Download 和 Documents 目录。所以下载路径别乱设,老老实实放到这两个目录下。
APK 体积会比较大,因为库里打包了 yt-dlp、Python、FFmpeg 这些。可以用 abi splits 按架构拆包,只打包目标设备需要的 CPU 架构。
复杂排版的网页、需要登录才能看的视频,yt-dlp 本身就不一定能搞定,这个库也一样。
适合谁用
想在安卓 App 里加视频下载功能的开发者。不用自己折腾 yt-dlp 的交叉编译,不用处理 Python 运行时的兼容问题,直接一个依赖搞定。
做内容聚合、媒体播放类 App 的团队,如果需要离线缓存视频,这个库能省不少功夫。
dlp 的交叉编译,不用处理 Python 运行时的兼容问题,直接一个依赖搞定。
做内容聚合、媒体播放类 App 的团队,如果需要离线缓存视频,这个库能省不少功夫。
