Yt-dlp 入门笔记 & 不简明教程

Published: 2024-08-14

Tags: Software

本文总阅读量

本来计划整理一个常用命令手册,但整理后感觉比较啰嗦,也是笔记、也是不简明教程。

安装 Yt-dlp

依赖确认

确认系统已正确安装 FFmpeg,FFprobe 会随 FFmpeg 一起安装,无需特别留意

$ ffmpeg -version
ffmpeg version 7.0 Copyright (c) 2000-2024 the FFmpeg developers
built with Apple clang version 15.0.0 (clang-1500.1.0.2.5)

官方安装说明:https://github.com/yt-dlp/yt-dlp/wiki/Installation,以下列出个人常用系统的安装升级命令

MacOS 系统

$ brew install yt-dlp

# 更新
$ brew upgrade yt-dlp

Ubuntu 系统

$ sudo add-apt-repository ppa:tomtomtom/yt-dlp
$ sudo apt update
$ sudo apt install yt-dlp

# 更新
$ sudo apt update
$ sudo apt install yt-dlp

安装后查询 yt-dlp 版本

$ yt-dlp --version
2024.08.01

默认下载命令

不指定任何参数时,默认的格式参数为 -f "bv*+ba/b",意为下载最佳视频音频组合,后文会解释它的含义

$ yt-dlp https://www.youtube.com/watch?v=60ItHLz5WEA

备注:后续使用 替代 https://www.youtube.com/watch?v=60ItHLz5WEA 以降低油管域名浓度

通过截图中 yt-dlp 输出的信息,我们得知:

它分别下载了视频流文件和音频流文件,最终合并为 Alan Walker - Faded [60ItHLZ5WEA] webm 视频文件

616 Alan Walker - Faded [60ItHLz5WEA]. f616.mp4 视频文件(Video Only) 251 Alan Walker - Faded [60ItHLz5WEAT. f251.webm 音频文件

这里值得留意的是 616 和 251,它们是资源 ID,稍后会查看这个视频下的所有资源

查看可供下载的资源列表

$ yt-dlp --list-formats <video_url>

截图中展示了这个视频可获取的全部资源 —— 不同的封装格式、分辨率、编码、码率等

这里选取 720P 分辨率的视频资源进行说明

简要来说第一列为资源ID、第二列是容器后缀、第三列是画面分辨率

第六列的 “345K”、“808K” 是视频的码率,通常越大代表视频质量更好,由此可见 609 是 720P 视频中质量最好的

第七列的 MPEG-DASH(https + mp4_dash)和 m3u8 是不同的流媒体协议,除此之外,还有 HLS 也是同类技术,此处无需过多关心,相同编码的资源,无论通过什么协议下载,内容是一样,这里展示的传输方式

第八列的 av01.0.05M.08avc1.4D401Fvp09.00.40.08 描述了编码格式,分别对应 AV1、H.264、VP9(AV1 最新、VP9 是 Google 的开放标准,更适合4K等资源编码、H.264 使用最为广泛)

这里要分区下编码格式和容器封装格式:前者 AV1、H.264、VP9 是编码格式,而我们下载到的视频 MP4、MKV、WEBM、AVI 是容器封装技术,容器封装技术将视频流、音频流、字幕等 “打包” 到一个文件中,此处介绍的详细是为了更好区分概念,另外实际使用 yt-dlp 时一般不指定具体资源,会有更易用的命令可供使用

第十列的 “video only” 说明这个资源只包含视频画面,不包含声音,可以查看完整截图的 18 号资源,它是 av1 + mp4a 编码的 360p MP4 视频,同时包含音视频

了解了以上信息,我们可以手动指定下载 398 AV1 编码 720P 分辨率的视频和 140 MP4A 编码的音频作为测试

# mp4
$ yt-dlp -f "398+140" <video_url>

下载的后的文件为 mp4 格式,这是 yt-dlp 自动判断的,如果指定 247 的 VP9 编码,则下载合并后是 mkv 格式,同时也把音频换为 251 的 opus 编码,则会自动合并为 webp 格式,yt-dlp 会选择适宜的容器封装技术来存储视频、音频流

# mkv
$ yt-dlp -f "247+140" <video_url>

# webm
$ yt-dlp -f "247+251" <video_url>

如需强制封装为 mp4 视频格式,可使用 --merge-output-format 参数

# mp4
$ yt-dlp -f "247+251" --merge-output-format mp4 <video_url>

常用命令整理

下载 MP4 格式最佳质量视频

优先下载 MP4,如果没有,则下载最佳画质的其它格式

# 使用默认的 -f 参数
$ yt-dlp -S "ext" <video_url>

# 或者
$ yt-dlp -f "bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4] / bv*+ba/b" <video_url>

不关心最终格式,获取「最佳视频流」和「最佳音频流」,合并为一个视频

$ yt-dlp -f "bv+ba/b" <video_url>

下载指定分辨率的视频(720P、1080P、4K)

# 720P
$ yt-dlp -f "bv[height=720][ext=mp4]+ba[ext=m4a]/b" <video_url>

# 1080P
$ yt-dlp -f "bv[height=1080][ext=mp4]+ba[ext=m4a]/b" <video_url>

# 4K
$ yt-dlp -f "bv[height=2060][ext=mp4]+ba[ext=m4a]/b" <video_url>

下载 MP3 格式的音频

$ yt-dlp --extract-audio --embed-thumbnail --audio-format mp3 <video_url>

yt-dlp --extract-audio --audio-format mp3 <video_url>

"--extract-audio" 参数从资源中解析出音频流

"--embed-thumbnail" 设置文件封面缩略图

"--audio-format" 保存的音频格式,可选值为 best (default), aac, alac, flac, m4a, mp3, opus, vorbis, wav

补充:这里的 --audio-format 参数,如果你指定了 mp3、flac、opus, 最终的文件也会是对应名称的后缀文件、如果指定了 aac,最终保存的文件是 .m4a 文件,指定了 vorbis 则文件后缀为 .ogg,跟视频同理,yt-dlp 会根据你选择的音频编码选择适合的容器进行存储

下载 Playlist 视频列表

$ yt-dlp --download-archive archive.txt https://www.youtube.com/playlist?list=PLSk-fsG1YwI9Zu4e8MJBKM2TRjWcXqCDw

"--download-archive archive.txt" 已下载的文件ID会存储在这个文件,即自动跳过已下载文件

更多的 -f 参数说明,参考 yt-dlp 官方文档:format-selection-examples

格式参数的补充说明

参数 -f "bv*+ba/b" 更详细的介绍

使用 yt-dlp 不设置 -f 时,其默认值是 "bv*+ba/b" ,这个命令的全称是 "bestvideo*+bestaudio/best"

bv*+ba/b 获取「最佳视频流」和「最佳音频流」,合并为最终视频,相比于 "bv+ba/b",前者不仅限于 Video Only,只要是 Video 就可以,不局限于单一的 “最佳”,在某些情况下会选择一个更合适的流,特别是在不同的编码或容器格式中

“+” 加号代表单一视频和单一音频下载后合并为一个音视频文件,斜线 “/” 表示 “或”,当前方条件不满足时使用后面的条件进行匹配

best 表示获取包含音频流的最佳视频,如果仅指定 -f b,那么如果仅有一个 360P 的同时包含视频和音频的视频资源,也会被下载,虽然它跟通常意义上的 “高清” 不沾边儿,通常作为一个 “保底” 的可选参数

参数 -f "bv+ba" --merge-output-format mp4 和 -f "bv[ext=mp4]+ba[ext=m4a]" 的选择与使用

初看感觉这两个命令差不多 —— 都能下载 MP4 格式的视频,但还是有一些本质区别

前者的意思是分别获取「最佳视频流」和「最佳音频流」合并为 MP4 格式的视频,后者是在选择资源的的时候就从 MP4 视频流及 M4A 音频流中下载其中的最佳画质,最终合并的也是天然的 MP4 视频格式

所以你需要下载 MP4 格式的视频,推荐后者,可以确保更好的兼容性,同时获得最佳画质。

一般容器和编码有一些适宜的固定搭配,前者在你确认下载的视频流、音频流(指定资源ID)适合使用 MP4 容器封装时使用,或是不关心最终文件类型时候使用 -f "bv+ba" 但不指定 --merge-output-format mp4 来获得当前视频的全局最佳质量时使用(可能获取到 webm 格式的视频),两个参数不推荐组合在一起使用,可能将 VP9 编码的视频流放到 MP4 容器中,就不是一个常规的组合,虽然使用一些播放器可以正常播放,但整体来看兼容性不佳。

使用 Cookie 下载视频

我最开始碰见需要设置 Cookie 的场景是下载 Bilibili 视频时,不登录下载到的视频画质低(是的,除了 Youtube,yt-dlp 也支持包括 Bilibili 在内的很多网站)

其中一个可行的方式是导出 Cookie,Firefox Cookies Text 插件:https://addons.mozilla.org/en-US/firefox/addon/cookies-txt/

yt-dlp --cookies cookies.txt https://www.bilibili.com/video/BV1H44y1w7AX

同样的,下载 Y2b 视频时也是这个命令,需要使用 Cookie 的场景是在服务器 Linux 系统下载,不设置 Cookie 下载几个视频后,Y2b 对下载请求进行了屏蔽

另一种使用 Cookie 的方式是借助于本机浏览器的缓存,查询资料的过程中有人提及到 Cookie 不是共享的,使用时需关闭浏览器,我没有进一步测试。

使用 Socket5 设置代理

最后,不得不提的 --proxy 参数使用如下,预祝网络畅通,心舒畅 🌈

yt-dlp --proxy socks5://127.0.0.1:10808

了解至此,对于 yt-dlp 的简单实用场景,就基本能应付的来,更多的参数信息参考 --help 命令或 Document

参考