python批量将 MP4 转码为 Web 兼容视频:H.264/AAC + yuv420p + faststart 实践指南

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

  • 批量或单文件将 *.mp4 转码为 Web 兼容的 H.264 + yuv420p + faststart ,可选择“就地替换”或生成新文件
  • 保留或重建音频为 AAC 128k/2声道 ,提升浏览器播放兼容性
  • 支持目录扫描与通配符路径;完成后输出成功/总数统计。

提示:以下是本篇文章正文内容,下面案例可供参考

一、使用步骤

1.操作

核心流程

  • 单文件处理函数 fix_one(src, inplace=False, preset=‘fast’, crf=23) 执行转码并输出目标文件 e:\pythonProject\cvPic\ceshi2.py:7-33

    • 构建目标文件名: inplace 为原地替换,否则输出 base.web.mp4 e:\pythonProject\cvPic\ceshi2.py:8-11
    • 调用 ffmpeg :视频 libx264 、 preset / crf 、像素格式 yuv420p 、 +faststart 、Baseline Profile;音频 aac 128k/2ch e:\pythonProject\cvPic\ceshi2.py:11-18
    • 成功后执行替换/重命名并打印结果;失败打印 fail e:\pythonProject\cvPic\ceshi2.py:19-33
  • 主程序解析参数并分两种模式执行 e:\pythonProject\cvPic\ceshi2.py:35-66

    • 目录模式:扫描 path/*.mp4 逐一转码 e:\pythonProject\cvPic\ceshi2.py:42-51
    • 单路径/通配符模式:支持 * / ? 扩展后逐一转码 e:\pythonProject\cvPic\ceshi2.py:52-63
      参数与用法
  • 必填: path (目录或文件,支持通配符)

  • 可选:

    • –inplace 原地替换源文件
    • –preset 默认 fast (取值如 ultrafast / superfast / fast / medium / slow )
    • –crf 默认 23 (质量-码率权衡,越小越清晰体积越大)
  • 示例:

    • 批量目录转码输出 *.web.mp4 : python ceshi2.py “.\videos”
    • 就地替换单文件: python ceshi2.py “.\videos\clip.mp4” --inplace
    • 通配符批量: python ceshi2.py “.\videos*.mp4” --preset medium --crf 20
      异常与健壮性
  • 使用 subprocess.run(cmd, check=True) 捕获转码失败并继续后续文件 e:\pythonProject\cvPic\ceshi2.py:19-33

  • 文件删除/替换包裹 try/except ,降低因文件锁定或权限问题导致的崩溃风险 e:\pythonProject\cvPic\ceshi2.py:21-29

2.代码

代码如下(示例):

import argparse
import subprocess
import os
import sys
import glob
# 转码
def fix_one(src, inplace=False, preset='fast', crf=23):
    base, _ = os.path.splitext(src)
    dst = src if inplace else base + '.web.mp4'
    tmp = base + '.tmp.mp4' if inplace else dst
    cmd = [
        'ffmpeg','-y','-i',src,
        '-c:v','libx264','-preset',preset,'-crf',str(crf),
        '-pix_fmt','yuv420p','-movflags','+faststart',
        '-profile:v','baseline','-level','3.0',
        '-c:a','aac','-b:a','128k','-ac','2',
        tmp
    ]
    try:
        subprocess.run(cmd, check=True)
        if inplace:
            try:
                os.remove(src)
            except Exception:
                pass
            os.replace(tmp, src)
            print(f'fixed: {src}')
        else:
            print(f'fixed: {dst}')
        return True
    except subprocess.CalledProcessError:
        print(f'fail: {src}')
        return False

def main():
    p = argparse.ArgumentParser()
    p.add_argument('path')
    p.add_argument('--inplace', action='store_true')
    p.add_argument('--preset', default='fast')
    p.add_argument('--crf', type=int, default=23)
    args = p.parse_args()
    if os.path.isdir(args.path):
        files = sorted(glob.glob(os.path.join(args.path, '*.mp4')))
        if not files:
            print('no mp4 files')
            sys.exit(1)
        ok = 0
        for f in files:
            ok += 1 if fix_one(f, inplace=args.inplace, preset=args.preset, crf=args.crf) else 0
        print(f'done {ok}/{len(files)}')
    else:
        paths = []
        if any(ch in args.path for ch in ['*','?']):
            paths = sorted(glob.glob(args.path))
        else:
            paths = [args.path]
        if not paths:
            print('no files')
            sys.exit(1)
        ok = 0
        for pth in paths:
            ok += 1 if fix_one(pth, inplace=args.inplace, preset=args.preset, crf=args.crf) else 0
        print(f'done {ok}/{len(paths)}')

if __name__ == '__main__':
    main()

总结

  • 批量或单文件将 *.mp4 转码为 Web 兼容的 H.264 + yuv420p + faststart ,可选择“就地替换”或生成新文件
  • 保留或重建音频为 AAC 128k/2声道 ,提升浏览器播放兼容性
  • 支持目录扫描与通配符路径;完成后输出成功/总数统计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值