Python脚本下载YouTube播放列表转m4a:指定文件夹保存及报错解决
问题根源
input.mp4找不到:youtube-dl默认会用视频标题生成下载文件名,不是固定的input.mp4,硬写这个文件名自然找不到对应文件。- 文件无法存入指定目录:没有让youtube-dl直接下载到目标目录,后续移动操作也依赖错误的文件名。
修正后的代码方案
方案1:直接下载m4a到目标目录(无需ffmpeg转码)
你已经指定了bestaudio[ext=m4a],youtube-dl会直接下载m4a格式音频,不需要额外转码,步骤更简洁:
import os import subprocess # 替换为你的播放列表URL playlist_url = "PLAYLISTLINK" # 输出目录 output_dir = "/Users/USER/Documents/VideoBot/Output" # 确保输出目录存在,不存在则自动创建 os.makedirs(output_dir, exist_ok=True) # 直接下载m4a到指定目录,用视频标题作为文件名 subprocess.run([ "youtube-dl", "-f", "bestaudio[ext=m4a]", "--playlist-start", "1", "--playlist-end", "1", # 指定输出路径:将文件保存到output_dir,文件名格式为「视频标题.m4a」 "-o", os.path.join(output_dir, "%(title)s.%(ext)s"), playlist_url ])
方案2:保留ffmpeg转码(适用于特殊处理需求)
如果确实需要用ffmpeg处理音频,需指定固定临时文件名并使用完整路径:
import os import subprocess playlist_url = "PLAYLISTLINK" output_dir = "/Users/USER/Documents/VideoBot/Output" os.makedirs(output_dir, exist_ok=True) # 定义临时下载文件和最终输出文件的完整路径 temp_video = os.path.join(output_dir, "temp_video.mp4") final_audio = os.path.join(output_dir, "output.m4a") # 下载视频到指定临时路径 subprocess.run([ "youtube-dl", "-f", "bestvideo+bestaudio/best", "--playlist-start", "1", "--playlist-end", "1", "-o", temp_video, playlist_url ]) # 用ffmpeg提取音频,使用正确的文件路径 subprocess.run([ "ffmpeg", "-i", temp_video, "-vn", "-acodec", "copy", final_audio ]) # 可选:删除临时视频文件 os.remove(temp_video)
关键修正说明
- 确保目录存在:用
os.makedirs(output_dir, exist_ok=True)避免因目录不存在导致的保存/移动失败。 - 指定下载路径:通过youtube-dl的
-o参数直接控制文件保存位置和命名规则,彻底解决找不到文件的问题。 - 避免硬编码文件名:要么用youtube-dl内置变量(如
%(title)s)生成动态文件名,要么指定固定路径的临时文件,杜绝路径错误。
注:youtube-dl已停止维护,推荐使用yt-dlp(youtube-dl的活跃分支),只需将命令中的youtube-dl替换为yt-dlp即可兼容上述代码。
内容的提问来源于stack exchange,提问作者Retire Young
相关产品推荐
相关产品推荐

