随着越来越多的视频网站不再提供下载选项,想来不少人应该都有下载在线视频的需求,这里我想推荐一款开源免费但功能强大的视频下载工具——youtube-dl。少数派此前介绍了 IINA 这款播放器,IINA 的在线视频功能就是通过 youtube-dl 实现的。youtube-dl 虽然名字带有 Youtube,但实际上可以支持许多视频网站,Vimeo、Tumblr 乃至优酷、腾讯视频或是哔哩哔哩上面的视频都可以通过它下载。youtube-dl 同时提供了丰富的选项,可以选择下载的画质、格式或者下载字幕等等。但作为一款命令行软件,没有 GUI 可能让不少人对其望而却步或是无从入手,希望这篇文章能够帮助大家熟悉并上手这款软件。

这篇文章将会介绍如何安装 youtube-dl、如何实现最基本的视频下载、如何进行文件下载位置等一系列设置以及如何通过 Automator 简化下载过程。

如何安装 youtube-dl

在安装 youtube-dl 之前,我想先介绍一下 OS X 下的一款著名包管理应用 —— Homebrew。它就类似命令行软件的 App Store,通过这款软件可以很方便地实现命令行软件的安装、管理与更新。 Homebrew 的安装也很方便,只需要打开终端,将下面的命令复制进去并回车,就可以等待 Homebrew 自行安装完毕了。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装 Homebrew 后,我们即可进行 youtube-dl 的安装了,仍然只需要将下面的命令复制进终端,youtube-dl 就会自动安装完毕。

brew install youtube-dl

安装好 youtube-dl 后,我们就可以进行在线视频的下载了,不过有部分视频网站比如 Youtube,高画质的视频和音频是分开的,只使用 youtube-dl 的话会将视频和音频分别下载成两个文件。好在 youtube-dl 也提供了解决方案,我们只需要下载另一个命令行工具 —— ffmpeg 即可,在下载后 youtube-dl 会自动调用 ffmpeg 将视频与音频合成一个文件。ffmpeg 的安装仍然通过 Homebrew 进行,只需要执行下面这个命令即可:

brew install ffmpeg

到此为止,youtube-dl 的安装过程已经完全结束,只需要这样短短三步,不过在开始下载之前,我想首先介绍一下如何对 youtube-dl 进行更新。因为部分视频网站会不定时进行调整,避免被下载视频,因此有时我们需要更新 youtube-dl 以便继续进行视频下载。更新 youtube-dl 我想介绍两种方法,一种是单独更新 youtube-dl,另一种是直接更新 Homebrew 管理的所有软件。单独更新 youtube-dl 的命令如下:

brew upgrade youtube-dl

而假如不指定 youtube-dl,即可更新 Homebrew 管理的所有软件了,命令如下:

brew upgrade

如何下载在线视频

通过 youtube-dl 下载视频的过程也如安装一样简单,首先我们复制下来视频的网址,然后在前面加上 youtube-dl输入终端即可等待下载完成,需要注意的是,视频地址前需要插入一个空格。下载过程中 youtube-dl 会显示下载进度和速度,下载和合并视频文件完成后只需要回车确认就可以完成整个过程了。youtube-dl 会自动下载最高画质的视频,默认的下载文件格式是 mp4,而下载地址是我们开启终端的位置,假如打开终端后我们没有进行其他操作,那么这个位置就是我们用户的主文件夹。另外,对于 Youtube 一类的网站,因为高清视频和音频是分开的,所以 youtube-dl 会调用 ffmpeg 合并两个文件,这个过程默认的输出文件是 mkv 格式。

上面这样说可能不够直观,那么接下来我们通过一个例子来看一遍下载的过程。首先复制下来视频地址,然后在前面加上 youtube-dl输入终端,接下来我们就会看到 youtube-dl 显示出了下载进度。

复制视频地址
复制视频地址

将命令输入终端
将命令输入终端

显示下载进度
显示下载进度

当下载和合并视频完成后会等待回车确认,这个地方确实有一点不够人性化,因为没有任何直观的提示,再次回车后就会显示下载完成了,同时我们可以在用户的主文件夹内找到下载的视频。

等待回车确认
等待回车确认

下载完成
下载完成
在主文件夹内可以找到视频文件
在主文件夹内可以找到视频文件

只需要这样简单地复制地址并加几个字母输入终端,再回车两下就可以完成视频的下载了。不过 youtube-dl 的功能并不仅限于此,它还可以用于下载多个视频或者下载整个视频列表。下载多个文件只需要在第一个视频地址后面插入空格,然后加上第二个视频的地址即可。

将多个视频地址输入终端
将多个视频地址输入终端

下载完成后的多个视频文件
下载完成后的多个视频文件

更多的视频也可以一样的下载,只要继续在后面加上地址就就可以了。

下载整个视频列表则只需要将视频列表的地址加上 youtube-dl输入终端即可。

复制视频列表地址
复制视频列表地址

输入视频列表地址
输入视频列表地址
视频列表下载完成
视频列表下载完成
在主文件夹内找到视频列表
在主文件夹内找到视频列表

如何调整下载路径和文件名

虽然不进行设置就进行下载已经满足了我们的基本需求,但还是有两个地方不尽如人意:一点是下载目录并不是我们熟悉的下载文件夹,而是用户的主文件夹;另一点则是下载的视频自带一串奇怪的字母和数字。这串字符其实是 Youtube 上面的视频 ID,但我们保存的时候未必希望留下这个 ID,这就需要我们进行一定的设置。对于下载路径和文件名的设置有两种方式:一种是每次下载的时候添加说明设置的一串字符,这样可以设置单独的一次下载;另一种则是对于 youtube-dl 进行整体设置。因为两种方法其实是相通的,所以我们从单独一次下载的设置开始说明。

Youtube-dl 进行输出文件设置的关键词是 -o,这个关键词后面单括号括起的字符串会被理解为对应的设置,我们先看一个十分实用的例子:

youtube-dl -o '~/Downloads/%(title)s.%(ext)s' https://www.youtube.com/watch?v=kBdfcR-8hEY

这里我们可以将这个字符串分成两部分理解,前半部分 ~/Downloads/ 是下载路径的设置,这个例子将下载路径设置为了下载文件夹,如果要下载到其他文件夹,只需要将这里替换成其他地址就可以了,当然假如不需要调整下载位置也可以省略这部分;后半部分 %(title)s.%(ext)s 则是指定了文件名的格式,%(title)s 是视频的标题,%(ext)s 则是视频的文件扩展名,因此这个设置就是将文件名设置为 视频名.扩展名,这样就不会出现视频 ID 的那串奇怪字符了。

Youtube-dl 提供了大量的可选项用于设置文件名,包括视频 ID、URL、标题、时长甚至观看数量、点赞数量等等,这些都可以在文档中找到,通过修改 -o 后面的设置字符串即可实现。

接下来我们再看一个稍微复杂的例子,这个例子介绍了下载一个用户全部播放列表时的设置:

youtube-dl -o '%(uploader)s/%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s' https://www.youtube.com/user/TheLinuxFoundation/playlists

这个例子中 %(uploader)s 是上传者或者频道的名字,%(playlist)s 是视频列表名,%(playlist_index)s 则是视频在视频列表中的编号,因此这个例子下载后会在主文件夹下出现 TheLinuxFoundation 文件夹,里面每个视频列表会保存成一个文件夹,视频则是 编号-文件名.扩展名 的格式。

虽然上面的设置方法功能足够强大,可是像我一样的人可能会希望默认的下载路径不在主文件夹而在下载文件夹内,以免每次都要设置,这种情况我们就需要对 youtube-dl 的设置文件进行修改,在 OS X 下,设置文件的地址是 /etc/youtube-dl.conf。不过如果不进行进一步修改,通过 Finder 是没办法直接进入 etc 文件夹的,但我们可以通过 Go to Folder 实现。

Go to Folder
Go to Folder

在 Go to Folder 中输入 /etc 即可进入设置的文件位置了,

输入文件夹位置
输入文件夹位置

Youtube-dl 的设置文件名是 youtube-dl.conf,如果我们是第一次对 youtube-dl 进行设置,那么只需要新建一个设置文件就好了,这里可选的方法很多,稍有编程基础的朋友想必都有自己习惯的文本编辑器,不会编程也不要紧,我在这里介绍一种不需要额外软件的方法,只使用了系统自带的命令行文本编辑器 —— nano,唯一的要求是当前使用的是管理员账户。首先在终端中输入下面的命令,

sudo nano /etc/youtube-dl.conf

回车后会要求输入当前用户的密码,输入的过程中不会有我们习惯的星号显示,只需要全部输入后回车即可。

等待输入管理员密码
等待输入管理员密码

接下来我们就进入了 nano 编辑器,界面是这样的,

nano 编辑器界面
nano 编辑器界面

因为这个编辑器是基于命令行的,不支持光标选择位置等我们习以为常的输入操作,所以推荐直接将写好的设置复制进来。

将设置输入编辑器
将设置输入编辑器

这里输入的设置是 -o ~/Downloads/%(title)s.%(ext)s,效果是将默认下载地址设置为下载文件夹,并设置默认文件名为视频标题。写好设置后,我们按下 Ctrl+X 快捷键退出 nano 编辑器,会询问是否保存修改,我们在英文输入法下按 y 即可确认。

nano 保存确认
nano 保存确认

接下来我们需要确认一遍文件名和地址,因为在进入编辑器时我们就写好了文件位置,因此这里我们只需要直接回车,就可以保存好设置文件了。

nano 文件名确认
nano 文件名确认

这样修改设置文件后,youtube-dl 的默认下载路径就变成了下载文件夹,也不会再出现奇怪的 ID 字符串了。如果希望设置成其他地址或文件名,只需要调整设置文件的内容即可。

如何调整下载视频的画质和文件类型

Youtube-dl 设置画质和文件类型的关键词是 -f,另一个关键词 -F 则可以显示全部可选的画质和文件类型。接下来我们仍然通过例子来认识设置的方法。

youtube-dl -F https://www.youtube.com/watch?v=kBdfcR-8hEY

通过这个命令,我们可以查看这个视频地址提供的所有的画质和文件类型。

视频文件类型和分辨率列表
视频文件类型和分辨率列表

第一列是设置的编号,等下我们可以通过编号选择画质和文件类型,第二列是文件类型,我们可以看到有 webm、mp4、3gp 等格式,第三列则是分辨率或者 audio only(只有音频),最后一列是一些其他的视频属性,需要注意的是部分视频标明了 video only(只有视频),这是因为 Youtube 等网站的视频与音频是分开的,之前也已经提过这点,没有标明的则是音频视频都有。

youtube-dl -f 22 https://www.youtube.com/watch?v=kBdfcR-8hEY

接下来我们通过这样的方式就可以选择画质和文件类型了,这个例子中选择了 22 号,也就是 1280x720 的 mp4 文件 。

通过上面的方法我们可以实现画质、文件类型的选择,但过程略微繁琐了些,好在 youtube-dl 也提供了更方便更智能的方式。

youtube-dl -f 'best[height<=480][ext=mp4]' https://www.youtube.com/watch?v=kBdfcR-8hEY&

这个例子中设置的字符串是 best[height<=480][ext=mp4],效果也非常直观,就是下载高度小于等于 480 像素的最佳画质 mp4 视频文件。youtube-dl 提供了非常多的可选属性,比如文件大小(filesize)、宽度(width)、高度( height)和扩展名(ext)等,只需要将条件的表达式用中括号括起来即可,多个条件并列排放即可,不需要分割符。

另外,对于 Youtube 一类需要合并视频与音频的网站,默认的合并格式是 mkv,这个格式同样是可以修改的,关键词是 --merge-output-format,后面跟着希望保存的格式即可,下面是一个实例,将合并后的格式设置为了 mp4 格式:

youtube-dl --merge-output-format mp4 https://www.youtube.com/watch?v=kBdfcR-8hEY

如何下载字幕

下载字幕的方法类似前面的两个设置,关键词是 --write-sub,加上这个关键词后即可下载字幕,默认的字幕格式是 vtt。

如果希望下载其他类型,例如 srt 格式的文件,只需要附加一个关键词 --sub-format 然后接上希望的字幕文件类型就可以了,下面是一个实例:

youtube-dl --write-sub --sub-format srt https://www.youtube.com/watch?v=kBdfcR-8hEY

如果希望下载的视频有多种语言的字幕,那么我们可以通过 --list-subs 关键词查看全部可选字幕,然后通过 --sub-lang 选择字幕的语言。下面我们仍然通过同样的例子认识如何选择下载的字幕。

youtube-dl --list-subs https://www.youtube.com/watch?v=kBdfcR-8hEY

可选字幕列表
可选字幕列表

上面的全语种字幕是 Youtube 自动生成的字幕,一般我们不做考虑,下面则是实际的字幕语言,这里只有英文,我们通过下面的命令即可下载该语言的字幕:

youtube-dl --write-sub --sub-lang en https://www.youtube.com/watch?v=kBdfcR-8hEY

如果希望下载多个语种的字幕也不在话下,只要多种语言中间使用逗号隔开就好,类似下面的例子。

youtube-dl --write-sub --sub-lang en,fi https://www.youtube.com/watch?v=kBdfcR-8hEY

如何同时进行多种设置

前面几节中介绍了如何对下载的视频进行调整,但有的时候我们可能不止需要设置一个方面,这种情况在命令行下也很容易处理,只要在 youtube-dl 与视频 URL 之间并列加入各种设置就好,排列的顺序不会产生任何影响。这里我们同样举一个例子,假如我们想要下载文件小于 20M 的 mp4 文件,下载路径是下载文件夹,文件名是视频标题-点赞数.扩展名(虽然我也不知道点赞数有什么用),还希望同时下载字幕,那么我们只需要这样的一条命令即可:

youtube-dl -o '~/Downloads/%(title)s-%(like_count)s.%(ext)s' -f 'best[filesize<=20M][ext=mp4]' --write-sub https://www.youtube.com/watch?v=kBdfcR-8hEY

类似默认下载路径一样,我们同样可以将多种设置一并加入设置文件,让 youtube-dl 的默认设置更符合个人习惯。多种方面的设置用空格或者换行分隔都可以。以下是我个人的设置,可以作为参考:

-o ~/Downloads/%(title)s.%(ext)s
-f mp4
--merge-output-format mp4
--write-sub --sub-format srt

使用 Automator 简化下载过程

虽然 youtube-dl 的下载已经比较方便了,但仍然需要复制 URL 然后打开终端才能使用。为了简化下载的过程,我们可以使用 Automator 建立一个服务。

新建 Automator 服务
新建 Automator 服务

新建服务后,然后将输入设为接受 Safari 中的 URL,将工具-运行 Shell 脚本拖到工作区,输入设为作为自变量,然后键入下面的命令:

/usr/local/bin/youtube-dl -o '~/Downloads/%(title)s.%(ext)s' -f mp4 "$@"

这个命令会将视频以 mp4 格式下载到下载文件夹中,文件名就是视频的标题。

建立 Automator 服务
建立 Automator 服务

保存后即可使用。

保存下载视频服务
保存下载视频服务

在 Safari 中,选中地址栏内的 URL 后,即可通过建立的服务下载视频了。

使用下载视频服务
使用下载视频服务

通过 Automator 建立这样一个服务后,不再需要打开终端输入命令,只需要点击鼠标即可下载视频,但也有两个缺点:其一是没有直观的进度显示,在下载较大视频或者网络状况不好时,等待的时间可能会有些煎熬;其二则是对于下载进行设置不是很方便,需要通过 Automator 更改命令才能实现。

结语

Youtube-dl 是一款十分强大又完全免费的视频下载工具,既可以实现简单的下载视频,也完全可以胜任各种复杂的需求,相信通过上面的介绍也可以管中窥豹,更多的功能可以在 youtube-dl 的 Github 主页 youtube-dl · GitHub 找到。希望这篇文章能够帮助对命令行完全没有一点了解的朋友熟悉 youtube-dl 这款工具,也能够帮助还没有详细了解的朋友发现更多的功能。