使用 Python 下载 YouTube 高分辨率视频(包含音频)

很多人喜欢把一些油管(YouTube)视频下载到本地存储,这样最大的好处就在于可以在没有网络的情况下依然可以观看它们。

尽管网络上有很多 YouTube 下载工具,但是它们通常不太稳定。而且,对于 720P 以上高分辨率的油管视频,就算下载成功通常它们也是没有声音的(无音频)。另外,一些视频由于受到年龄等因素的限制,您也无法成功完成下载

本文就来教您如何下载带有音频(声音)的高分辨率 YouTube 视频,并且突破受限制的视频。

根据小编经验,不借助第三方平台 API,有两种工具可以帮助您从 YouTube 成功下载视频:

  1. youtube-dl
    这是一个命令行实用工具,最大的优点在于您可以从任何编程语言中调用它。
  2. pytube
    这是一个 Python 库,功能强大。

本文我们选择使用 pytube 库,不但因为它使用起来非常简单,而且支持组合使用额外的库来自适应下载油管4K(2160P) 高分辨率视频!我们还可以为这些无声高分辨率视频加上音频。

下载 YouTube 高分辨率视频,主要依赖于 DASH(基于HTTP的动态自适应流),这是一种 自适应码率(ABR) 技术,可实现从传统 HTTP Web 服务器通过互联网传输高质量流媒体内容。这种技术最大的优点在于能够根据使用者网络带宽状况动态切换高质量及低质量视频码率。诸如 Netflix、Hulu 和 YouTube 均依靠 MPEG-DASH 来实现此目标从而提升用户体验。

下面我们开始吧!

安装 pytube

首先,您需要安装 pytube 库。pytube-12.0.0 仍然包含有 Bug,修复程序尚未合并到主分支中。然而,笔者已经解决了这些问题,现在您可以使用经过我完善后的 pytube。

请在终端执行以下命令:

!pip install git+https://github.com/JNYH/pytube

如果出现问题,请使用 pytube-11.0.1 版本:

!pip install git+https://github.com/baxterisme/pytube

更多详细信息,请参阅 pytube GitHub 及其使用文档

主要功能代码

请注意, 如果您使用 Jupyter Notebook,在安装成功 pytube 后请重启内核。

以下代码非常简单,在引入 pytube 库后,您想要下载的 YouTube 视频链接地址将通过参数形式直接传递给 YouTube() 方法进行处理。

import pytube

# Youtube video URL
link = "https://youtu.be/7aKpeAu-IoM"
yt = pytube.YouTube(link)

print("Title:", yt.title)
print("Author:", yt.author)
print("Published date:", yt.publish_date.strftime("%Y-%m-%d"))
print("Number of views:", yt.views)
print("Length of video:", yt.length, "seconds")

yt.streams.get_highest_resolution().download()
print("Video successfullly downloaded from", link)

以上代码将为您下载对应 YouTube 视频的 mp4 格式。执行结果如下:

请注意,由于 YouTube 本身的限制,默认情况下,只有分辨率在 720p 及以下视频才包含音频

事实上,YouTube 媒体流包含高分辨率视频,但不包含音频。正如本文开头所提,因为这些视频使用了 DASH 协议,所以它们仅包含单独的视频流或音频流。您可以使用以下代码打印该视频相关所有可用的流媒体:

for e in yt.streams:
    print(e)

以上代码执行结果如下:

下载 MP3 音频

如果您只想下载该视频中包含的 MP3 音频文件,以下代码可以帮到您:

# Download audio only
yt.streams.filter(abr="160kbps",progressive=False).first().download(filename="audio.mp3")

音、视频合成

想要获得包含音频的高分辨率油管视频其实很简单。上文中我们已经能够打印和查看视频支持的分辨率以及对应音频,那么我们可以单独下载高分辨率视频(1080P及以上)以及该视频的音频文件,然后使用 ffmpeg 等工具将音、视频重新合成到同一个文件中即可。

使用 ffmpeg 合成音频及视频到同一个 MP4 文件的代码如下:

import ffmpeg

#download audio only
yt.streams.filter(abr="160kbps", progressive=False).first().download(filename="audio.mp3")
audio = ffmpeg.input("audio.mp3")

#download video only
yt.streams.filter(res="1080p", progressive=False).first().download(filename="video.mp4")
video = ffmpeg.input("video.mp4")

ffmpeg.output(audio, video, "finished_video.mp4").run(overwrite_output=True)

以上代码分别将两个已经下载到本地的名为 audio.mp3video.mp4 的同属于 YouTube 视频的纯音频文件以及无音频的高分辨率视频文件合成为一个名为 finished_video.mp4 的包含音频的高分辨率视频文件,并将其输出到当前工作目录中。

下载年龄限制视频及私人视频

如果您想下载年龄限制(满18周岁)视频以及私人视频,我们可以通过登陆账号的方式来进行。YouTube() 方法已支持该功能。我们只需要在前文的代码中包含账户登陆认证环节就可以了。

yt = pytube.YouTube(link, use_oauth=True, allow_oauth_cache=True)

use_oauthallow_oauth_cache 参数允许您授权 pytube 使用您的帐户与 YouTube 交互,用于绕过年龄限制以及访问私人视频。

如果 allow_oauth_cache 设置为 True,则您只需要首次对账户进行验证授权,之后pytube 将对其进行缓存无需再输入账户密码。否则,每次操作都会提示您输入账户密码进行验证。

之前,小编曾就如何开发及使用 Telegram 机器人下载 YouTube 视频问题写过一篇文章,有兴趣的朋友可以看过来:使用 Python 实现 Youtube 视频下载 Telegram 机器人

最后,小编友情提醒一下,YouTube 上的所有视频均受版权保护,请不要将它们用于商业目的。