You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python YouTube音频下载脚本报错:AttributeError: 'NoneType' object has no attribute 'download'

解决YouTube音频下载脚本中的AttributeError问题

嘿,我来帮你搞定这个头疼的问题!你碰到的AttributeError: 'NoneType' object has no attribute 'download',核心原因很明确——你的代码里yt_streams最后变成了None,也就是按照你设置的筛选条件,根本没找到符合要求的音频流。

问题出在哪?

  • 你用了order_by('resolution')来排序音频流,但音频流根本没有resolution(分辨率)属性!这个排序逻辑完全不适用,会导致筛选后的结果混乱,最后找不到可用的流。
  • 你指定的extension="mp3"可能不是该视频的原生音频格式,YouTube的原生音频流大多是m4a格式,mp3通常是转码后的,不是所有视频都能直接找到mp3的流。
  • 加上adaptive=True的限制,可能会过滤掉一些非自适应的音频流,进一步缩小了可选范围。

修正后的代码

def __downloader(self, link, save_path="", save_name="", extension="mp3"):
    yt = YouTube(link)
    # 按音频比特率(abr)排序,这才是衡量音频质量的正确指标
    yt_streams = yt.streams.filter(only_audio=True, file_extension=extension).order_by('abr').desc().first()
    
    # 如果找不到指定格式的流, fallback到YouTube原生的m4a格式
    if not yt_streams:
        yt_streams = yt.streams.filter(only_audio=True, file_extension='m4a').order_by('abr').desc().first()
        # 自动调整文件名后缀(如果用户指定了mp3但只能下载m4a)
        if save_name and extension == "mp3":
            save_name = save_name.rsplit('.', 1)[0] + ".m4a"
    
    if yt_streams:
        yt_streams.download(output_path=save_path, filename=save_name)
    else:
        # 抛出明确错误,方便调试
        raise ValueError("无法找到该视频的可用音频流,请检查视频是否可下载或格式是否支持")
    return

关键修改说明

  • order_by('resolution')改成order_by('abr')abr是音频比特率,数值越高音质越好,这才是音频流正确的排序依据。
  • 增加了fallback逻辑:如果指定的格式(比如mp3)找不到,自动切换到原生的m4a格式,避免返回None
  • 增加了错误判断:如果最终还是找不到任何音频流,抛出明确的错误信息,帮你快速定位问题。

额外注意事项

  • 确保你的pytube库是最新版本:旧版本可能存在YouTube API兼容问题,执行pip install --upgrade pytube更新一下。
  • 如果一定要mp3格式:可以先下载m4a,再用ffmpeg转码。比如在脚本里调用subprocess执行转换命令:
    import subprocess
    # 下载完成后转换
    subprocess.run(["ffmpeg", "-i", "input.m4a", "output.mp3"])
    
  • 部分视频可能受版权限制无法下载:这时候即使代码正确,也会找不到流,需要确认视频的可下载权限。

内容的提问来源于stack exchange,提问作者giovanni caiazzo

火山引擎 最新活动