如何用yt-dlp在Python/Discord.py中提取音频文件?
解决yt-dlp获取播放列表音频链接时返回故事板图片的问题
问题根源是yt-dlp返回的formats列表包含了故事板图片这类非音频资源,不像yt-dl默认优先返回音视频格式,直接取formats[0]会拿到非音频条目。可以通过以下两种方式解决:
1. 在YDL_OPTIONS中指定音频格式筛选
初始化YoutubeDL时添加format参数,让yt-dlp仅返回音频格式资源:
YDL_OPTIONS = { 'format': 'bestaudio/best', # 优先获取质量最优的音频 'noplaylist': False, # 允许解析播放列表 # 保留你原有的其他配置,比如quiet、no_warnings等 } with YoutubeDL(YDL_OPTIONS) as ydl: info = ydl.extract_info(link, download=False) if 'entries' in info: for i in info['entries']: # 此时formats列表内均为音频格式,直接取第一个即可 URL = {'source': i['formats'][0]['url'], 'title': i['title']}
如果需要指定特定音频格式(比如仅m4a),可将format设置为'm4a/bestaudio'。
2. 手动过滤formats列表中的音频条目
若不想修改全局配置,可在获取条目后手动筛选音频格式:
with YoutubeDL(YDL_OPTIONS) as ydl: info = ydl.extract_info(link, download=False) if 'entries' in info: for i in info['entries']: # 筛选音频格式:排除音频编码为none的条目 audio_formats = [f for f in i['formats'] if f.get('acodec') != 'none'] # 按比特率从高到低排序,优先选质量好的音频 audio_formats.sort(key=lambda x: x.get('abr', 0), reverse=True) if audio_formats: URL = {'source': audio_formats[0]['url'], 'title': i['title']}
内容的提问来源于stack exchange,提问作者Evgenii Rezuev
相关产品推荐
相关产品推荐

