提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
- 批量或单文件将 *.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声道 ,提升浏览器播放兼容性
- 支持目录扫描与通配符路径;完成后输出成功/总数统计。

1126

被折叠的 条评论
为什么被折叠?



