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

yt-dlp+CustomTkinter音视频分合下载:FFmpeg自动合并无法禁用

解决yt-dlp自动合并音视频的问题

问题根源

你在分离下载的格式参数中使用了+符号,yt-dlp会将bestvideo+bestaudio这类格式组合默认视为需要合并成单个文件的请求,因此即便设置postprocessors: []也无法阻止合并流程。

修正步骤

  1. 将else分支中的格式分隔符从+改为,,明确告知yt-dlp要分别下载视频和音频文件
  2. 移除format中的/best后缀,避免在分离格式不可用时自动 fallback 到单文件格式
  3. 保留并确认以下参数配置:
    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 08:20:18