9.1 短视频处理:竖屏、封面与转码


9.1 短视频处理:竖屏、封面与转码

本节摘要:短视频平台把「用户上传→转码→多码率→封面」做成一条自动流水线。本节给出一套可落地的处理流程与命令,讲清探测分流、错误隔离、幂等重试这三个工程要点,并演示竖屏素材的处理套路。

本节目标:阅读完本节,你应当能够:

  1. 设计一条短视频处理的完整流水线及其命令
  2. 说出批量处理的三个工程要点:先探测分流、错误隔离、幂等重试
  3. 处理竖屏素材时正确选择裁剪、缩放与水印方案

一、数字事实开场

一个日活千万的短视频 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

三、工程实践要点

批量处理的三个工程要点

  1. 先探测分流:每种输入走不同分支,避免「一条命令打天下」。H.264 直传、HEVC 重转、异常文件丢弃。
  2. 错误隔离:单条转码失败不能拖垮整批。用「任务队列 + 每任务独立进程」模式,失败标记单独重试,而不是整批重来。
  3. 幂等重试:重试必须「同样的输入出同样的结果」,否则断点续传会产出重复或半截文件。做法:输出文件先写临时名,成功后 rename 成正式名,失败删除临时文件。

转码任务的简单脚本化

# 批量转码:遍历目录,跳过已存在的输出(幂等) 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 限制读取超时。这三个参数是短视频批处理里公认的「防坑三件套」,先套上再调业务逻辑,能少接一半的深夜报警。

本节要点回顾

  • 流水线五段:上传→探测→转码→封面→入库,每段各司其职
  • 先探测分流:能直传的别转码,能省的计算是最便宜的计算
  • 三个工程要点:探测分流、错误隔离、幂等重试
  • 竖屏套路:横屏需求 crop+scale,竖屏需求直接等比缩放
  • 幂等写法[ -f "$out" ] && continue + 临时文件改名

下一节换个场景——监控安防,看多路流的高并发处理怎么扛。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U