You need to enable JavaScript to run this app. 如何在Python中运行HandBrakeCLI命令 查看Anaconda终端输出并实现路径迭代
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中运行HandBrakeCLI命令 查看Anaconda终端输出并实现路径迭代

Python实现HandBrakeCLI批量转码方案

核心逻辑

  • 采用Python标准库subprocess调用HandBrakeCLI命令,将标准输出和错误输出合并后逐行打印,实现Anaconda终端实时查看转码进度
  • 用os.walk遍历输入根目录下所有符合格式的视频文件,自动保持输入目录结构生成对应输出路径,无需手动逐个配置

可直接运行的代码

import os
import subprocess

# 固定配置项,根据自己的实际路径修改
HANDBRAKE_CLI = r"C:\Program Files\HandBrake\HandBrakeCLI.exe"
PRESET_JSON_PATH = r"D:\Handbreak\Script\dudeness.json"
INPUT_ROOT_DIR = r"c:\folder"
OUTPUT_ROOT_DIR = r"c:\folder2"
# 要识别的视频格式后缀,可自行增减
SUPPORT_VIDEO_SUFFIX = ('.mp4', '.mkv', '.avi', '.mov', '.flv', '.wmv', '.rmvb')

if __name__ == "__main__":
    # 输出根目录不存在则自动创建
    os.makedirs(OUTPUT_ROOT_DIR, exist_ok=True)

    # 遍历输入目录所有文件
    for root, _, files in os.walk(INPUT_ROOT_DIR):
        # 计算当前子目录相对于输入根目录的路径,保持目录结构同步到输出目录
        relative_path = os.path.relpath(root, INPUT_ROOT_DIR)
        current_output_dir = os.path.join(OUTPUT_ROOT_DIR, relative_path)
        os.makedirs(current_output_dir, exist_ok=True)

        for file_name in files:
            # 只处理符合后缀的视频文件
            if not file_name.lower().endswith(SUPPORT_VIDEO_SUFFIX):
                continue
            input_file_full = os.path.join(root, file_name)
            # 输出文件默认用mp4格式,要保留原格式可把后缀改为os.path.splitext(file_name)[1]
            output_file_name = f"{os.path.splitext(file_name)[0]}.mp4"
            output_file_full = os.path.join(current_output_dir, output_file_name)

            # 跳过已存在的输出文件,需要覆盖转码可删除下面3行
            if os.path.exists(output_file_full):
                print(f"跳过已转码文件:{output_file_full}")
                continue

            print(f"\n===== 开始处理:{input_file_full} =====")
            # 构造转码命令,用列表形式避免路径空格转义问题
            cmd = [
                HANDBRAKE_CLI,
                "-i", input_file_full,
                "-o", output_file_full,
                "--preset-import-file", PRESET_JSON_PATH
            ]
            # 启动子进程,合并标准输出和错误输出
            process = subprocess.Popen(
                cmd,
                stdout=subprocess.PIPE,
                stderr=subprocess.STDOUT,
                text=True,
                encoding="utf-8",
                errors="ignore"
            )
            # 逐行打印实时输出
            for output_line in iter(process.stdout.readline, ""):
                print(output_line.strip())
            # 等待转码进程结束
            process.wait()
            if process.returncode == 0:
                print(f"===== 处理完成:{output_file_full} =====")
            else:
                print(f"===== 处理失败,错误码:{process.returncode},文件:{input_file_full} =====")

常见调整说明

  • 输出格式需要和原文件保持一致的,修改output_file_name的后缀拼接逻辑即可
  • 终端打印出现乱码的,把subprocess.Popen里的encoding参数改为gbk适配Windows终端编码
  • 不需要保留输入目录结构的,直接把所有输出文件放到输出根目录即可,删掉相对路径计算的逻辑就行

内容的提问来源于stack exchange,提问作者Random Person

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 00:51:03