前面介绍ffmpeg 一些简单视频过滤器,后面分析手机拍出来的竖屏视频为什么是横屏尺寸。
因为某种原因发现ffmpeg处理视频旋转这个特别好玩,记录一下,为了演示效果还特意做了个字母小视频(abc.mp4),后面不贴GIF了,眼快闪瞎啦。
-vf指令是一些简单的视频过滤器。
ffmpeg -i abc.mp4 -vf "transpose=1" abc-r90.mp4
ffmpeg -i abc.mp4 -vf "transpose=2" abc-r270.mp4
ffmpeg -i abc.mp4 -vf hflip hflip.mp4
ffmpeg -i abc.mp4 -vf vflip vflip.mp4
ffmpeg -i abc.mp4 -vf "transpose=3" abc-trsps3.mp4
等效于
ffmpeg -i abc.mp4 -vf "transpose=2,hflip" r270hf.mp4
也可以理解为水平翻转后逆时针旋转90°
ffmpeg -i abc.mp4 -vf "transpose=0" abc-trsps0.mp4
等效于
ffmpeg -i abc.mp4 -vf "transpose=1,hflip" r90hf.mp4
直接让右旋2次
ffmpeg -i abc.mp4 -vf "transpose=1,transpose=1" r180.mp4
使用rotate进行旋转,不改变源图像分辨率,背景为黑色。
ffmpeg -i abc.mp4 -vf rotate=PI/4 rotate45.mp4
工作中发现手机拍出来的竖屏视频导出到电脑上播放也是竖屏,但是用各种软件识别出来的确是横屏尺寸(ffmpeg也是),甚是诧异。
后来才发现原来mp4文件有个 rotate
旋转 属性,常规播放器播放的时候能识别这个属性,自动转为竖屏。
这样的话在实际使用中会出现一些问题,比如mp4解复用或者转换为mkv等格式后,这个属性就会丢失,再把这个视频传出去就会变成一下躺下的横屏视频。
于是就在网上搜到了上面旋转视频的命令,感觉好玩就记录一下。
本以为把手机拍出来的这个视频用上面的-vf "transpose=1"
命令右旋一下就好了,结果发现转换后的变成向右躺下的横屏视频了!
原来ffmpeg旋转的时候能识别这个 Rotation
属性,如果Rotation=90
就会认为是竖屏,然后再右旋。
这样的话可以先想办法把这个Rotation
属性去掉,再进行右转90°,即
ffmpeg -i VID_000.mp4 -metadata:s:v rotate="0" -c:v copy -c:a copy r0.mp4
ffmpeg -i r0.mp4 -vf "transpose=1" out.mp4
这样的话,Rotation
属性也没了,变成了真正的竖屏视频了。
-vf "transpose=1"
命令会识别原文件的Rotation
属性,但是转换后的文件是没有这个属性的,所以也可以把这个文件 右旋再左旋,即使用了两次滤波器,可能计算量会大那么一丢丢。
ffmpeg -i VID_000.mp4 -vf "transpose=1,transpose=2" out.mp4
rotate
旋转 属性,一般为90°(正常竖拍)或者270°(手机倒着拍)。播放器播放时会识别rotate
属性就行相应旋转显示。ffmpeg -i input -metadata:s:v rotate="90" -c:v copy -c:a copy out.mp4
可以设置视频的rotate
旋转 属性,只影响播放显示效果,不改变实际尺寸,此命令可以不重编码音视频。ffmpeg -vf
会使用视频过滤器 切切实实地 旋转或者翻转视频图像,这个环节会重编码视频。此过滤器同样适用于普通图片文件处理。