求助:使用PytubeFix等多库下载YouTube视频时无法获取最高分辨率(仅能下载360p)
求助:使用PytubeFix等多库下载YouTube视频时无法获取最高分辨率(仅能下载360p)
最近我碰到一个特别闹心的问题:不管我怎么调整代码,选择「最高分辨率」下载YouTube视频时,最终得到的始终是640x360的360p画质,感觉就像是下载了YouTube主页上的预览视频一样。
我用的Pytubefix代码是这样的:
from pytubefix import YouTube video = "https://youtu.be/NI9LXzo0UY0?si=_Jy_CzN-QwI4SOkC" def Download(link): youtube_object = YouTube(link) youtube_object = youtube_object.streams.get_highest_resolution() try: youtube_object.download() except: print("An error has occurred") print("Download is completed successfully") Download(video)
我先后试了三个库:
- pytube(已经停更了)
- pytubefix
- yt_dlp
结果全都是下载360p的视频,但明明这个视频应该有1080p的最高画质啊,实在搞不懂哪里出问题了😭
问题原因&解决方案
其实核心原因是YouTube的音视频分离机制:1080p及以上的高清画质,YouTube会把视频流和音频流分开存储,而get_highest_resolution()这类方法默认只会下载「音视频复合流」——这类流为了兼容性,最高通常只有720p甚至360p。要拿到真正的高清,得单独下载视频和音频流再合并。
方案1:用Pytubefix手动下载并合并
需要额外安装ffmpeg来合并音视频(可以用pip install ffmpeg-python,或者系统级安装ffmpeg工具):
from pytubefix import YouTube from pytubefix.cli import on_progress import ffmpeg import os video_url = "https://youtu.be/NI9LXzo0UY0?si=_Jy_CzN-QwI4SOkC" def download_highest_quality(link): youtube_object = YouTube(link, on_progress_callback=on_progress) # 优先获取1080p纯视频流,没有的话取最高可用分辨率 video_stream = youtube_object.streams.filter(res="1080p", only_video=True).first() if not video_stream: print("1080p流不可用,自动切换到最高可用分辨率") video_stream = youtube_object.streams.filter(only_video=True).order_by('resolution').desc().first() # 获取最高质量的音频流 audio_stream = youtube_object.streams.filter(only_audio=True).first() try: # 分别下载临时文件 video_file = video_stream.download(filename_prefix="temp_video_") audio_file = audio_stream.download(filename_prefix="temp_audio_") # 用ffmpeg合并音视频 ffmpeg.concat(ffmpeg.input(video_file), ffmpeg.input(audio_file), v=1, a=1)\ .output("final_highres_video.mp4").run(overwrite_output=True) # 清理临时文件 os.remove(video_file) os.remove(audio_file) print("高清视频下载并合并完成啦!") except Exception as e: print(f"出错了:{str(e)}") download_highest_quality(video_url)
方案2:用yt_dlp一键搞定(推荐)
yt_dlp本身支持自动识别并合并音视频流,配置起来更简单:
import yt_dlp ydl_opts = { # 优先选最高清视频+最佳音频,自动合并;如果不行就选最好的复合流 'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best', 'outtmpl': 'my_highres_video.%(ext)s', } with yt_dlp.YoutubeDL(ydl_opts) as ydl: ydl.download(["https://youtu.be/NI9LXzo0UY0?si=_Jy_CzN-QwI4SOkC"])
额外提醒
- 先确保你的库是最新版本:
pip install --upgrade pytubefix yt-dlp,旧版本可能适配不了YouTube的最新API。 - 先在浏览器里确认目标视频确实能播放1080p,有些视频可能因为版权或地域限制,无法获取高清流。
备注:内容来源于stack exchange,提问作者slender 57
相关产品推荐
相关产品推荐

