使用you-get 和 youtube-dl下载YouTube视频列表

摘要: 本文记录怎样使用you-get或youtube-dl工具下载整个youtube播放列表的内容。末尾顺便添加了一个Windows下的批处理命令用来批量转换视频到mp3.

2020年8月更新: 最近发现you-get好像无法下载youtube列表了,所以又重新试了一下youtube-dl,这个目前好用。它和you-get非常相像。youtube-dl而且支持跳过已经下载完的视频来避免重复下载,因此更推荐用这个。

首先声明我反对下载YouTube上的版权视频来二次传播牟利。我记录这些工具的目的纯粹是为了自己使用方便。YouTube上有很多有意思的视频,保存到本地就可以随时收看而不需要网络支持,也不用担心被删掉而找不到了,还有很多故事听听就足够了,完全没有必要开视频。我顺便搜了下相关版权知识,YouTube上的视频版权归上传者,YouTube只是提供一个展示上传者版权作品的服务,YouTube公司并不拥有任何版权。

使用you-get

you-get 是个不错的工具,https://github.com/soimort/you-get。它还有个网站https://you-get.org/, 从安装到使用都写的很详细。我搬了一些内容过来。

实时更新到最新版本:

pip3 install --upgrade you-get

下载一个视频,直接 you-get url即可:

可以先加参数 -i 来看看可以得到哪些格式的文件,默认是最高分辨率的:

加上itag参数就可以选择不同格式下载:

对于youtube播放列表的URL,进入视频作者主页后点击播放列表会列出所有视频列表,然后每个列表下都有个“查看完整详细列表”的链接,这个链接就是该链表的URL。也可以点开其中一个视频后再手动修改获得播放离别表的url。比如一个播放列表的某个视频在电脑浏览器里显示的地址是https://www.youtube.com/watch?v=-GOC7QTSYV4&list=PL5hbpwc66yGGyhrMvMWYgBB-3GiVh6YEk

手动将watch参数改为playlist,再加list参数就可以,即改成https://www.youtube.com/playlist?list=PL5hbpwc66yGGyhrMvMWYgBB-3GiVh6YEk

然后就可以用上面的命令下载了

you-get https://www.youtube.com/playlist?list=PL5hbpwc66yGGyhrMvMWYgBB-3GiVh6YEk

安装youtube-dl和ffmpeg

Youtube更新了视频格式后,很多高清晰度格式都是音频视频文件分离的,需要使用ffmpeg自动和并起来,所以除了安装youtube-dl,还要安装ffmpeg。

Windows:

一般使用pip安装youtube-dl,实时更新到最新版本:

pip3 install --upgrade youtube-dl

ffmpeg不需要安装,只要下载后把ffmpeg.exe所在路径添加到系统path后就可以了。

Linux下可以搜索相关信息进行安装,本文后面记录RHEL8/Centos8下安装二者的具体步骤。

使用youtube-dl

默认下载方式

默认下载方式命令很简单,就是加个url参数即可。 这个url可以指向单个视频文件,也可以是列表, 它会自动选择分辨率最高的格式。这里我以https://www.youtube.com/watch?v=9o6mAYxm5CQ 这个视频为例,网页打开后发现它最高支持4K分辨率2160P, 运行下载后发现它自动选择了最高分辨率的格式(代码313和251)进行下载并自动合成,文件大小为324MB, 格式为webm。

youtube-dl https://www.youtube.com/watch?v=9o6mAYxm5CQ
# 运行后显示

[youtube] 9o6mAYxm5CQ: Downloading webpage
[download] Destination: How beautiful is Chengdu【民乐版成都】和我在成都的街头走一走,聆听城市的声音,感受大运的活力丨民乐也疯狂丨成都赵雷丨古筝琵琶二胡笛子-9o6mAYxm5CQ.f313.webm
[download] 100% of 324.89MiB 
[download] Destination: How beautiful is Chengdu【民乐版成都】和我在成都的街头走一走,聆听城市的声音,感受大运的活力丨民乐也疯狂丨成都赵雷丨古筝琵琶二胡笛子-9o6mAYxm5CQ.f251.webm
[download] 100% of 3.94MiB 
[ffmpeg] Merging formats into "How beautiful is Chengdu【民乐版成都】和我在成都的街头走一走,聆听城市的声音,感受大运的 活力丨民乐也疯狂丨成都赵雷丨古筝琵琶二胡笛子-9o6mAYxm5CQ.webm"
Deleting original file How beautiful is Chengdu【民乐版成都】和我在成都的街头走一走,聆听城市的声音,感受大运的活力丨民 乐也疯狂丨成都赵雷丨古筝琵琶二胡笛子-9o6mAYxm5CQ.f313.webm (pass -k to keep)
Deleting original file How beautiful is Chengdu【民乐版成都】和我在成都的街头走一走,聆听城市的声音,感受大运的活力丨民 乐也疯狂丨成都赵雷丨古筝琵琶二胡笛子-9o6mAYxm5CQ.f251.webm (pass -k to keep)

加参数 -o dir/filename 来指定输出文件路径或输出文件名, 这里我指定下载完的文件名是newname.mp4, 可以发现它仍然是下载了313和251这个两个格式并合成,生成的新文件仍然是webm格式而newname.mp4被整个嵌入到新文件名里了,也就是说这个命令会忽略用户输入的文件名格式。

youtube-dl https://www.youtube.com/watch?v=9o6mAYxm5CQ -o newname.mp4
[youtube] 9o6mAYxm5CQ: Downloading webpage
[download] Destination: newname.mp4.f313
[download] 100% of 324.89MiB in 00:18
[download] Destination: newname.mp4.f251
[download] 100% of 3.94MiB in 00:00
[ffmpeg] Merging formats into "newname.mp4.webm"
Deleting original file newname.mp4.f313 (pass -k to keep)
Deleting original file newname.mp4.f251 (pass -k to keep)

下载多个文件

上述命令里直接用空格分开多个url即可,也可以把所有url放入一个文件,每行1个,然后加载:

youtube-dl url1 url2 url3
youtube-dl -a url.txt

查看所有格式以及选择格式下载

查看支持的视频格式和文件大小 :

youtube-dl -F <url>

可以看到一些支持的视频和音频格式,记住它们对应的数字代码如140, 137等,后续会用到:

youtube-dl -F https://www.youtube.com/watch?v=9o6mAYxm5CQ

# 输出如下
[youtube] 9o6mAYxm5CQ: Downloading webpage
[info] Available formats for 9o6mAYxm5CQ:
format code  extension  resolution note
249          webm       audio only tiny   65k , opus @ 50k (48000Hz), 1.56MiB
250          webm       audio only tiny   85k , opus @ 70k (48000Hz), 2.06MiB
140          m4a        audio only tiny  130k , m4a_dash container, mp4a.40.2@128k (44100Hz), 3.44MiB
251          webm       audio only tiny  161k , opus @160k (48000Hz), 3.94MiB
278          webm       256x144    144p  115k , webm container, vp9, 25fps, video only, 2.59MiB
160          mp4        256x144    144p  130k , avc1.4d400c, 25fps, video only, 2.72MiB
242          webm       426x240    240p  265k , vp9, 25fps, video only, 5.20MiB
133          mp4        426x240    240p  288k , avc1.4d4015, 25fps, video only, 6.32MiB
243          webm       640x360    360p  458k , vp9, 25fps, video only, 9.40MiB
134          mp4        640x360    360p  627k , avc1.4d401e, 25fps, video only, 13.04MiB
244          webm       854x480    480p  862k , vp9, 25fps, video only, 16.78MiB
135          mp4        854x480    480p 1222k , avc1.4d401e, 25fps, video only, 26.00MiB
247          webm       1280x720   720p 1725k , vp9, 25fps, video only, 32.89MiB
136          mp4        1280x720   720p 2433k , avc1.64001f, 25fps, video only, 51.05MiB
248          webm       1920x1080  1080p 2882k , vp9, 25fps, video only, 56.22MiB
137          mp4        1920x1080  1080p 5015k , avc1.640028, 25fps, video only, 105.07MiB
271          webm       2560x1440  1440p 8773k , vp9, 25fps, video only, 172.03MiB
313          webm       3840x2160  2160p 16747k , vp9, 25fps, video only, 324.89MiB
18           mp4        640x360    360p  490k , avc1.42001E, 25fps, mp4a.40.2@ 96k (44100Hz), 13.03MiB
22           mp4        1280x720   720p 2048k , avc1.64001F, 25fps, mp4a.40.2@192k (44100Hz) (best)

注意上面有些视频格式提示video only,它们就是没有声音的,这种视频文件下载后还需要再单独下载音频文件然后合成。这也就解释了最开始默认下载方式里为什么要下载313(3840x2160, video only)和251(audio only)然后再合成的表现了。

youtube-dl命令支持指定格式下载,加上 -f format_code 参数即可:

youtube-dl -f format_code url

这个格式参数format_code定义很灵活,如下所示:

  • 单个数字,比如313, 那么就下载它对应的webm文件,没有声音;140 只下载音频。
  • 数字组合,用+连接表示合成, 如313+251。youtube-dl会下载对应视频和音频并调用ffmpeg进行合成,合成后删除原文件。
  • 多个选项尝试匹配, 选项间用斜线/分割, 如下面的例子列出了4个组合:137+140/136+140/bestvideo+bestaudio/best, youtube-dl会挨着尝试,当存在该组合对应文件格式时,则按此组合格式进行下载。有些播放列表里的视频文件格式并不统一,比如有的支持137格式的视频,有的只支持136格式,此时上面的参数组合就可以避免因为找不到137格式而报错停止下载。

只下载音频

可以采用上面的格式命令,指定一个音频格式,比如 -f 140,或者-f 251。也可以采用命令参数 -x:

youtube-dl -x https://www.youtube.com/watch?v=9o6mAYxm5CQ

[youtube] 9o6mAYxm5CQ: Downloading webpage
[download] Destination: How beautiful is Chengdu【民乐版成都】和我在成都的街头走一走,聆听城市的声音,感受大运的活力丨民乐也疯狂丨成都赵雷丨古筝琵琶二胡笛子-9o6mAYxm5CQ.webm
[download] 100% of 3.94MiB in 00:00
[ffmpeg] Destination: How beautiful is Chengdu【民乐版成都】和我在成都的街头走一走,聆听城市的声音,感受大运的活力丨民乐也疯狂丨成都赵雷丨古筝琵琶二胡笛子-9o6mAYxm5CQ.opus
Deleting original file How beautiful is Chengdu【民乐版成都】和我在成都的街头走一走,聆听城市的声音,感受大运的活力丨民 乐也疯狂丨成都赵雷丨古筝琵琶二胡笛子-9o6mAYxm5CQ.webm (pass -k to keep)

它默认下载了251对应的OPS格式音频,保存为了.ops文件。如果需要mp3 格式,则需要借助ffmpeg 进行转换:

youtube-dl -x --audio-format mp3 https://www.youtube.com/watch?v=9o6mAYxm5CQ
# 输出
[youtube] 9o6mAYxm5CQ: Downloading webpage
[download] Destination: How beautiful is Chengdu【民乐版成都】和我在成都的街头走一走,聆听城市的声音,感受大运的活力丨民乐也疯狂丨成都赵雷丨古筝琵琶二胡笛子-9o6mAYxm5CQ.webm
[download] 100% of 3.94MiB in 00:00
[ffmpeg] Destination: How beautiful is Chengdu【民乐版成都】和我在成都的街头走一走,聆听城市的声音,感受大运的活力丨民乐也疯狂丨成都赵雷丨古筝琵琶二胡笛子-9o6mAYxm5CQ.mp3
Deleting original file How beautiful is Chengdu【民乐版成都】和我在成都的街头走一走,聆听城市的声音,感受大运的活力丨民 乐也疯狂丨成都赵雷丨古筝琵琶二胡笛子-9o6mAYxm5CQ.webm (pass -k to keep)

下载字幕

--write-sub                      Write subtitle file
--write-auto-sub                 Write automatic subtitle file (YouTube only)
--all-subs                       Download all the available subtitles of the video
--list-subs                      List all available subtitles for the video
--sub-format FORMAT              Subtitle format, accepts formats preference, for example: "srt" or "ass/srt/best"
--sub-lang LANGS                 Languages of the subtitles to download (optional) separated by commas, use IETF language tags like 'en,pt', 需要配合--write-sub使用

有些video的字幕是youtube自动生成的,有些是上传者手动添加的,这里以美食作家王刚的一个视频为例:https://www.youtube.com/watch?v=pffIsZ1hBvM

# --all-subs 下载所有语言的字幕
youtube-dl -f 134+140 --all-subs https://www.youtube.com/watch?v=pffIsZ1hBvM

[youtube] pffIsZ1hBvM: Downloading webpage
[info] Writing video subtitles to: 大红灯笼挂起红红火火,对联贴上新年新气象,王刚祝大家新春快乐!(请打开cc字幕看字幕)-pffIsZ1hBvM.zh-Hans.vtt
[info] Writing video subtitles to: 大红灯笼挂起红红火火,对联贴上新年新气象,王刚祝大家新春快乐!(请打开cc字幕看字幕)-pffIsZ1hBvM.zh-Hant.vtt
[info] Writing video subtitles to: 大红灯笼挂起红红火火,对联贴上新年新气象,王刚祝大家新春快乐!(请打开cc字幕看字幕)-pffIsZ1hBvM.en.vtt
# 可以看到它同时下载了3个不同语言的字幕文件, 格式都是vtt
...

# 查看所有字幕信息(未下载)
youtube-dl --list-subs https://www.youtube.com/watch?v=pffIsZ1hBvM

[youtube] pffIsZ1hBvM: Downloading webpage
[youtube] pffIsZ1hBvM: Looking for automatic captions
WARNING: Couldn't find automatic captions for pffIsZ1hBvM
pffIsZ1hBvM has no automatic captions
# 这是说没有youtube自动生成的字幕,所以--write-auto-sub 这个参数就不适用于这个url了。

Available subtitles for pffIsZ1hBvM:

# 列出了3种语言和它们支持的字幕文件格式
Language formats
zh-Hans  vtt, ttml, srv3, srv2, srv1
zh-Hant  vtt, ttml, srv3, srv2, srv1
en       vtt, ttml, srv3, srv2, srv1

# 只下载字幕,不下载音视频文件 --skip-download

# 只下载某种语言的字幕,加--sub-lang zh-Hans来下载中文字幕
youtube-dl --write-sub --sub-lang zh-Hans --skip-download  https://www.youtube.com/watch?v=pffIsZ1hBvM

[youtube] pffIsZ1hBvM: Downloading webpage
[info] Writing video subtitles to: 大红灯笼挂起红红火火,对联贴上新年新气象,王刚祝大家新春快乐!(请打开cc字幕看字幕)-pffIsZ1hBvM.zh-Hans.vtt

youtube-dl 添加多线程下载

一般来说上面的方法就够用了,可实际使用中发现下载速度很慢,搜索发现可以使用aria2下载加速器。具体做法就是先下载aria2下载器,windows版本是zip文件,解压后不需要安装,只需要把该文件夹路径添加到系统path里就可以了。然后执行如下命令:

youtube-dl -f 137+140 youtube-list-url --external-downloader aria2c --external-downloader-args "-x 8 -s 8 -k 1M"

然后就发现下载速度有了明显提高。

避免重复下载已下载视频

有些youtube的播放列表是不断更新的,因此我们希望可以使用同一个youtube-dl 下载命令来不断更新,同时跳过已经下载完的视频。为此,可以使用如下参数

--download-archive archive.txt

# 可以使用如下命令来定期更新追踪下载新的视频
youtube-dl --download-archive archive.txt https://www.youtube.com/playlist?list=PLxx --external-downloader aria2c --external-downloader-args "-x 8 -s 8 -k 1M"

使用ffmpeg批量转换视频到mp3文件

Windows下可以使用如下批处理命令来将一个视频文件夹下所有文件转换成mp3。Windows里可以写一个.bat文件,内容如下:

for %%a in ("*.*") do ffmpeg -i "%%a" -codec:a libmp3lame -qscale:a 2 "mp3\%%~na.mp3"
pause

注意上面是从一个.bat文件里获得,所以各种宏变量都是用两个%,即%%a,而如果是直接在cmd.exe里运行,则需要删掉1个%, 上述命令就变成了

for %a in ("*.*") do ffmpeg -i "%a" -codec:a libmp3lame -qscale:a 2 "mp3\%~na.mp3"

微软的命令就是这么麻烦,到处是坑。%%~na的意思是不保留扩展名。上面命令里的*.* 还可以具体成只操作某个格式的,比如*.mp4就是对所有.mp4类型文件进行操作。

RHEL8/Centos8 使用Youtube-dl

安装youtube-dl:

 sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl

sudo chmod a+rx /usr/local/bin/youtube-dl

# youtube-dl默认调用python命令,而RHEL8/Centos8默认只有Python3, 所以手动创建一个符号连接来支持命令python, 否则运行时会报错“"/usr/bin/env: ‘python’: No such file or directory"”:

sudo ln -s /usr/bin/python3 /usr/local/bin/python

# 更新youtube-dl
sudo youtube-dl -U

安装ffmpeg以支持视频和音频合成, 参考这个网页

# 安装所需的2个Repo
sudo dnf localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm

sudo dnf install --nogpgcheck https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-8.noarch.rpm

# 安装ffmpeg
sudo dnf install ffmpeg ffmpeg-devel

# 安装完毕后验证版本
rpm -qi ffmpeg
ffmpeg -version