前面介绍 ffmpeg 一些简单视频过滤器,后面分析手机拍出来的竖屏视频为什么是横屏尺寸。
因为某种原因发现ffmpeg处理视频旋转这个特别好玩,记录一下,为了演示效果还特意做了个字母小视频(abc.mp4),后面不贴GIF了,眼快闪瞎啦。
顺时针旋转90°
ffmpeg -i abc.mp4 -vf "transpose=1" abc-r90.mp4
效果
逆时针旋转90°
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
效果
逆时针旋转90°后再水平翻转
ffmpeg -i abc.mp4 -vf "transpose=3" abc-trsps3.mp4
等效于
ffmpeg -i abc.mp4 -vf "transpose=2,hflip" r270hf.mp4
效果
顺时针旋转90°后再水平翻转
也可以理解为水平翻转后逆时针旋转90°
ffmpeg -i abc.mp4 -vf "transpose=0" abc-trsps0.mp4
等效于
ffmpeg -i abc.mp4 -vf "transpose=1,hflip" r90hf.mp4
效果
ffmpeg -i abc.mp4 -vf "transpose=1,transpose=1" r180.mp4
旋转180°
直接让顺时针旋转2次
ffmpeg -i abc.mp4 -vf "transpose=1,transpose=1" r180.mp4
效果
顺时针旋转45°
使用rotate进行旋转,不改变源图像分辨率,背景为黑色。
ffmpeg -i abc.mp4 -vf rotate=PI/4 rotate45.mp4
效果
MP4文件的 rotate 旋转属性
工作中发现手机拍出来的竖屏视频导出到电脑上播放也是竖屏,但是用各种软件识别出来的确是横屏尺寸(ffmpeg也是),甚是诧异。
后来才发现原来mp4文件有个 rotate 旋转 属性,常规播放器播放的时候能识别这个属性,自动转为竖屏。
ffmpeg -i VID_000.mp4 -vf "transpose=1,transpose=2" out.mp4
这样的话在实际使用中会出现一些问题,比如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
总结
手机拍出来的mp4视频无论横着拍还是竖着拍,都是横屏尺寸,(试过几个品牌的安卓机是这样),手机会根据拍摄时角度设置rotate 旋转 属性,一般为90°(正常竖拍)或者270°(手机倒着拍)。播放器播放时会识别rotate 属性就行相应旋转显示。
ffmpeg -i input -metadata:s:v rotate="90" -c:v copy -c:a copy out.mp4可以设置视频的rotate 旋转 属性,只影响播放显示效果,不改变实际尺寸,此命令可以不重编码音视频。
ffmpeg -vf 会使用视频过滤器 切切实实地 旋转或者翻转视频图像,这个环节会重编码视频。此过滤器同样适用于普通图片文件处理