如何使用FFmpeg修正视频方向,使其分辨率与竖屏视觉显示匹配?
如何使用FFmpeg修正视频方向,使其分辨率与竖屏视觉显示匹配?
兄弟,我完全懂你的困扰!手机竖拍的视频经常会遇到这种元数据和实际分辨率不匹配的问题——大部分手机为了节省录制时的编码资源,会按横屏分辨率(比如1920x1080)录制竖屏内容,然后给视频加一个旋转元数据标记(比如90度),普通播放器会读取这个标记自动旋转显示,但Blender这类专业软件不吃这一套,直接按原始分辨率渲染,就变成横屏了。
你之前用两次转置的办法虽然能凑活,但属于绕路,既浪费编码时间又没必要,下面给你两个更高效的解决方案:
方案1:自动识别旋转元数据(推荐)
FFmpeg有个auto_rotate滤镜,可以自动读取视频的旋转元数据,把视频旋转到正确方向,同时自动调整分辨率为竖屏的1080x1920,完全不用手动指定旋转方向:
ffmpeg -i input.mp4 -vf "auto_rotate" -c:a copy output.mp4
-vf "auto_rotate":自动检测视频的旋转标记,旋转视频到正确视觉方向,并同步修正分辨率-c:a copy:直接复制音频流,不需要重新编码,大幅节省处理时间
方案2:手动指定旋转方向(当自动识别失效时)
如果你的视频旋转元数据异常,auto_rotate没起作用,可以手动指定旋转方向,同时加上setsar=1保证像素比例正常,避免拉伸:
比如你需要顺时针旋转90度来匹配竖屏显示:
ffmpeg -i input.mp4 -vf "transpose=1,setsar=1" -c:a copy output.mp4
transpose=1:代表顺时针旋转90度(对应你手机竖拍的原始旋转需求)setsar=1:设置样本宽高比为1:1,确保视频不会出现拉伸变形- 如果你需要逆时针旋转90度,把
transpose=1改成transpose=2即可
为什么你之前的操作没得到正确分辨率?
你之前单独用transpose=1或transpose=2时,其实是把带旋转元数据的视频又做了一次旋转,相当于把原本靠元数据竖显的视频强行转成了横屏,所以分辨率还是1920x1080。而两次转置的操作相当于绕了一圈,让FFmpeg重新编码时忽略了原始的旋转元数据,但这个过程完全是多余的。
说白了就是手机耍了个“小聪明”——用元数据代替实际旋转来节省资源,结果给专业软件挖了个坑。用上面的两个方案就能直接把视频修正成真正的竖屏分辨率,不管在播放器还是Blender里都能正常显示。
备注:内容来源于stack exchange,提问作者Harry McKenzie




