如何使用 FFmpeg 将视频旋转 180°?

Lou*_*eru 93 ffmpeg

我有一个在录制时旋转 180° 的视频。是否可以使用 FFmpeg 纠正此问题?

llo*_*gan 130

原来的旋转


tl;博士

ffmpeg 将自动旋转视频,除非:

  • 您的输入不包含旋转元数据
  • ffmpeg太老了

轮换元数据

某些视频(例如来自 iPhone 的视频)并非物理翻转,而是包含视频流 displaymatrix 侧数据或旋转元数据。有些玩家会忽略这些元数据,有些则不会。请参阅ffmpeg控制台输出以查看您的输入是否具有此类元数据:

$ ffmpeg -i input.mp4
...
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Duration: 00:00:05.00, start: 0.000000, bitrate: 43 kb/s
    Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 320x240 [SAR 1:1 DAR 4:3], 39 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      rotate          : 180
    Side data:
      displaymatrix: rotation of -180.00 degrees
Run Code Online (Sandbox Code Playgroud)

自动旋转

ffmpeg 将根据任何现有的视频流旋转元数据自动物理旋转视频。

您需要一个包含 2015 年 5 月 2 日提交的 1630224 的构建,才能使用自动旋转功能。

例子

ffmpeg -i input.mp4 -c:a copy output.mp4
Run Code Online (Sandbox Code Playgroud)

要禁用此行为,请使用该-noautorotate选项。


如果输入不包含元数据或者您的内容ffmpeg很旧

您必须使用过滤器来旋转视频,如果存在任何旋转元数据,则必须将其删除,如下例所示:

例子

使用ffmpeg您可以选择三种使用视频滤镜旋转 180° 的方法。

hflipvflip

ffmpeg -i input.mp4 -vf "hflip,vflip,format=yuv420p" -metadata:s:v rotate=0 \
-codec:v libx264 -codec:a copy output.mkv
Run Code Online (Sandbox Code Playgroud)

transpose

ffmpeg -i input.mp4 -vf "transpose=2,transpose=2,format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4
Run Code Online (Sandbox Code Playgroud)

rotate

此过滤器可以旋转到任意角度,并使用弧度而不是度数作为单位。此示例将旋转 ?/1 弧度或 180°:

ffmpeg -i input.mp4 -vf "rotate=PI:bilinear=0,format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4
Run Code Online (Sandbox Code Playgroud)

您可以使用度数代替。1 度等于 ?/180 弧度。所以如果你想旋转 45°:

ffmpeg -i input.mp4 -vf "rotate=45*(PI/180),format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4
Run Code Online (Sandbox Code Playgroud)

使用rotate滤波器时,bilinear=0对于可被 90 整除的角度,应关闭(通过使用)双线性插值,否则可能看起来很模糊。


笔记

  • 过滤需要编码。这些示例生成 H.264 视频输出。有关获得所需质量的指导,请参阅FFmpeg H.264 视频编码指南

  • 色度子采样。我包括format=yuv420p因为ffmpeg将尝试最小化或避免色度子采样(取决于编码器、输入、ffmpeg版本等)。从纯粹的技术意义上讲,这是一种良好的行为,但大多数播放器与更“高级”的色度子采样方案不兼容。这与 using 相同-pix_fmt yuv420,但方便地位于过滤器链中

  • 复制音频。-codec:a copy选项将流式复制(重新复用)而不是编码。如果您只想操作视频,则没有理由重新编码音频(除非您想转换为不同的音频格式)。这将节省时间,因为编码非常耗时,并且会保持音频的质量。


播放时旋转

或者,您可以在播放时旋转并避免重新编码。ffplay会自动旋转:

ffplay input.mp4
Run Code Online (Sandbox Code Playgroud)

如果没有 displaymatrix 侧数据或旋转元数据,那么您可以使用过滤器:

ffplay -vf "hflip,vflip" -i input.mp4
Run Code Online (Sandbox Code Playgroud)

...或参考您最喜欢的球员。大多数值得使用的播放器,例如 VLC,都具有此功能。


得到 ffmpeg

ffmpeg 的较旧版本不包括过滤功能。请参阅FFmpeg 下载页面以获取多个选项,包括适用于 Linux、OS X 和 Windows 的便捷构建,或参阅FFmpeg Wiki以获取分步 ffmpeg 编译指南


Alb*_*bin 8

在 2015 年的 v2.7 版本中, FFMPEG 将默认行为更改为使用“旋转”元数据自动旋转输入视频源。

如果您知道您的脚本或命令永远不会在 2.7 之前的 ffmpeg 版本上运行,最简单的解决方案是删除任何基于元数据的自定义旋转。

对于其他情况,您可以通过保留自定义轮换代码并添加-noautorotate标志(这在当时仍在维护的旧版本中支持)来面向未来。