【实践记录】修复抖音竖屏视频在更高比例手机上被上下裁切的问题
问题现象
一批播客切片视频按标准抖音竖屏尺寸 1080×1920(9
) 渲染发布后,在部分手机上预览发现:- 顶部的播客名水印看不到
- 底部的分集名被截掉一半
- 底部的进度条完全消失
而在电脑播放器、部分老款手机上看一切正常。典型的「在我机器上没问题」。
排查后发现,这批视频的几个关键元素都在画面的极顶和极底:
播客名 y = 80(顶部)
分集名 y = 1820(底部)
进度条 y = 1850(底部)画面总高 1920px,这些元素紧贴上下边缘,一旦播放端做了任何垂直裁切就会被吃掉。
根因分析:9不是抖音的「全屏」尺寸
抖音竖屏视频虽然推荐 9
,但很多手机屏幕的物理比例比 9更高:| 设备 | 屏幕比例(竖屏) |
|---|---|
| 老款 16手机 | 9 |
| iPhone 12/13/14/15 系列 | 9.5 |
| 部分 Android 旗舰 | 9甚至 9 |
当 9
的视频在 9.5 的屏幕上播放时,抖音为了填满整块屏幕(而不是留黑边),会以视频中心为基准上下裁切视频内容。裁切量计算
以 iPhone 15 Pro Max(9
.5)为例,屏幕宽度 1080px 对应的物理高度:屏幕高度 = 1080 × 19.5 / 9 = 2340 px
视频高度 = 1920 px
需要填满的高度差 = 2340 - 1920 = 420 px
上下各裁切 = 420 / 2 = 210 px也就是说,视频的 y ∈ [0, 210](顶部)和 y ∈ [1710, 1920](底部)这两段内容会被裁掉。
把这批视频的关键元素套进去:
播客名 y=80 → 落在 [0, 210] → 被裁 ❌
分集名 y=1820 → 落在 [1710, 1920] → 被裁 ❌
进度条 y=1850 → 落在 [1710, 1920] → 被裁 ❌完美对上现象,根因确认。
安全区示意
┌──────── 1080 ────────┐
210 ░░░░░ 裁切区 ░░░░░░░ ← 顶部危险区
┌─────────────────────┐
│ │
│ │
│ 9:16 安全区 │ 1920
│ (内容放心放这里) │
│ │
│ │
└─────────────────────┘
210 ░░░░░ 裁切区 ░░░░░░░ ← 底部危险区
└─────────────────────┘
2340结论:所有关键内容必须放在中央的 1080×1920 安全区内,并且画面整体高度要达到 2340,才能在 9
.5 屏幕上不被裁切地填满全屏。解决方案对比
有两条路可走:
| 方案 | 做法 | 优点 | 缺点 |
|---|---|---|---|
| A. 重新渲染 | 把渲染画布从 1920 加高到 2340(9.5),上下铺背景色,内容仍放在中央 1920 区 | 一次到位、画质无损 | 需要重渲染全部视频,耗时长 |
| B. ffmpeg 加边 | 用 ffmpeg 给现有 1920 视频上下填充到 2340 | 无需重渲染,几分钟搞定一批;不碰原始素材 | 多一次转码(轻微画质损失) |
如果渲染工程改动小、视频数量少,方案 A 最干净。但本场景是已有一批成片、渲染工程改起来要重出几十条,所以选了方案 B:用 ffmpeg 直接给成片加安全区填充,绕开重渲染。
下面记录可复用的命令。
ffmpeg 实战
前置:确认原始尺寸
动手前先确认输入视频确实是 1080×1920:
ffprobe -v error -select_streams v:0 \
-show_entries stream=width,height -of csv=p=0 input.mp4
# 期望输出:1080,1920方案 B-1:纯色边填充(最快)
用 pad 滤镜把画面垫高到 1080×2340,原始画面居中放置,上下各留 210px 的纯色边。
ffmpeg -i input.mp4 \
-vf "pad=1080:2340:0:210:black" \
-c:v libx264 -crf 18 -preset slow \
-c:a copy \
output_padded.mp4参数说明:
pad=输出宽:输出高:输入 x:输入 y:颜色
1080 : 输出宽度(不变)
2340 : 输出高度(= 1920 + 210×2)
0 : 原画面放在 x=0(水平居中,宽未变)
210 : 原画面放在 y=210(上方留 210px,下方自动 2340-210-1920=210px)
black: 填充颜色,可换成 0x00000000 或自定义色(如 0x111111)关键点:
pad会改动画面,视频流必须重编码,所以指定了libx264 -crf 18(视觉无损,CRF 18~20 之间都行)。- 音频用
-c:a copy直接流拷贝,不重编码、不损失质量、速度更快。
方案 B-2:模糊背景填充(更好看)
纯色黑边在小屏预览里略显突兀。更讨喜的做法是把原画面放大铺满 2340 高度,再模糊掉当作背景,原画面清晰居中叠加在上面——视觉上像自适应全屏。
ffmpeg -i input.mp4 -filter_complex \
"[0:v]scale=-1:2340,crop=1080:2340,gblur=sigma=30[bg]; \
[bg][0:v]overlay=(W-w)/2:(H-h)/2[v]" \
-map "[v]" -map 0:a? \
-c:v libx264 -crf 18 -preset slow \
-c:a copy \
output_blur.mp4滤镜链拆解:
[bg] scale=-1:2340 # 等比放大到高 2340(宽自动变成 ~1316)
crop=1080:2340 # 居中裁出 1080×2340,铺满整块
gblur=sigma=30 # 高斯模糊,弱化边缘放大失真
[bg][0:v]
overlay=(W-w)/2:(H-h)/2 # 把原始 1080×1920 居中盖到背景上sigma越大越糊,20~40 之间通常观感最佳。-map 0:a?的?表示「有音轨就带上,没有也不报错」,对纯视频片段更健壮。
批量处理一整个目录
成片通常是一批,写个循环批量过一遍(Git Bash / Linux / macOS):
mkdir -p out
for f in *.mp4; do
ffmpeg -y -i "$f" \
-vf "pad=1080:2340:0:210:black" \
-c:v libx264 -crf 18 -preset slow \
-c:a copy \
"out/${f%.*}_safe.mp4"
doneWindows CMD 版本:
mkdir out
for %%f in (*.mp4) do (
ffmpeg -y -i "%%f" -vf "pad=1080:2340:0:210:black" ^
-c:v libx264 -crf 18 -preset slow -c:a copy ^
"out\%%~nf_safe.mp4"
)想批量走模糊背景方案,把 -vf "pad=..." 一行换成上面的 -filter_complex ... -map "[v]" -map 0:a? 即可。
验证
处理完先抽查再发布,避免整批返工。
1. 尺寸核对
ffprobe -v error -select_streams v:0 \
-show_entries stream=width,height -of csv=p=0 output_padded.mp4
# 期望输出:1080,23402. 用 ffmpeg 模拟裁切预览
把处理后的视频「假装」放在 9
.5 屏幕上裁切,看看中央内容是否完整:ffmpeg -i output_padded.mp4 \
-vf "crop=1080:1920:0:210" -frames:v 1 preview.png打开 preview.png,应该能看到完整的播客名、分集名、进度条——这正是用户在 9
3. 真机预览
最后传一台高比例手机(iPhone 15 系列即可)在抖音草稿里预览,确认 UI 没遮挡内容。
注意事项
- 比例只升不降。9.5(2340)覆盖了 iPhone 12 起的绝大多数机型;如果还要兼容 9/ 9的极长屏 Android,把高度再提到 2400(9)即可,公式是
高度 = 1080 × 屏幕比例 / 9,上下填充= (高度 - 1920) / 2。 - 重编码的代价。视频滤镜必然触发重编码,建议用
-crf 18 -preset slow兼顾画质和体积;音频一律-c:a copy。 - 源文件保留。加工后另存(如
_safe.mp4后缀),保留 1080×1920 原片,便于将来改尺寸或换平台重新分发。 - 治本是改渲染工程。如果是长期产线,建议直接把渲染模板的画布改成 1080×2340,内容仍排在中央 1920 安全区——一次性、零转码损失。本文的 ffmpeg 方案更适合「已成片、要补救」的场景。