使用Python pytube下载YouTube视频如何获取MP4最高分辨率文件
问题原因
原代码调用video.streams.first()时,pytube默认返回的媒体流列表按码率从低到高排序,第一个结果就是最低码率的3gpp格式低清流,没有做格式、分辨率筛选,所以下载到的文件画质极差。
可直接使用的调整方案
方案1:下载单文件最高清MP4(无需额外依赖)
这个方案筛选音视频预先合并的MP4流,下载完成直接可播放,最高支持720P分辨率,满足普通观看需求。
from pytube import Playlist p = Playlist('https://www.youtube.com/watch?v=cSKGa_7XJkg&list=PLoGtT1rYE-El8eTpyXUzeFHbRUDUJN1Ag') print(f'Downloading: {p.title}') for video in p.videos: # 筛选MP4格式、音视频合并的流,按分辨率降序取最高规格 target_stream = video.streams.filter( progressive=True, file_extension='mp4' ).order_by('resolution').desc().first() target_stream.download() print(f'下载完成: {video.title}')
关键参数说明:
progressive=True:仅筛选音视频封装在同一文件的流,无需后续合并操作file_extension='mp4':强制匹配MP4封装格式,过滤3gpp、webm等其他格式.order_by('resolution').desc().first():对筛选后的流按分辨率从高到低排序,取第一条即最高分辨率结果
方案2:下载平台可选最高分辨率(支持1080P/4K/8K)
YouTube平台1080P及以上分辨率的媒体采用音视频分离存储,没有预先合并的单文件,需要分别下载最高规格的视频轨、音频轨,再通过ffmpeg合并为完整MP4文件。
from pytube import Playlist import os import subprocess p = Playlist('https://www.youtube.com/watch?v=cSKGa_7XJkg&list=PLoGtT1rYE-El8eTpyXUzeFHbRUDUJN1Ag') print(f'Downloading: {p.title}') for video in p.videos: print(f'正在处理: {video.title}') # 下载最高分辨率MP4视频轨 video_track = video.streams.filter( file_extension='mp4', only_video=True ).order_by('resolution').desc().first() temp_video = video_track.download(filename='temp_video.mp4') # 下载最高码率MP4音频轨 audio_track = video.streams.filter( file_extension='mp4', only_audio=True ).order_by('abr').desc().first() temp_audio = audio_track.download(filename='temp_audio.mp4') # 调用ffmpeg无损合并音视频 output_file = f'{video.title}.mp4' merge_cmd = f'ffmpeg -i "{temp_video}" -i "{temp_audio}" -c:v copy -c:a aac "{output_file}" -y' subprocess.run(merge_cmd, shell=True, check=True) # 清理临时文件 os.remove(temp_video) os.remove(temp_audio) print(f'高清文件下载完成: {output_file}')
注意事项:
- 使用该方案需要提前安装ffmpeg并添加到系统环境变量,否则合并步骤会执行失败
- 合并过程采用直接复制流的方式,不会重新编码,没有画质损失,处理速度快
内容的提问来源于stack exchange,提问作者Sorder Mohammad Al- Amin
相关产品推荐
相关产品推荐

