用FFmpeg修改视频旋转信息
🔄 视频旋转与观看体验

视频拍摄方向的处理是视频创作中经常遇到的问题:

  • 竖屏vs横屏:手机拍摄的竖屏视频在横屏播放时会出现大片黑边。创作前需明确目标平台的屏幕方向(抖音/快手等短视频平台适合竖屏,B站/YouTube适合横屏)。
  • 元数据旋转 vs 实际旋转:修改元数据旋转(-metadata:s:v rotate)不损失画质但依赖播放器支持;使用 transpose 滤镜旋转则对所有播放器兼容但需重新编码。
  • 平台适配:不同平台对旋转方向的默认处理不同,发布前务必预览校验方向是否正确,避免出现倒置或倾斜的画面。
  • 黑边与裁剪:旋转后的视频可能需要裁剪多余的黑边或进行画面填充,使用 crop 滤镜可精确控制显示区域。
FFmpeg视频旋转信息详解

手机拍摄的视频通常会在元数据中包含 rotate 旋转角度信息,用于标记摄像头的拍摄方向。很多播放器和社交媒体平台会读取这个元数据来自动调整画面的显示方向,确保视频播放时方向正确。

修改元数据(轻量快速)

使用 -metadata:s:v:0 rotate=N 参数可以修改视频流的旋转元数据,其中 N 可取值为 090180270。这种方式配合 -c:v copy(视频流直接复制,不重新编码)和 -c:a copy(音频流直接复制)实现几乎瞬时的处理,不损失画质、不改变文件大小,仅修改文件头部的元数据标记。

# 修改为旋转90度
$ ffmpeg -i input.mp4 -metadata:s:v:0 rotate=90 -c:v copy -c:a copy output.mp4

# 修改为旋转180度(倒置)
$ ffmpeg -i input.mp4 -metadata:s:v:0 rotate=180 -c:v copy -c:a copy output.mp4

# 修改为旋转270度(即逆时针90度)
$ ffmpeg -i input.mp4 -metadata:s:v:0 rotate=270 -c:v copy -c:a copy output.mp4

# 清除旋转信息(设置为0度)
$ ffmpeg -i input.mp4 -metadata:s:v:0 rotate=0 -c:v copy -c:a copy output.mp4
实际像素旋转(使用 transpose 滤镜)

如果目标播放器不支持读取 rotate 元数据,或者需要彻底改变视频画面的像素排列方式,则需要使用 transpose 滤镜对视频进行实际的旋转处理。这种方式需要重新编码视频,会耗时更长、损失一定画质(有损编码),但效果对所有播放器通用。

# 顺时针旋转90度
$ ffmpeg -i input.mp4 -vf "transpose=1" -c:a copy output.mp4

# 逆时针旋转90度
$ ffmpeg -i input.mp4 -vf "transpose=2" -c:a copy output.mp4

# 顺时针旋转90度并水平翻转
$ ffmpeg -i input.mp4 -vf "transpose=3" -c:a copy output.mp4
查看当前视频的旋转信息

使用 ffprobe 可以查看视频文件的旋转元数据:

$ ffprobe -i input.mp4 -show_streams -select_streams v:0 | grep rotate
两种方式的对比总结
方法命令参数是否重新编码速度画质
修改元数据-metadata:s:v:0 rotate=N否(-c:v copy极快(毫秒级)无损
实际像素旋转-vf "transpose=N"是(重新编码)较慢(取决于视频时长)有损
广告
{{v.name}}
对于手机拍摄的视频,有时可能需要修改旋转角度(rotate)元数据来确保视频播放时方向正确,代码如下
$ ffmpeg -i input.mp4 -metadata:s:v:0 rotate=90 -c:v copy -c:a copy output.mp4
除了旋转90度,还可以旋转0度、180度和270度
友链