youtube-dl下载太慢了,我选yt-dlp

1前言

最近过年嘛,过年前照例来下载一些贺岁歌曲,现在国内没啥人做贺岁专辑,这方面还得看马来西亚华人,他们每年都有出专辑,质量很不错!

国内平台自然是没有(或者不全的),需要在YouTube下载~

之前我都是用Chrome插件下载完再使用脚本合并视频,有点繁琐,今年试试自动下载的黑科技~

作为对比的这俩工具,都用 pip 安装即可

pip install youtube-dl
pip install yt-dlp

2youtube-dl

PS:youtube-dl 之前曾经被Github封禁了,后面应该是迫于开源界的压力,又恢复了这个仓库

首先这是项目地址: https://github.com/ytdl-org/youtube-dl

具体咋用,文档写得很详细

参数很复杂

最主要的问题是下载速度太慢了(一秒50、60k) (应该是被YouTube之类的网站识别出来,限流了)

下载合集中的多个视频

youtube-dl --proxy http://127.0.0.1:10809 -f "bestvideo[ext=mp4,height<=1080]+bestaudio[ext=m4a]/bestvideo[ext=mp4,height<=720]+bestaudio[ext=m4a]/bestvideo[ext=mp4,height<=480]+bestaudio[ext=m4a]/best[ext=mp4,height<=480]/best" -o "%(title)s.%(ext)s" --embed-thumbnail --playlist-start 1 --playlist-end 9 "https://www.youtube.com/watch?v=xxx&list=xxx"

参数说明

下面这俩组合起来表示下载合集里第1-9个视频

--playlist-start 1
--playlist-end 9

-f 后面跟着的一大串,表示从1080p开始下载,不行的话就逐步降级到480p

设置代理啥的就不说了

3yt-dlp

使用体验非常不错,推荐!

这是一个后面新出的工具,参数简化了很多,而且支持使用外部下载器(例如 Aria2)

先看看基本用到的命令长啥样~

下载单个视频

yt-dlp -f 137+140 --proxy http://127.0.0.1:10809 --merge-output-format mp4 https://www.youtube.com/watch?v=xxx

下载合集中的多个视频

yt-dlp -I 1:9 --proxy http://127.0.0.1:10809 --merge-output-format mp4 "https://www.youtube.com/watch?v=xxx&list=xxx"

选择格式使用的是下面这样的参数

-f 137+140

初看可能一头雾水,但其实这是YouTube的画质代码

在YouTube上面,1080p及以上分辨率的视频,画面和声音是分开的,画面一般是mp4或者webm这种格式,声音是m4a格式,所以要下载高清视频,需要分别下载画面和声音,然后自行合并。

PS:在之前我确实是分开下载然后写个脚本使用ffmpeg来批量合并的,不过用这个工具就不用这么复杂了,它可以自动调用ffmpeg来合并视频(不过要确保系统中已经安装了ffmpeg哈)。

上面这个 137 和 140 就是画面和声音的代码。

那这么知道各种画质和音质的代码是啥呢?使用 -F 参数就行。

yt-dlp -F --proxy http://127.0.0.1:10809 "https://www.youtube.com/watch?v=xxx"

用了这个参数,就可以把指定视频的各种画质代码都显示出来,按需选择组合就行

[youtube] Extracting URL: https://www.youtube.com/watch?v=kjuB12RFtDE
[youtube] kjuB12RFtDE: Downloading webpage
[youtube] kjuB12RFtDE: Downloading android player API JSON
[info] Available formats for kjuB12RFtDE:
ID  EXT   RESOLUTION FPS CH │   FILESIZE   TBR PROTO │ VCODEC          VBR ACODEC      ABR ASR MORE INFO
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────
sb2 mhtml 48x27        0    │                  mhtml │ images                                  storyboard
sb1 mhtml 80x45        1    │                  mhtml │ images                                  storyboard
sb0 mhtml 160x90       1    │                  mhtml │ images                                  storyboard
140 m4a   audio only      2 │    4.42MiB  129k https │ audio only          mp4a.40.2  129k 44k medium, m4a_dash
251 webm  audio only      2 │    4.66MiB  137k https │ audio only          opus       137k 48k medium, webm_dash
22  mp4   1280x720    25  2 │ ~ 44.82MiB 1284k https │ avc1.64001F   1284k mp4a.40.2    0k 44k 720p
136 mp4   1280x720    25    │   39.41MiB 1155k https │ avc1.4d401f   1155k video only          720p, mp4_dash
247 webm  1280x720    25    │   39.53MiB 1158k https │ vp9           1158k video only          720p, webm_dash
137 mp4   1920x1080   25    │  117.11MiB 3431k https │ avc1.640028   3431k video only          1080p, mp4_dash
248 webm  1920x1080   25    │   75.15MiB 2202k https │ vp9           2202k video only          1080p, webm_dash

从这结果就可以看出,上面的 137 是 1080p 的 mp4视频;140 是 129k 的音频。

至于外部下载器,我没搞,默认下载速度就很快了,一秒几m,够用就不折腾了。

4参考资料

  • 使用 yt-dlp 下载 youtube 视频的一点体会

技术群:添加小编微信并备注进群

小编微信:mm1552923   

公众号:dotNet编程大全    

### 如何使用 yt-dlp 下载 YouTube 视频 #### 准备工作 为了顺利运行 `yt-dlp`,需确认已安装 Python 版本不低于 3.7,并建议一并部署 FFmpeg 和 ffprobe 工具以便于后期处理视频文件[^2]。 #### 安装 yt-dlp 可以通过 pip 命令轻松安装最新版本的 `yt-dlp`: ```bash pip install yt-dlp ``` #### 编写下载脚本 下面提供了一个简单的 Python 脚本来展示如何利用 `yt-dlp` 来获取指定 URL 的 YouTube 视频。此代码片段定义了名为 `download_video()` 的函数,接受两个参数——目标链接 (`url`) 及保存路径模式 (`output_path`);默认情况下会依据最佳质量自动择音频流或视频流进行下载[^4]。 ```python import yt_dlp def download_video(url, output_path='%(title)s.%(ext)s'): ydl_opts = { 'format': 'bestvideo+bestaudio/best', 'outtmpl': output_path, } with yt_dlp.YoutubeDL(ydl_opts) as ydl: ydl.download([url]) # 使用示例 video_url = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ' download_video(video_url) ``` 上述例子中设置了 `'format': 'bestvideo+bestaudio/best'` 参数组合,旨在优先取最高画质与独立的最佳音轨相结合的方式完成下载任务,如果无法满足条件则退而求其次采用单一最优格式。 #### 实现带进度条的功能 对于希望实时跟踪下载状态的应用场景而言,在原有基础上稍作修改即可引入进度显示机制。通过向项字典内加入回调钩子 (progress_hooks),每当有新的进展发生时都会触发相应的事件处理器来刷新 UI 上的状态指示器[^3]。 ```python from tqdm import tqdm class MyProgressBar(tqdm): def update_to(self, b=1, bsize=1, tsize=None): if tsize is not None: self.total = tsize self.update(b * bsize - self.n) def my_hook(d): if d['status'] == 'downloading': filename = d.get('_filename') total_bytes = int(d.get('total_bytes_estimate')) downloaded_bytes = int(d.get('downloaded_bytes')) pbar = MyProgressBar(total=total_bytes, unit='B', unit_scale=True, desc=f'Downloading {filename}') pbar.update(downloaded_bytes) ydl_opts = { 'format': 'bestvideo+bestaudio/best', 'outtmpl': '%(title)s.%(ext)s', 'progress_hooks': [my_hook], } with yt_dlp.YoutubeDL(ydl_opts) as ydl: ydl.download(['https://www.youtube.com/watch?v=dQw4w9WgXcQ']) ``` 这段增强后的代码实现了更加友好的用户体验,允许用户直观地看到当前操作的具体情况和发展趋势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值