经常我们会遇到,拍摄视频的时候,比如想要横版的,结果因为手机重力感应的问题,拍出来是竖版的。或者想要竖版的,结果拍成了横版的。这时候就需要把画面旋转90°,或者将画面进行翻转之类。
我们可以使用一个免费的工具 ffmpeg 来进行旋转或者翻转视频。
首先,去官网下载 ffmpeg,并进行解压。
ffmpeg官网:
http://ffmpeg.org/download.html
FFmpeg 百度网盘:https://pan.baidu.com/s/1oQN1u1NIwk5R7q05ZGz4Sg?pwd=iCoA
提取码: iCoA
复制这段内容后打开百度网盘手机App,操作更方便哦
解压到本地目录之后,可以把 ffmpeg 安装目录加到 系统 Path 里(如果配置过 Python 或者 Java,应该会操作),这样直接可以在任何一个视频所在目录运行这个命令了。
当然如果在 ffmpeg 安装目录运行命令,同时也把要处理的视频复制到的安装目录,效果跟本文是一样的。
我们先介绍一下 ffmpeg 旋转和翻转视频的命令行如下:
ffmpeg -i 要处理的文件 -vf filter_graph 输出的文件
其中重要的是后面的 filter_graph 指的是旋转或翻转的参数。
下面基于具体案例进行说明,第一部分先介绍画面旋转的命令,第二部分介绍画面翻转的命令。
一、画面旋转
相关命令:
ffmpeg -i 要处理的文件 -vf transpose:指定旋转的参数 输出的文件
相关参数:transpose:指定旋转的参数
指定参数说明:
0:逆时针旋转90°并垂直翻转
1:顺时针旋转90°
2:逆时针旋转90°
3:顺时针旋转90°后并垂直翻转
这些命令都是需要在命令行窗口里运行的,Windows 里快捷打开 命令行 的方式,就是在需要处理的视频目录(如果已经设置了 Path 的话)或者 ffmpeg 的 bin 目录上的地址栏,直接输入 cmd 回车即可。
打开命令行窗口之后,再在黑色命令行窗口里输入相关命令。
因为90°旋转其实是用的最多的,所以我们首先介绍顺时针旋转90°和逆时针旋转90°。
1.1 顺时针旋转90°
命令如下
ffmpeg -i source.mp4 -vf "transpose=1" output.mp4
原来画面是这样 ↑ ,经过这个命令处理之后,会变成这样 → .
如图:
1.2 逆时针旋转90°
命令如下:
ffmpeg -i source.mp4 -vf "transpose=2" output.mp4
原来画面是这样 ↑ ,经过这个命令处理之后,会变成这样 ← .
如图:
上面是最简单的旋转,下面两个比较特殊的,也可以了解一下:
1.3 逆时针旋转90°并垂直翻转
命令如下:
ffmpeg -i source.mp4 -vf "transpose=0" output.mp4
这个直接看图比较明白,如图示(注意跟 1.1 画面的对比):
1.4 顺时针旋转90°后并垂直翻转
命令如下:
ffmpeg -i source.mp4 -vf "transpose=3" output.mp4
如图示(注意跟 1.2 画面的对比):
上面四个还只是单次旋转,还可以使用二次旋转来达到旋转180°:
1.5 顺时针旋转180°
实现方式是,顺时针旋转90°两次,命令如下:
ffmpeg -i source.mp4 -vf "transpose=1,transpose=1" output.mp4
如图示:
1.6 逆时针旋转180°
命令如下:
ffmpeg -i source.mp4 -vf "transpose=2,transpose=2" output.mp4
无论是顺时针还是逆时针旋转180°,结果是一样的,所以就不放图示了。
二、画面翻转
上面讲了画面旋转,其实有时候我们也会遇到画面翻转的问题,也就是拍出来比如头在下脚在上,这时候就需要垂直翻转就可以了。或者左右方向反了,就可以用水平翻转。需要用到这两个参数 hflip 和 vflip.
相关命令:
ffmpeg -i 要处理的文件 -vf 翻转参数 输出的文件
2.1 垂直翻转(也就是画面上下翻转)
命令如下:
ffmpeg -i source.mp4 -vf "vflip" output.mp4
其中 vflip 指的就是垂直翻转。
原画面如果是 ↓ ,经过处理之后,会变成 ↑
2.2 水平翻转(也就是画面左右翻转)
命令如下:
ffmpeg -i source.mp4 -vf "hflip" output.mp4
其中 hflip 指的是水平翻转。
也就是如果原来画面是这样 → ,经过这个命令处理之后,会变成这样 ←
三、画面质量
注意,使用本文的命令进行旋转,其实是进行了视频转码,所以视频质量会有改变,并没有办法做到无损。要想跟之前画面质量差不多,需要一个参数 crf 来指定视频的画质。
命令:
ffmpeg -i 要处理的文件 -vf filter_graph -crf 视频编码 输出的文件
其中 crf 编码数值越小品质越高,最小是0,最大51。注意数值 0 代表的不是输入的源视频画质,指的是不压缩,转出来的是未经压缩的视频,体积是超大的。
比如上面第一部分和第二部分的命令没有指定 crf 的数值,则是默认值。不同的编码默认值不同,比如 x264 默认值是 23,x265 默认值是 28.
如果默认值出来的画质满足不了你的要求,你可以重新指定 crf 的数值即可,比默认值小就可以。建议多测试一下,另外测试的时候,没必要完全转完,那样太浪费时间,只转个一两秒看一下画质即可。也就是运行几秒钟之后,按 q 会自动停止并退出转码。这时候看一下转出来的片段是否满足要求,最终选择一个既满足要求,体积又小的数值。
完整命令行如下:
ffmpeg -i source.mp4 -vf "transpose=1" -crf 18 output.mp4
当然转码的过程中,会动态显示码率,你也可以调整数值,让码率跟原输入视频码率接近(当然不用追求相同,因为经过转码了,所以不可能完全相同)。
PS.如果有朋友没办法打开官网,我把这个程序传到百度网盘里,链接放到前面,从百度网盘里下载也可以。
当然本文介绍的是,视频尺寸随着画面改变而改变,还有一种旋转方式,视频宽高尺寸不变,只是画面进行旋转。如果感兴趣的话,我下一篇文章介绍一下。