摘要: 本文记录怎样使用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