10

多种方法下载Youtube视频

 3 years ago
source link: http://kevinnan.org.cn/index.php/archives/674/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

之前推荐过一个网站Youtube视频和字幕在线下载用来下载Youbute的视频。今天再介绍一个基于python的命令行工具youtube-dl和python第三方库pytube在本地下载Youtube视频。(Note:使用这两种方法需要你使用如v2ray或者clash这样的代理软件,而不是chrome插件,因为需要用到本地SOCK5和HTTP代理端口)。

2、youtube-dl

安装 youtube-dl

 pip install youtube-dl

在你使用的代理软件中查看SOCK5或者HTTP本地代理的端口,然后使用如下命令

  • socks5代理
youtube-dl --proxy socks5://127.0.0.1:10808 https://www.youtube.com/watch?v=6_gLU_OStK0
  • http代理
youtube-dl --proxy http://127.0.0.1:10809 https://www.youtube.com/watch?v=6_gLU_OStK0

youtube-dl也可以下载国内视频平台的内容,如bilibili等。

3、pytube

3.1 安装pytube

pip install pytube

3.2 基础API介绍

  • 初始化YouTube对象
# 导入pytube库
import pytube

# 设置代理 dict(自己更改)
proxy_handler = {
"http": " http://127.0.0.1:10809",
'https': ' http://127.0.0.1:10809'
}

# Youtube视频链接
url = 'https://www.youtube.com/watch?v=7Oqd9hjyHLw'
# 初始化YouTube下载控件
yt = pytube.YouTube(url, proxies=proxy_handler)
# 打印出视频支持下载的音频/视频格式,分辨率,视频编解码方式,音频码率,每条流对应的itag
for media_type in yt.streams.all():
	print(media_type)
    • 传统混合音频和视频的视频源,设置参数为progressive=True
    for media_type in yt.streams.filter(progressive=True):
    	print(media_type)
    
    <Stream: itag="18" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.42001E" acodec="mp4a.40.2" progressive="True" type="video">
    
    • DASH流的视频源,设置参数为adaptive=True
    <Stream: itag="137" mime_type="video/mp4" res="1080p" fps="30fps" vcodec="avc1.640028" progressive="False" type="video">
    <Stream: itag="248" mime_type="video/webm" res="1080p" fps="30fps" vcodec="vp9" progressive="False" type="video">
    <Stream: itag="399" mime_type="video/mp4" res="1080p" fps="30fps" vcodec="av01.0.08M.08" progressive="False" type="video">
    <Stream: itag="136" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.4d401f" progressive="False" type="video">
    <Stream: itag="247" mime_type="video/webm" res="720p" fps="30fps" vcodec="vp9" progressive="False" type="video">
    <Stream: itag="398" mime_type="video/mp4" res="720p" fps="30fps" vcodec="av01.0.05M.08" progressive="False" type="video">
    <Stream: itag="135" mime_type="video/mp4" res="480p" fps="30fps" vcodec="avc1.4d401f" progressive="False" type="video">
    <Stream: itag="244" mime_type="video/webm" res="480p" fps="30fps" vcodec="vp9" progressive="False" type="video">
    <Stream: itag="397" mime_type="video/mp4" res="480p" fps="30fps" vcodec="av01.0.04M.08" progressive="False" type="video">
    

从上面的结果可以看出对于大多数视频,渐进式下载(音频和视频在同一个文件中)格式仅在360p以下才可用。因此,我想分别下载音频和视频文件并将其合并(DASH流)。

  • 通过itag下载视频

通过get_by_itag方法下载对应视频,这是我认为最方便的方法,可以按照自己的需求下载对应的流。

video = yt.streams.get_by_itag(18)
video.download()
  • 使用ffmpeg-python混合音频和视频

安装ffmpeg-python

pip install ffmpeg-python

3.4 完整代码(可在此基础上修改)

# 导入pytube库
# pip install pytube
import pytube
# 导入ffmpeg-python
# pip install ffmpeg-python
import ffmpeg 
import os

# 设置代理 dict(自己更改)
proxy_handler = {
"http": " http://127.0.0.1:10809",
'https': ' http://127.0.0.1:10809'
}

# 打印出下载过程的进度条
def progress(stream, chunk, bytes_remaining):
    contentSize = video.filesize
    size = contentSize - bytes_remaining

    print('\r' + '[Download progress]:[%s%s]%.2f%%;' % (
    '█' * int(size*20/contentSize), ' '*(20-int(size*20/contentSize)), float(size/contentSize*100)), end='')

# 设置要下载YouTube视频的链接
url = 'https://www.youtube.com/watch?v=jb-i_ARlumQ'
# 初始化YouTube对象
yt = pytube.YouTube(url, on_progress_callback=progress, proxies=proxy_handler)

# 查看该TouTube支持的所有可下载的DASH流格式(视频分辨率,视频编解码方式,音频码率,每条流对应的itag)
for media_type in yt.streams.filter(adaptive=True):
	print(media_type)

# 根据上面打印出的itag选择自己需要的流的itag,构造Stream对象
# 视频流
video = yt.streams.get_by_itag(137)
# 音频流
audio = yt.streams.get_by_itag(140)
# 下载视频	
# download(output_path, filename)
# 注意你选择的时mp4格式还是webm格式(建议选择mp4)
video.download("./", "video_download")
audio.download("./", "audio_download")
video_stream = ffmpeg.input('video_download.mp4') 
audio_stream = ffmpeg.input('audio_download.mp4')
ffmpeg.output(audio_stream, video_stream, "out.mp4").run()

# 删除音频和视频
os.remove("video_download.mp4")
os.remove("audio_download.mp4")

4、参考资料

[1] youtube-dl 下载设置代理

[2] python的youtube-dl库一键下载全球各大影音网站音视频

[3] 如何在Pytube中合并音频和视频?

[4] youtube-dl使用介绍

[5] ping与tcping

Last modification:April 25th, 2021 at 11:44 pm

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK