使用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 的示例视频文件。我们将使用它来尝试一些不同的旋转。 这是该视频的预览:
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视频时,我们会得到这个输出:
我们还可以组合多个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视频时得到这个输出:
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视频时得到这个输出:
5. 使用hflip和vflip
** hflip是一个 FFmpeg 过滤器,它水平翻转输入视频,而vflip垂直翻转视频。**我们可以使用两种滤镜的组合将视频旋转 180°。
让我们使用hflip和vflip过滤器旋转示例视频:
$ 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视频时,我们会得到这个结果:
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...
此命令水平和垂直翻转视频,然后自动播放。