Loading... ## 1、前言 之前推荐过一个网站[Youtube视频和字幕在线下载](https://www.findyoutube.net/)用来下载Youbute的视频。今天再介绍一个基于python的命令行工具`youtube-dl`和python第三方库`pytube`在本地下载Youtube视频。(Note:使用这两种方法需要你使用如`v2ray`或者`clash`这样的代理软件,而不是chrome插件,因为需要用到本地SOCK5和HTTP代理端口)。 ## 2、youtube-dl 安装 `youtube-dl` ```shell pip install youtube-dl ``` 在你使用的代理软件中查看SOCK5或者HTTP本地代理的端口,然后使用如下命令 - socks5代理 ```shell 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` ```shell pip install pytube ``` ### 3.2 基础API介绍 - 初始化`YouTube`对象 ```python # 导入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` ```python for media_type in yt.streams.filter(progressive=True): print(media_type) ``` ```shell <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` ```shell <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`方法下载对应视频,这是我认为最方便的方法,可以按照自己的需求下载对应的流。 ```python video = yt.streams.get_by_itag(18) video.download() ``` - 使用`ffmpeg-python`混合音频和视频 安装`ffmpeg-python` ```shell pip install ffmpeg-python ``` ### 3.4 完整代码(可在此基础上修改) ```python # 导入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 下载设置代理](https://gist.github.com/ryanlid/72b50bd89e7980e5373f6aff634d7932) [2] [python的youtube-dl库一键下载全球各大影音网站音视频](https://blog.csdn.net/weixin_42355607/article/details/113488602) [3] [如何在Pytube中合并音频和视频?](https://cn.ec-europe.org/375664-how-to-combine-audio-and-YQQGWC) [4] [youtube-dl使用介绍](https://www.jianshu.com/p/6bae57859325) [5] [ping与tcping](https://www.v2ex.com/t/720525) Last modification:April 25th, 2021 at 11:44 pm © 允许规范转载