跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

Python批量缩放视频分辨率_调用ffmpeg实现视频自动化转码

不拉伸变形的关键是用scale=1280:-2或scale=-2:720保持宽高比,-2确保尺寸为偶数适配yuv420p;加force_original_aspect_ratio=decrease和pad可缩放加黑边。 ffmpeg -vf scale 怎么写才不拉伸变形 关键在
scale
滤镜的宽高参数组合和是否启用保持宽高比。直接写
scale=1280:720
会强制拉伸,尤其源视频是竖屏或 4:3 时明显失真。 用
-vf "scale=1280:-2"
:宽度固定为 1280,高度自动按原始比例计算(-2 表示保持偶数,适配 yuv420p) 用
-vf "scale=-2:720"
:高度固定为 720,宽度自适应 加
force_original_aspect_ratio=decrease
可先缩放再补黑边,避免裁剪:
-vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2"
别用
-2
以外的负值(比如
-1
),部分 ffmpeg 版本不支持,会报错
Invalid value for width
Python 调用 ffmpeg 时如何安全传参、避免 shell 注入 用
subprocess.run
传参列表,而不是拼接字符串。用户文件名含空格、括号、单引号时,字符串拼接必崩。 错误写法:
subprocess.run(f'ffmpeg -i "{input_path}" -vf "scale=1280:-2" "{output_path}"')
正确写法:
subprocess.run(["ffmpeg", "-i", input_path, "-vf", "scale=1280:-2", output_path])
路径里有中文?确保 Python 文件本身用 UTF-8 编码,且系统 locale 支持(Linux/macOS 一般没问题;Windows 建议用 WSL 或设置
chcp 65001
) 不要依赖
shell=True
,它绕过参数隔离,等于主动打开注入漏洞 批量处理多个视频时怎么控制并发、防卡死 ffmpeg 单实例吃满 CPU 和磁盘 IO,开太多并行反而更慢,还可能触发系统 OOM killer 杀进程。 Python 3.14.3 微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。 下载 用
concurrent.futures.ThreadPoolExecutor
不靠谱——ffmpeg 是 CPU 密集型,线程无意义;必须用
ProcessPoolExecutor
进程数别超过物理核心数,建议设为
min(4, os.cpu_count())
每个子进程单独调用
ffmpeg
,别共用同一 pipe 或 stdout/stderr,否则日志混杂、异常难定位 加超时控制:
subprocess.run(..., timeout=300)
,防止某个视频卡住拖垮整批任务 输出文件没声音?常见音频流丢失原因
ffmpeg
默认只复制视频流,音频流需显式指定处理方式,否则静音是常态。 立即学习 “ Python免费学习笔记(深入) ”; 最简方案:
-c:a copy
直接拷贝音频流(快、无损,但要求编码格式兼容目标容器) 转码音频:
-c:a aac -b:a 128k
(注意 AAC 是 MP4 常用,但 MKV 更推荐
libopus
) 漏掉
-c:a
且源音频格式不被目标封装格式支持(如 AC3 写进 MP4),ffmpeg 会静默丢弃音频流,不报错 检查是否误加了
-an
(禁用音频),这是调试时手抖高频错误 真正麻烦的是混合帧率、B帧、场序的源视频——scale 滤镜默认不重置时间基,可能导致音画不同步。这种场景得加
-vsync vfr
-copyts
配合重新 mux,但那就不是“批量缩放”而是专业转码了。

相关文章