You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pytube开发YouTube下载器:获取分辨率去重问题求助

解决Pytube获取MP4视频分辨率列表重复的问题

问题重现

使用Pytube获取YouTube视频MP4格式的分辨率时,返回的列表存在大量重复项,代码及运行结果如下:

from pytube import YouTube

link = "https://www.youtube.com/watch?v=LXb3EKWsInQ"
yt = YouTube(link)
resolutions = []
video_resolutions = []
video_res = []
for stream in yt.streams.filter(subtype="mp4").order_by("resolution"):
    video_resolutions.append(stream.resolution)
print(video_resolutions)

运行结果:

['144p', '144p', '144p', '240p', '240p', '240p', '360p', '360p', '360p', '360p', '480p', '480p', '480p', '720p', '720p', '720p', '720p', '1080p', '1080p', '1080p', '1440p', '1440p', '2160p', '2160p']

原因分析

重复的核心原因是:同一分辨率下存在多个不同属性的视频流——这些流可能在编码格式(如H.264/H.265)、帧率、是否包含音频等属性上有差异,但分辨率数值相同。

解决方案

方法1:遍历过程中去重(保留原排序)

遍历流时只添加未出现过的分辨率,维持原有排序逻辑:

from pytube import YouTube

link = "https://www.youtube.com/watch?v=LXb3EKWsInQ"
yt = YouTube(link)
video_resolutions = []
for stream in yt.streams.filter(subtype="mp4").order_by("resolution"):
    res = stream.resolution
    if res not in video_resolutions:
        video_resolutions.append(res)
print(video_resolutions)

输出结果:

['144p', '240p', '360p', '480p', '720p', '1080p', '1440p', '2160p']

方法2:集合去重后按数值排序

利用集合自动去重的特性,再按分辨率的数值大小重新排序:

from pytube import YouTube

link = "https://www.youtube.com/watch?v=LXb3EKWsInQ"
yt = YouTube(link)
video_resolutions = []
for stream in yt.streams.filter(subtype="mp4"):
    res = stream.resolution
    if res:  # 过滤无分辨率属性的异常流
        video_resolutions.append(res)
# 去重并按分辨率数值排序
unique_resolutions = sorted(list(set(video_resolutions)), key=lambda x: int(x[:-1]))
print(unique_resolutions)

输出结果:

['144p', '240p', '360p', '480p', '720p', '1080p', '1440p', '2160p']

方法3:筛选特定类型流(按需选择)

如果只需要带音频的MP4流或纯视频流,可以通过过滤参数缩小范围,同时减少重复项:

from pytube import YouTube

link = "https://www.youtube.com/watch?v=LXb3EKWsInQ"
yt = YouTube(link)
video_resolutions = []
# 获取同时包含音视频的MP4流
for stream in yt.streams.filter(subtype="mp4", only_audio=False, only_video=False).order_by("resolution"):
    res = stream.resolution
    if res not in video_resolutions:
        video_resolutions.append(res)
print(video_resolutions)

内容的提问来源于stack exchange,提问作者PDX PRO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:45:22