Contents

使用FFmpeg旋转视频

1. 概述

FFmpeg 是一个免费的开源工具,用于处理媒体文件。它包含各种特性,使其成为 Linux 中最好的多媒体框架之一。因为它是开源的,所以它是大多数流行媒体播放器和视频编辑器(包括 VLC、iTunes、YouTube 等)的基础。

在本教程中,我们将了解使用 FFmpeg 将视频旋转到不同角度的不同方法。

2. 设置

在我们开始探索如何旋转视频之前,让我们首先确保我们已经安装了 FFmpeg:

$ ffmpeg -version
ffmpeg version 4.4-6ubuntu5 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 11 (Ubuntu 11.2.0-7ubuntu1)
...truncated...

如果我们没有安装 FFmpeg,我们可以使用这个命令来安装它:

$ sudo apt install ffmpeg

在 Arch Linux Distro 上,我们可以使用这个命令来安装 FFmpeg:

$ pacman -S ffmpeg

我们还下载 一个 1MB 的示例视频文件。我们将使用它来尝试一些不同的旋转。 这是该视频的预览:

/uploads/ffmpeg_rotate_video/1.gif

3. 使用transpose

** transpose是一个 FFmpeg 过滤器,用于旋转视频。**我们可以使用它顺时针或逆时针旋转示例视频。它还允许我们垂直或水平翻转视频。

transpose过滤器接受 0-3 的值。我们来看看每个值代表什么:

  • 0 = 90° 逆时针垂直翻转(默认)
  • 1 = 90° 顺时针
  • 2 = 90° 逆时针
  • 3 = 90° 顺时针垂直翻转

让我们看看如何使用转置过滤器旋转示例视频:

$ ffmpeg -i big_buck_bunny_720p_1mb.mp4 -vf "transpose=0" output_0.mp4
...truncated...
 Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 341 kb/s (default)
Metadata:
creation_time : 1970-01-01T00:00:00.000000Z
handler_name : SoundHandler
vendor_id : [0][0][0][0]
encoder : Lavc58.134.100 aac
frame= 132 fps= 27 q=-1.0 Lsize= 1274kB time=00:00:05.29 bitrate=1972.2kbits/s speed= 1.1x 
video:1040kB audio:229kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.406613%
...truncated...

**我们将值 0 传递给反时针和垂直旋转视频的transpose过滤器。**这会将视频方向更改为纵向。如果我们不向transpose传递任何值,这是默认预设。

播放output_0.mp4视频时,我们会得到这个输出:

/uploads/ffmpeg_rotate_video/2.gif

我们还可以组合多个transpose过滤器来改变视频的方向。

让我们组合两个transpose过滤器,每个过滤器的值为 1 用于 180° 翻转:

$ ffmpeg -i big_buck_bunny_720p_1mb.mp4 -vf "transpose=1, transpose=1" output_transpose_multiple.mp4

我们将视频顺时针翻转 90° 两次。

我们在播放output_transpose_multiple.mp4视频时得到这个输出:

/uploads/ffmpeg_rotate_video/3.gif

4. 使用rotate

**FFmpegrotate滤镜通过允许我们以弧度表示的任意角度旋转视频,提供了更大的灵活性。**这使我们能够将视频旋转到其他方法无法提供的更精确的角度。

此命令将视频旋转 π/1 弧度或 180°:

$ ffmpeg -i big_buck_bunny_720p_1mb.mp4 -vf "rotate=PI:bilinear=0" output_rotate_180.mp4

我们使用“ *bilinear=0”*来关闭可被 90 整除的角度的双线性插值。这是因为否则视频可能看起来很模糊。 我们也可以使用度数代替弧度。一个度数等于 π/180 弧度,所以如果我们想旋转到一个特定的度数,我们可以乘以 π/180:

$ ffmpeg -i big_buck_bunny_720p_1mb.mp4 -vf "rotate=45*(PI/180)" output_rotate_45.mp4

我们在播放output_rotate_45.mp4视频时得到这个输出:

/uploads/ffmpeg_rotate_video/4.gif

5. 使用hflipvflip

** hflip是一个 FFmpeg 过滤器,它水平翻转输入视频,而vflip垂直翻转视频。**我们可以使用两种滤镜的组合将视频旋转 180°。

让我们使用hflipvflip过滤器旋转示例视频:

$ ffmpeg -i big_buck_bunny_720p_1mb.mp4 -vf "hflip, vflip" output_combined.mp4
...truncated...
 Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 341 kb/s (default)
Metadata:
creation_time : 1970-01-01T00:00:00.000000Z
handler_name : SoundHandler
vendor_id : [0][0][0][0]
encoder : Lavc58.134.100 aac
frame= 132 fps= 27 q=-1.0 Lsize= 1274kB time=00:00:05.29 bitrate=1972.2kbits/s speed= 1.1x 
video:1040kB audio:229kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.406613%
...truncated...

当使用视频播放器播放output_combined.mp4视频时,我们会得到这个结果: /uploads/ffmpeg_rotate_video/5.gif

5.1. 播放时旋转

或者,我们可以在播放时旋转视频,这样就省去了重新编码示例视频的麻烦。

为此,我们需要使用*ffplay 。*它是一个轻量级的媒体播放器,与 FFmpeg 的安装捆绑在一起。

让我们看看如何在播放之前将视频旋转 180°:

$ ffplay -vf "hflip, vflip" -i big_buck_bunny_720p_1mb.mp4
...truncated...
Duration: 00:00:05.31, start: 0.000000, bitrate: 1589 kb/s
  Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1205 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      creation_time   : 1970-01-01T00:00:00.000000Z
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 384 kb/s (default)
...truncated...

此命令水平和垂直翻转视频,然后自动播放。