
移动开发音视频【免费下载链接】Seal Video/Audio Downloader for Android, based on yt-dlp项目地址https://gitcode.com/gh_mirrors/se/Seal点击查看免费下载Seal 是一款面向 Android 的免费开源视频/音频下载应用以 yt-dlp阿塞拜疆语版 README与 README.md 内容同源为骨架结合app/src/main/java/com/junkfood/seal/下的真实源码实现系统讲解 Seal 的核心特性、底层调用链、下载参数细节与安装获取方式帮助你理解其yt-dlp 引擎 原生 Android 封装的整体架构。项目概览为 yt-dlp 打造的原生 Android 前端Seal 的定位十分明确它是 yt-dlp 的GUI 前端README 原文Seal is a simple GUI of yt-dlp, based on youtubedl-android本身并不实现站点解析逻辑而是把 yt-dlp 的解析与下载能力完整封装进 Android 应用。技术底座由三部分构成yt-dlp解析支持站点并执行下载的核心 CLI 工具youtubedl-android将 yt-dlp 二进制与 JNI 绑定移植到 Android 的库README 中列出的dvd亦为其配套项目原生 Kotlin Jetpack Compose应用本体 UI 与业务逻辑。这些依赖可以在 gradle/libs.versions.toml 中直接确认youtubedl-android-library、youtubedl-android-ffmpeg、youtubedl-android-aria2c版本 0.17.3以及 Room 2.6.1、Koin 4.0.0、MMKV 1.3.12、Coil、kotlinx-serialization 等配套组件settings.gradle.kts 则表明项目由app与colorMonet 动态取色库两个模块组成。应用启动时App.kt会在后台依次完成YoutubeDL.init、FFmpeg.init、Aria2c.init三个原生库的初始化并在首次启动时把内置 WebView 的 Cookie 导出为 yt-dlp 可读的 Netscape 格式文件——这为后面讲解的登录态下载铺平了道路。核心特性总览README 开列的功能清单是本文的主体骨架现将其逐项映射到源码实现便于后续深入README 特性对应源码模块底层机制从 yt-dlp 支持的平台下载视频/音频DownloadUtil.ktYoutubeDLRequest 组装 yt-dlp 参数并执行为提取的音频嵌入元数据与封面addOptionsForAudioDownloads-x--embed-metadata/--embed-thumbnail依赖 mutagen 能力一键下载播放列表全部视频getPlaylistOrVideoInfo--flat-playlist/--playlist-items使用内置 aria2c 作为外部下载器enableAria2c--downloader libaria2c.so为下载的视频嵌入字幕addOptionsForVideoDownloads--write-subs/--embed-subs用模板执行自定义 yt-dlp 命令CommandTemplate.kt--config-locations注入模板文件应用内管理下载与自定义模板DownloaderV2.kt任务状态机 Room 持久化Material Design 3 动态配色 UITheme.kt 等DynamicColors Monet 调色板MAD纯 Kotlin、单 Activity、无 FragmentMainActivity.ktCompose 可组合目的地路由下面逐一展开。下载引擎多平台视频/音频抓取DownloadUtilDownloadUtil.kt是整个下载能力的核心门面。它把所有 yt-dlp 参数封装为 Kotlin 对象再通过YoutubeDL.getInstance().execute(...)提交给原生进程执行。信息获取阶段当用户粘贴链接后应用先调用fetchVideoInfoFromUrlDownloadUtil.kt#L140-L187拉取视频元数据其组装的关键参数包括-o %(title).200B以标题作为临时输出名BASENAME常量截断 200 字符--dump-single-json以 JSON 形式输出单视频完整信息--no-playlist默认只解析当前视频-R 1与--socket-timeout 5限制重试次数并设置网络超时可选的-x音频提取、-S格式排序、--restrict-filenames限制文件名字符集等取决于用户偏好若目标在播放列表内且指定了索引则改用--playlist-items index配合--dump-json。返回的 JSON 被反序列化为 VideoInfo.kt 中定义的VideoInfo含 title、duration、formats、thumbnail、subtitles、chapters、vcodec/acodec 等数十个字段Format数据类还提供isAudioOnly()、containsVideo()等判定方法供 UI 层区分纯音频格式与视频格式。实际下载阶段downloadVideoDownloadUtil.kt#L660-L825依据VideoInfo.vcodec none判断走音频链路还是视频链路并追加一整套参数--no-mtime不恢复文件时间戳、--restrict-filenames、--proxy、-4强制 IPv4、-r rateK限速、-P指定输出目录与临时目录、-o自定义输出模板等。下载完成后还会通过MediaScannerConnection.scanFile通知系统媒体库并把记录写入下载历史数据库。音频提取与元数据/封面嵌入README 明确列出将元数据和视频缩略图嵌入到 mutagen 支持的提取音频文件中。这在源码中的落地是addOptionsForAudioDownloadsDownloadUtil.kt#L559-L626核心参数为-x仅提取音频--audio-format mp3|m4a需要时转换容器格式--embed-metadata与--embed-thumbnail把标题、艺术家、封面嵌入音频底层依赖 mutagen 对音频标签的写入能力--convert-thumbnails jpg统一封面编码--parse-metadata系列把%(release_year,upload_date)s映射为meta_date、播放列表场景下把%(album,playlist,title)s映射为meta_album、%(track_number,playlist_index)d映射为meta_track从而在批量下载时也能写全专辑/曲目信息可选的封面裁剪通过写入--ppa ffmpeg: -c:v mjpeg -vf crop...配置裁剪正方形封面CROP_ARTWORK_COMMAND。音频的输出命名同样支持模板例如按章节拆分时使用chapter:%(title)/%(section_number)d - %(section_title).200B%(ext)s或按 Clip 区间命名为%(title).200B [%(section_start)d-%(section_end)d]%(ext)s见 DownloadUtil.kt#L62-L81。播放列表一键批量下载对播放列表链接getPlaylistOrVideoInfoDownloadUtil.kt#L87-L126以--flat-playlist模式快速枚举条目并解析 JSON 判断返回PlaylistResult还是单视频VideoInfo。进入下载时若downloadPlaylist开启则通过--playlist-items index精确指定当前要下载的条目配合subdirectoryPlaylistTitle选项输出路径会追加%(playlist)s/前缀实现按播放列表标题分子目录存放PLAYLIST_TITLE_SUBDIRECTORY_PREFIX。aria2c 外部下载器README 提到将内置 aria2c 作为所有下载的外部下载器。源码中enableAria2cDownloadUtil.kt#L433-L434只需一行核心参数this.addOption(--downloader, libaria2c.so)即以libaria2c.so作为 yt-dlp 的外部下载器进程。当未启用 aria2c 且设置了concurrentFragments 1时会退化为 yt-dlp 内置的--concurrent-fragments N默认并发片段数为 8见 PreferenceUtil.kt。字幕下载、转换与嵌入字幕处理是下载偏好中的一组独立开关downloadSubtitle、embedSubtitle、autoSubtitle等对应参数组合为--write-subs下载手动字幕--write-auto-subs下载自动生成字幕可加--extractor-args youtube:skiptranslated_subs跳过翻译字幕--sub-langs lang限定语言默认值为en.*,.*-orig--embed-subs把字幕嵌入视频文件保留原始字幕文件则叠加--write-subs--convert-subs ass|srt|vtt|lrc按需转换字幕格式对应CONVERT_ASS/LRC/SRT/VTT常量当下载字幕 嵌入字幕或用户显式开启时会追加--remux-video mkv与--merge-output-format mkvmergeToMkv逻辑因为 MKV 容器对字幕嵌入兼容性最好。自定义 yt-dlp 命令模板这是 README 中用模板执行自定义 yt-dlp 命令的实现。模板在数据库中是一张简单的表CommandTemplate.ktEntity Serializable data class CommandTemplate( PrimaryKey(autoGenerate true) val id: Int, val name: String, val template: String, )即每个模板 名称 一段 yt-dlp 参数文本。首次运行时若模板表为空应用会自动写入一个示例模板--no-mtime -S extTEMPLATE_EXAMPLE见 PreferenceUtil.kt#L181。执行模板时executeCustomCommandTaskDownloadUtil.kt#L876-L914应用会把模板内容写入临时配置文件然后通过--config-locations 文件路径注入 yt-dlp并自动拼接--newline逐行输出便于进度解析、--downloader libaria2c.so、--download-archive归档去重、--restrict-filenames与 Cookie 参数。用户可将 URL 按换行/空格分隔批量执行命令同样走任务队列并展示进度通知。应用内下载任务管理状态机与前台服务README 承诺应用内管理下载与自定义命令模板。新一代下载管理由DownloaderV2ImplDownloaderV2.kt实现其核心是一个任务状态机Task.kt#L58-L119Idle→FetchingInfo→ReadyWithInfo→Running→Completed任何阶段可被用户打断为Canceled出错进入Error二者都保留actionFetchInfo / Download以便一键重启。调度器doYourWorkDownloaderV2.kt#L219-L236维护MAX_CONCURRENCY 3的并发上限按状态优先级排序取出下一个任务ReadyWithInfo直接进入下载Idle则先抓取信息CustomCommand类型任务则跳过信息抓取直接执行。配套机制还包括前台服务保活任务开始/结束通过snapshotFlow驱动App.startService()/App.stopService()DownloaderV2.kt#L101-L121前台通知由 DownloadService.kt 承载崩溃恢复任务列表以 JSON 序列化备份到 MMKVTASK_LIST键应用重启时enqueueFromBackup会把中断中的任务重置为Canceled状态等待用户手动重启取消机制cancelImpl通过YoutubeDL.destroyProcessById(taskId)直接销毁对应原生进程再取消协程 Job。Material Design 3 与 MAD 架构README 最后两项特性强调 UI 采用Material Design 3 风格 动态颜色主题架构遵循MADModern Android Development纯 Kotlin 编写 UI 与逻辑单 Activity、无 Fragment、仅可组合目的地。MainActivity.kt 是唯一的 ActivityonCreate中直接setContent { ... AppEntry(...) }并通过onNewIntent处理外部分享/打开链接ACTION_VIEW/ACTION_SEND自动弹出下载对话框主题模块theme/提供SealTheme与深浅色、高对比度适配动态取色通过DynamicColors.applyToActivitiesIfAvailableApp.kt#L84与独立的color模块Monet 实现完成支持 TonalSpot、Spritz、FruitSalad、Vibrant、Monochrome 五种调色板风格paletteStyles见 PreferenceUtil.kt#L188-L201。下图为应用的核心主界面即输入链接、解析视频信息并发起下载的入口下载前参数配置弹窗则负责格式选择、字幕开关与播放列表选项安装与获取方式README 的下载章节给出两条渠道并强调对大多数设备推荐安装 arm64-v8a 版本的 APKGitHub Releases获取最新稳定版也可以安装预发布pre-release版本帮助项目测试新功能与变更F-Droid同步提供稳定版发布。从仓库结构看应用支持多种 ABI 构建App.kt#L217 的崩溃报告中会输出Supported ABIsarm64-v8a 对应绝大多数现代安卓手机。需要说明本文所引用的安装渠道为 README 原文所述事实具体下载请以对应平台页面为准。参与贡献、翻译与社区README 对社区参与有明确约定贡献欢迎可通过 Hosted Weblate 平台参与 Seal 的多语言翻译仓库translations/目录下已包含阿塞拜疆语、简体中文、繁体中文、阿拉伯语、俄语等 20 余种语言的 README 译本app/src/main/res/values-*下更有完整的 UI 字符串翻译提交前指引提交 Bug 报告、功能请求或改进建议前应先阅读 CONTRIBUTING.md 了解规范与指引社区渠道项目维护有 Telegram 频道与 Matrix 空间用于讨论、公告与发布通知。许可证与商标条款项目采用GPLv3许可证LICENSEREADME 额外给出了一条重要的商标式限制条款除按 GPLv3 许可证授权的源码之外禁止任何其他方以 Seal 的名义使用其作为下载器应用该限制同样适用于 Seal 的衍生项目衍生项目包括但不限于 fork 与非官方构建。这意味着第三方可以依据 GPLv3 修改和分发源码但不能使用 Seal 的名称来包装发布下载器应用。致谢与依赖底座README 的 Credits 章节披露了项目的技术渊源Seal 基于youtubedl-android构建 yt-dlp 的 GUI部分 UI 设计与代码借鉴自Read You与Music You两个开源项目并使用了dvd、Material color utilities与Monet等组件color模块即 Monet 的仓库内实现。这些依赖共同构成了 Seal 下载引擎移植 现代 Android UI 的双层结构也解释了为何它能在保持 yt-dlp 全部能力的同时提供流畅的 Material 3 原生体验。小结通过 README 与源码的对照可以看到Seal 的价值在于把 yt-dlp 的庞大参数体系收敛成一套直观的 Android 图形界面信息抓取、格式选择、音频提取、播放列表、字幕、aria2c 加速、自定义命令模板与任务恢复机制全部围绕DownloadUtil与DownloaderV2两个核心模块组织。对于希望研究如何把 CLI 下载工具封装为现代 Android 应用的开发者DownloadUtil.kt 与 DownloaderV2.kt 是两份值得精读的参考实现。赞分享移动开发音视频【免费下载链接】Seal Video/Audio Downloader for Android, based on yt-dlp项目地址https://gitcode.com/gh_mirrors/se/Seal点击查看免费下载相关推荐Seal 深度解析Android 上的 yt-dlp 视频音频下载器实战指南Seal 深度解析Android 上的 yt dlp 视频音频下载器实战指南 导读Seal 是一款基于 yt dlp 的 Android 视频/音频下载器移动开发音视频Seal音视频下载器5大核心功能深度解析与实战指南Seal音视频下载器5大核心功能深度解析与实战指南 Seal是一款基于yt dlp的Android音视频下载器它为用户提供了简单高效的音视频下载解决方案。无移动开发音视频PowerInfer 仓库中的 llama.cpp 预编译安装指南Winget、Homebrew、MacPorts 与 Nix 全平台实践PowerInfer 仓库中的 llama.cpp 预编译安装指南Winget、Homebrew、MacPorts 与 Nix 全平台实践 本文以仓库内 sm人工智能大模型推理引擎本地部署上一篇终极指南如何用QKeyMapper实现Windows键鼠手柄专业映射下一篇WaveTools终极指南一键解锁《鸣潮》120FPS高帧率体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考