yt-dlp+CustomTkinter音视频分合下载:FFmpeg自动合并无法禁用
解决yt-dlp自动合并音视频的问题
问题根源
你在分离下载的格式参数中使用了+符号,yt-dlp会将bestvideo+bestaudio这类格式组合默认视为需要合并成单个文件的请求,因此即便设置postprocessors: []也无法阻止合并流程。
修正步骤
- 将else分支中的格式分隔符从
+改为,,明确告知yt-dlp要分别下载视频和音频文件 - 移除format中的
/best后缀,避免在分离格式不可用时自动 fallback 到单文件格式 - 保留并确认以下参数配置:
merge_output_format: None:明确禁用合并输出postprocessors: []:清空所有后处理器keepvideo: True:确保保留原始音视频文件
修正后的完整代码
import yt_dlp import customtkinter as ct import threading app = ct.CTk() app.title("VideoDownloader") app.geometry("660x440") def create_progress_bar(): user_download_progressbar.pack(pady=(20, 0)) user_download_progressbar.start() def download_video(): url = user_url_entry.get() save_path = user_path_entry.get() if user_useffmpeg_switch.get() == 1: # 使用FFmpeg合并音视频 ydl_opts = { 'format': 'bestvideo+bestaudio/best', 'outtmpl': f'{save_path}/%(title)s.%(ext)s', 'quiet': False, 'noprogress': True, 'merge_output_format': 'mp4', } else: # 分离下载音视频,不合并 ydl_opts = { 'format': 'bestvideo[ext=mp4],bestaudio[ext=m4a]', # 用逗号分隔,分别下载 'outtmpl': f'{save_path}/%(title)s.%(ext)s', 'quiet': False, 'noprogress': True, 'postprocessors': [], 'merge_output_format': None, 'keepvideo': True, } # 启动下载 with yt_dlp.YoutubeDL(ydl_opts) as ydl: ydl.download([url]) # 停止进度条 app.after(0, user_download_progressbar.stop) def start_download(): thread_download = threading.Thread(target=download_video) thread_download.start() create_progress_bar() # UI元素 user_url_entry = ct.CTkEntry(app, placeholder_text="YouTube URL", width=330) user_url_entry.pack(pady=(10, 0)) user_path_entry = ct.CTkEntry(app, placeholder_text="视频保存路径", width=330) user_path_entry.pack(pady=(10, 0)) # FFmpeg开关 user_useffmpeg_switch = ct.CTkSwitch(app, text="使用FFmpeg合并音视频文件") user_useffmpeg_switch.pack(pady=(10, 0)) # 下载按钮 user_download_button = ct.CTkButton(app, text="开始下载", command=start_download) user_download_button.pack(pady=(20, 0)) # 进度条 user_download_progressbar = ct.CTkProgressBar(app, mode="indeterminate") app.mainloop()
额外说明
- 使用逗号分隔格式后,yt-dlp会分别下载符合条件的视频和音频文件,保存为
[标题].mp4和[标题].m4a - 如果需要支持更多格式,可以扩展format参数,例如
bestvideo[ext=webm],bestaudio[ext=webm] - 确保你的yt-dlp是最新版本,旧版本可能存在参数兼容问题
内容的提问来源于stack exchange,提问作者Héctor Urueña
相关产品推荐
相关产品推荐

