You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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=1transpose=2时,其实是把带旋转元数据的视频又做了一次旋转,相当于把原本靠元数据竖显的视频强行转成了横屏,所以分辨率还是1920x1080。而两次转置的操作相当于绕了一圈,让FFmpeg重新编码时忽略了原始的旋转元数据,但这个过程完全是多余的。

说白了就是手机耍了个“小聪明”——用元数据代替实际旋转来节省资源,结果给专业软件挖了个坑。用上面的两个方案就能直接把视频修正成真正的竖屏分辨率,不管在播放器还是Blender里都能正常显示。

备注:内容来源于stack exchange,提问作者Harry McKenzie

火山引擎 最新活动