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