提示

返回博客列表

手机竖拍的视频在电脑上横着放?彻底搞懂画面旋转修正(含各播放器兼容性与 EXIF 对照)

手机竖拍的视频在电脑上横着放?彻底搞懂画面旋转修正(含各播放器兼容性与 EXIF 对照)

很多人遇到过这个诡异场景:用手机竖着拍了一段,传到电脑用播放器打开,画面却是横着的,或者人物是歪的、地面朝左。更迷惑的是,同一个文件在手机相册里明明正常,到了电脑/网页/剪辑软件里就转了 90 度。这不是文件损坏,也不是你手机坏了,而是旋转元数据(rotation metadata / display matrix)在作怪。这篇文章把"为什么方向会错""元数据旋转和实际旋转像素的区别""EXIF 方向与视频旋转的差异""不同播放器对旋转的支持差异""怎么修"一次讲透,并给出批量处理脚本。

一、为什么方向会错

手机/摄像机的图像传感器物理上是横的(16:9 或 4:3),但系统知道你是竖握设备的。于是拍摄时它做两件事之一:

  1. 真正把像素转 90 度存进去(少见,占存储且慢);
  2. 更常见的做法:像素照常横着存,额外写一条 rotate=90 的元数据,告诉播放器"播放时请把画面转 90 度再显示"。

绝大多数手机走的是第 2 种。支持这条元数据的播放器(手机相册、VLC、MPV)会正确旋转;而很多老播放器、部分浏览器 <video> 标签、以及不少剪辑软件会直接忽略这条元数据,于是你看到的就是传感器原始的横画面——也就是"歪的"。

二、EXIF 方向 vs 视频旋转元数据(容易混)

照片也有"方向"概念:JPEG 的 EXIF Orientation 标签(1~8)描述相机如何持握。但视频文件里的旋转是另一套机制——它写在视频流的 side_data(display matrix)里,不是 EXIF。很多工具会同时处理两者,但概念上要分清:你修视频方向,动的是视频流的 rotation/displaymatrix,不是 EXIF。

三、先看清文件里写了什么

用 ffprobe 查旋转信息:

ffprobe -v error -select_streams v:0 \
  -show_entries stream=side_data_list -of json input.mp4

如果输出里出现 "rotation": -90displaymatrix(含旋转角度),说明有旋转标记。也可以在 Windows 资源管理器右键属性 → 详细信息里看"宽度/高度"是否和你预期相反(比如你竖拍但文件写着宽 1920 高 1080,说明是横存+旋转标记)。

更省事的一行检测:

ffprobe -v error -select_streams v:0 -show_entries stream=side_data=rotation -of csv=p=0 input.mp4

四、方法一:只改元数据(最快、无损)

如果你确认画面本身已经正了、只是标记写错了(或者反过来标记对了但播放器不读),可以仅调整标记:

# 清零旋转标记(画面实际是正的,标记却写了 90 导致某些播放器又转一次)
ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=0 output.mp4

# 或者明确指定要旋转的角度
ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=90 output.mp4

-c copy 不重编码,瞬间完成。注意:MP4 用的是 rotate 元数据,部分工具读的是写在 stream side_data 里的 displaymatrix;两者要对应,最稳妥的还是下面"真正旋转像素"。

五、方法二:真正旋转像素(兼容所有播放器)

transpose 滤镜把画面转过来:

# 顺时针转 90 度
ffmpeg -i input.mp4 -vf "transpose=1" -c:a copy output.mp4
# 逆时针 90 度
ffmpeg -i input.mp4 -vf "transpose=2" -c:a copy output.mp4
# 转 180 度
ffmpeg -i input.mp4 -vf "transpose=1,transpose=1" -c:a copy output.mp4

transpose 取值含义:0=逆时针90+垂直翻转,1=顺时针90,2=逆时针90,3=顺时针90+垂直翻转。记不住就挨个试,看哪个正。

如果旋转后画面比例不对(出现黑边或被裁),可用 rotate 滤镜做任意角度并填黑边:

ffmpeg -i input.mp4 -vf "rotate=PI/2:fillcolor=black" -c:a copy output.mp4

六、按元数据自动旋转(最省心)

ffmpeg 在走滤镜链时默认会应用 autorotate=1,即自动读取 rotation 元数据并真正旋转像素。所以只要你用滤镜(重编码)而不是 -c copy,它就会自动转正:

# 自动按元数据转正,并控制输出质量
ffmpeg -i input.mp4 -vf "transpose=1" -c:v libx264 -crf 23 -c:a copy output.mp4

如果你不确定该转 90 还是 270,先 ffprobe 看 rotation 值,再选 transpose。

七、不同播放器的兼容性(避坑重点)

环境 是否读 rotate 元数据 建议
手机相册(iOS/安卓) 改元数据即可
VLC / MPV 改元数据即可
老版 Windows 媒体播放器 部分读 建议真正旋转像素
浏览器 <video> 老 Chrome 不读 真正旋转像素
剪辑软件(PR/AE) 多数读 导入前可先转像素
微信/社交平台上传 不保证 真正旋转像素再传

结论:要给"别人"看、要上传、要进剪辑软件,优先真正旋转像素;只在自己可控的播放器看,改元数据就够了。

八、硬件/快速旋转(不重编码的另类)

部分封装和播放链路支持在显示层旋转(GPU 旋转),不影响存储。但存档目的还是要落盘成旋转后的像素,否则换设备又歪。

九、批量修正一整个目录

for f in *.mp4; do
  # 先探测 rotate 值(简单版:假设都是 90)
  ffmpeg -i "$f" -vf "transpose=1" -c:v libx264 -crf 23 -c:a copy "fixed_$f"
done

更稳妥的做法是先写脚本 ffprobe 每个文件拿到 rotation,再决定转多少度,避免一刀切转错方向。

十、常见翻车现场

现象 根因 解法
电脑横放、手机正常 播放器忽略旋转元数据 transpose 真正旋转像素
旋转后画面被裁 比例/滤镜参数不对 检查 transpose 取值,或加 scale 保比例
只改元数据没效果 目标播放器不读元数据 改实际旋转像素
旋转方向反了 transpose 取值错 换 1/2 或叠加第二次
处理极慢 重编码整段 只旋转必要片段,或接受耗时

十一、常见问题

Q:只改元数据会不会损失画质? 不会,-c copy 零损失,只是加/改一条标记。

Q:为什么浏览器里视频是歪的? 浏览器对 rotate 元数据支持不一,老版 Chrome 直接忽略。彻底解决是真正旋转像素。

Q:竖拍视频旋转后体积变大? 因为重编码了,码率没控制就会变大;加 -crf 23 之类控制即可。

Q:剪辑软件里也是歪的怎么办? 导入前先用 ffmpeg 真正旋转像素,再进剪辑软件。

Q:能不能竖拍直接存成竖的像素? 可以,拍摄 App 一般提供"存为竖屏"选项,或在导出时选竖向分辨率(1080×1920)。

小结

画面方向错 = 旋转元数据作怪。要快且无损就改元数据(但兼容性差),要兼容所有播放器就 transpose 真正旋转像素(需重编码)。批量处理前务必先确认 rotate 值是 90 还是 270,别一刀切转错方向。给外人看/上传/进剪辑,永远选"真正旋转像素"最稳。

想亲手试试?用 VidDown 一键解析下载

粘贴视频链接即可解析,多平台支持、网页端即用;下载桌面客户端解锁海外平台本地解析,开通会员更享不限次下载。

顶部