【实践记录】修复抖音竖屏视频在更高比例手机上被上下裁切的问题

8 min

问题现象

一批播客切片视频按标准抖音竖屏尺寸 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"
done

Windows 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,2340

2. 用 ffmpeg 模拟裁切预览

把处理后的视频「假装」放在 9

.5 屏幕上裁切,看看中央内容是否完整:

ffmpeg -i output_padded.mp4 \
  -vf "crop=1080:1920:0:210" -frames:v 1 preview.png

打开 preview.png,应该能看到完整的播客名、分集名、进度条——这正是用户在 9

.5 全屏下实际看到的安全区内容。如果这张图里内容完整,发布就稳了。

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 方案更适合「已成片、要补救」的场景。