本节摘要:短视频平台把「用户上传→转码→多码率→封面」做成一条自动流水线。本节给出一套可落地的处理流程与命令,讲清探测分流、错误隔离、幂等重试这三个工程要点,并演示竖屏素材的处理套路。
本节目标:阅读完本节,你应当能够:
一个日活千万的短视频 App,每天的新增上传量级在百万级。这个数字意味着:处理不是「转一条视频」,而是「建一条流水线,每天转一百万次」。质量、速度、失败率,每一项放大一百万倍都是灾难。短视频处理的工程本质,就是把第 3、4、5 章的单个能力,组合成一条可批量化、可容错、可重试的流水线。
上传 → 探测(ffprobe)→ 判断(转码 or 直传)→ 多码率转码 → 封面生成 → 入库分发
先探测,再决定怎么处理:
# 探测上传文件的关键信息 ffprobe -v error -show_entries stream=codec_name,width,height \ -show_entries format=duration -of json upload.mp4
判断逻辑:编码已是 H.264 + 分辨率符合要求 → 直传入库(快);否则 → 转码。先探测后处理能省下大量无谓转码——这是流水线的第一道分流。
平台要出多个清晰度档位,视频各转一份:
# 1080p 主档 ffmpeg -i upload.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k -vf "scale=-2:1080" out_1080.mp4 # 720p 次档 ffmpeg -i upload.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 96k -vf "scale=-2:720" out_720.mp4 # 封面:第 3 秒抽一帧 ffmpeg -ss 3 -i upload.mp4 -frames:v 1 -q:v 2 cover.jpg
注意 scale 用 -2 保比例与偶数,封面单独抽帧不影响视频流。
手机竖屏视频是短视频主力,常见两个诉求:
裁成横屏(平台横屏信息流):
# 竖屏 1080x1920 → 横屏 1920x1080:取中间 1080x1080 再拉伸或衬底 ffmpeg -i v.mp4 -vf "crop=1080:1080:0:390,scale=1920:1080" out.mp4
保持竖屏(竖屏信息流):竖屏视频别横转,直接原比例缩放:
ffmpeg -i v.mp4 -vf "scale=-2:1920" -c:v libx264 -crf 23 out_vertical.mp4
# 批量转码:遍历目录,跳过已存在的输出(幂等) for f in uploads/*.mp4; do out="output/$(basename "$f" .mp4)_720.mp4" [ -f "$out" ] && continue # 已有则跳过,天然幂等 ffmpeg -y -i "$f" -vf "scale=-2:720" -c:v libx264 -crf 23 "$out" \ || echo "FAILED: $f" >> batch_fail.log done
[ -f "$out" ] && continue 让脚本可安全重跑,失败的记入日志单独处理——这就是错误隔离 + 幂等重试的最小实现。

流水线五段环环相扣,下方三个工程要点是百万级处理的关键。探测分流省计算、错误隔离保稳定、幂等重试保正确——三者缺一,流水线在放大一百万倍后就会出各种幺蛾子。
常见坑:批量脚本里忘记
-y,第二次跑全部停在「是否覆盖」提问上;输出文件名不带唯一标识,并发转码互相覆盖;封面抽帧时-ss放错位置导致封面时间不准。
💡 关键直觉:短视频处理的难点不在单个命令,而在「流水线的可重入性」。任何一步中断后能否安全重跑,是衡量一条流水线成熟度的尺子。
短视频流水线每天都会碰到「怪文件」:没有音轨的无声视频、帧率异常的屏幕录制、损坏到一半的文件。这些边缘情况处理不好,会让整个流水线在深夜悄悄挂掉。
# 一个「带超时和空流检查」的稳妥转码模板 ffmpeg -y -v error -timeout 30 -i input.mp4 \ -map 0:v:0 -map 0:a? -c:v libx264 -crf 23 -c:a aac \ -max_muxing_queue_size 1024 output.mp4
-map 0:a? 里的问号表示「这条流可选」——没有音轨也不报错。-max_muxing_queue_size 防止某些文件音频帧堆积导致「buffer overflow」报错。-timeout 30 限制读取超时。这三个参数是短视频批处理里公认的「防坑三件套」,先套上再调业务逻辑,能少接一半的深夜报警。
[ -f "$out" ] && continue + 临时文件改名下一节换个场景——监控安防,看多路流的高并发处理怎么扛。