30 条素材来源各不相同,分辨率、帧率、码率五花八门。转码本身一条命令就能做,真正让人返工的是水印——按固定像素放,一旦换成竖屏就跑到画面外,或者结结实实压在字幕上。
一句话结论
批处理的成败不在转码参数,在探测和相对坐标两步。先 ffprobe 全量出规格表,再按规格分组定输出,不要上来就一条命令转完。水印位置必须用「宽度百分比 + 最小边距」,不能写死像素:我这次 30 条素材涉及 7 种分辨率、4 种帧率、码率 1.2–18 Mbps,第一版按固定 40 像素放水印,11 条压在字幕上;改成按宽度 6% 且距边不小于 24 像素后,30 条全部落在安全区。转码总耗时 26 分钟,并行 2 路。
这篇解决什么问题
三种情况最常见。一是转完发现几条糊得厉害——源素材本来就是低码率,硬拉到 6 Mbps 只是把文件变大。二是竖屏素材的水印跑到画面外,横屏素材的水印压着字幕,还得一条条回去改。三是转了一半报错,不知道停在哪里、哪几条成功了,重跑又全部重来一遍。
根子是同一个:把批处理当成对文件挨个执行命令,实际是先分类再执行。分类依据是源规格,执行依据是输出规格,两者之间要有一张映射表。没有这张表,参数只能取一个「看起来都行」的值,而实际上每条素材的差异都在那 10% 里。文章把它固定成五步,做完得到一套统一的成品和一张能回溯的转码日志。
开始前要准备什么
- ffmpeg 与 ffprobe:版本要记下来,同一命令在不同版本里的默认行为有差别(尤其 H.264 profile 与 yuv 格式)。我用的是 6.x。
- 30 条素材的原始清单:文件名、来源、业务用途。文件名里最好带编号,否则日志对不上源文件。
- 输出规格的唯一口径:分辨率、帧率、码率、像素格式、音频采样率,五项各定一个值。定不下来说明还没想清楚成片用在哪。
- 水印文件与安全区定义:水印图要带透明通道;安全区要明确「距边多少像素算安全」,这个数决定了最小边距。
具体怎么做
第一步:先探测,出一张规格表
ffprobe 一条命令可以把每个文件的宽高、帧率、时长、码率、像素格式、音频采样率全打出来。这步只读不改,成本几十秒,但它决定了后面所有的分组。我这次 30 条探出 7 种分辨率(含 3 种竖屏)、4 种帧率(23.976/25/30/60)、码率跨 1.2–18 Mbps,还有 2 条是可变帧率(VFR)。
这是我 30 条素材的 ffprobe 输出(每个文件的宽高、帧率、时长、码率、像素格式、音频采样率)。
请帮我做四件事:
1. 把这些素材按「可统一处理」分成尽量少的组,给出分组依据和每组的数量;
2. 指出哪些文件会因为规格特殊而需要单独处理(竖屏、可变帧率、无音轨、非方形像素);
3. 判断哪些源文件码率或分辨率过低,强行拉高只会变大不会变清晰;
4. 给出一张目标规格表:按用途推荐输出分辨率、帧率、码率、像素格式。ffprobe 输出:(粘贴)
第二步:定输出规格与兼容矩阵
五项定死:1080p(1920×1080 或 1080×1920)、30 fps、6 Mbps 视频、yuv420p、AAC 128 kbps 48 kHz。兼容性上有三条硬约束:宽高必须是偶数(奇数会让 H.264 编码失败)、像素格式必须是 yuv420p(否则部分播放器和平台不认)、profile 用 High 而不是 High 10(后者浏览器普遍不支持)。竖屏不旋转,只按短边对齐 1080。
这是我的输出规格与目标播放环境(网页内嵌 / 移动端 / 平台上传)。
请帮我做三件事:
1. 指出这套规格里哪些参数会导致兼容问题,逐条给修正值;
2. 给出一个 ffmpeg 参数模板,覆盖「横屏→1080p」「竖屏→1080 短边」「无声源补静音轨」三种情况;
3. 说明缩放应该用哪种算法,以及为什么不能直接把宽高写成固定值(奇数宽高、非等比拉伸)。规格与用途:(粘贴)
第三步:水印用相对坐标,不写死像素
水印位置写成这样才安全:x = W*0.94 - w、y = H*0.06,再对结果做一次下限钳制(不小于 24 像素)。含义是「右上角、距右边 6% 宽、距顶 6% 高,且任何情况下距边不小于 24 像素」。竖屏时 6% 宽会很小,所以要取「宽度百分比」与「最小边距」两者的较大值。我第一版写死 40:40,横屏没问题,11 条竖屏素材的水印直接压在底部字幕区。
这是我的水印图(含透明通道)和 30 条素材的分辨率分布。
请帮我做四件事:
1. 给出一套相对坐标公式,保证横屏、竖屏、方形素材下水印都在安全区内且不遮字幕;
2. 说明水印大小应该按宽度百分比还是按短边百分比算,给出推荐值;
3. 指出字幕区一般占画面多少高度,水印应该避开哪一段;
4. 给出一个「批量检查水印越界」的方法:不用肉眼看,用命令或脚本判断。分辨率分布:(粘贴)
第四步:限并行、逐条落日志
并行度不要按「有多少条」定,按 CPU 核数的一半或 GPU 编码路数定。我这次 2 路并行,30 条共 26 分钟;试过 4 路,总时长只快了 4 分钟,但单条耗时波动从 ±15% 涨到 ±60%,原因是磁盘读写和编码器排队。日志一条一行落盘(不是最后统一写),六列:源文件、时长、源规格、输出规格、耗时、退出码。
这是我的批处理脚本(含并行控制、转码命令、日志写入)。
请帮我做四件事:
1. 指出并行度设置的问题,给出按机器配置计算并行度的公式;
2. 指出日志里缺哪些字段,导致失败后无法判断是哪一步出的错;
3. 给出「失败不中断整批」的改法:单条失败要记录并继续,最后汇总;
4. 说明重跑时怎么跳过已成功的条目(按源文件名还是按输出文件存在性判断),各自的坑是什么。脚本:(粘贴)
第五步:抽检三条加全量校验
抽检看画面:首帧、中间一帧、末帧各截一张,重点看水印位置、字幕是否被遮、有没有黑边拉伸。全量校验看数字:每条输出时长与源时长差不超过 0.2 秒、分辨率与帧率符合规格、文件大小不为 0。这一步能捞出「命令跑完退出码为 0 但产物是空文件」这种静默失败。
这是我的转码日志与输出目录清单(文件名、大小、时长、分辨率)。
请帮我做三件事:
1. 找出所有「退出码为 0 但产物异常」的条目(大小为 0、时长偏差超过 0.2 秒、分辨率不符合规格);
2. 给一份抽检清单:哪三条最值得人工看,看哪几个位置,各自可能暴露什么问题;
3. 给一个最终验收的判断标准:什么情况下这批可以交付,什么情况下必须重转。日志与清单:(粘贴)
实测记录
规模:30 条素材、合计 18 分 42 秒成片;源规格含 7 种分辨率(其中竖屏 11 条)、4 种帧率、码率 1.2–18 Mbps,2 条为可变帧率。
- 探测:ffprobe 全量 42 秒,发现 2 条 VFR 与 2 条无音轨,这两类如果不预先处理,会出现音画不同步和部分平台不认。
- 转码:2 路并行,30 条共 26 分钟,单条 38 秒到 2 分 10 秒。改 4 路并行只快 4 分钟,但单条耗时波动从 ±15% 涨到 ±60%。
- 水印:第一版固定 40:40 像素,11 条竖屏素材压住底部字幕;改为宽度 6% 且最小边距 24 像素后,30 条全部在安全区,抽检 9 帧无越界。
- 输出:统一 1080p / 30 fps / 6 Mbps / yuv420p / AAC 128 kbps,成品合计 1.6 GB。原低码率 4 条(1.2–2 Mbps)拉到 6 Mbps 后体积涨 3.1 倍,画质无改善。
- 校验:全量比对时长,29 条偏差在 0.1 秒内,1 条因 VFR 转 CFR 偏差 0.4 秒,重转时加了
-vsync cfr后收敛到 0.05 秒。
最容易错的 3 个地方
第一,水印写死像素坐标。横屏素材上看着完美,一换竖屏就跑出画面或者压在字幕上,而批量转码时你根本不会一条条看。判断方法:把水印坐标同时打印出来,和 30 条的宽高比一遍,凡是有素材的 x + w 大于宽度、或落进字幕区的,就是隐患。
第二,对低码率源强行拉高。源文件 1.2 Mbps,输出定 6 Mbps,文件大了 3 倍,画质一点没变——因为信息量在源里就已经丢了。转码不能创造细节。这条的实际代价是存储和上传时间,还有后面每个环节都要处理更大的文件。正确做法是按源码率设上限,或者干脆把这类素材退回重拍。
第三,等整批跑完才写日志。跑到第 24 条时崩了,日志是空的,你不知道前 23 条哪几条成功、哪几条是半成品。重跑要么全部重来,要么靠人工看文件时间戳猜。日志必须一条一行立刻落盘,这是批处理唯一可靠的断点依据。
可复用的东西
探测优先:任何批量处理文件的任务,第一步都是把输入规格全量探出来,再分组。包括批量改图、批量 PDF、批量 CSV 清洗。
相对坐标 + 最小边距:位置按宽度百分比算,再对结果做像素下限钳制。这一条能解决 90% 的「换个尺寸就跑偏」。
日志六列:源文件、时长、源规格、输出规格、耗时、退出码。前四列定位问题,后两列判断是否需要重跑。
常见问题解答
为什么不能直接写一条 ffmpeg 命令批量转完
因为每条素材的规格不一样。我这次 30 条里有 7 种分辨率、4 种帧率、2 条可变帧率、2 条无音轨,同一条命令在这些文件上会分别出错:VFR 转 CFR 会音画不同步、无音轨的会丢掉音频流、竖屏的会被拉伸。正确顺序是先 ffprobe 全量探测出规格表,按规格分组,再对每组用对应参数。
水印位置怎么设置才不会在不同尺寸上跑偏
用相对坐标加最小边距,不用固定像素。位置按画面宽高百分比算,再对结果做一次像素下限钳制,保证任何尺寸下距边都不小于 24 像素。我第一版写死 40:40,横屏没问题,11 条竖屏的水印直接压在底部字幕区;改成宽度 6% 加最小边距后 30 条全部在安全区。
低码率素材拉到高码率有意义吗
没有。源文件只有 1.2 Mbps 时,细节在源里就已经丢了,输出定 6 Mbps 只会让文件大 3 倍,画质一点不变。转码不能创造信息。我这次 4 条低码率素材拉高后体积涨 3.1 倍,肉眼分辨不出差别,代价是存储和后续每个环节都要处理更大的文件。
批处理为什么要一条一行写日志
因为批处理一定会中断。跑到第 24 条崩了,如果日志是最后统一写,那一刻日志是空的,你既不知道前 23 条哪几条成功,也不知道哪几条生成了半成品。一条一行立刻落盘,日志就是唯一可靠的断点依据,重跑时能按退出码跳过已成功的条目。
本网站的部分内容可能来源于网络或用户投稿,仅供大家学习与参考,如有侵权,请联系客服: hhxmw778 进行删除处理。
本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
教程如引导您添加微信或有另外收费服务,请自行甄别!
如遇充值环节或绑定支付账户或输入支付密码之类的异常步骤,建议停止操作!本站不对操作项目的损失负责!
本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现任何资源有问题请向站长举报下架
(手机微信用户建议用默认浏览器打开,可体验完整功能)
