你好

省流:用 ffmpeg -i video.mp4 output.mp4 处理一下就可以了

什么玩意?这就完了?

事情也不是很复杂:安卓拍摄的视频会附带带有rotation的Side data在视频的Meta data中——也就是也就是说安卓拍的视频可能自带了旋转信息。

可以做个实验测试一下,使用 ffmpeg -i video.mp4 -hide_banner 查看一个安卓手机拍摄的竖屏视频的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2024-11-08T09:05:46.000000Z
com.android.version: 13
com.android.capture.fps: 60.000000
Duration: 00:00:20.32, start: 0.000000, bitrate: 10410 kb/s
Stream #0:0[0x1](eng): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709), 1920x1080, 10002 kb/s, 60.02 fps, 59.94 tbr, 90k tbn (default)
Metadata:
creation_time : 2024-11-08T09:05:46.000000Z
handler_name : VideoHandle
vendor_id : [0][0][0][0]
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 256 kb/s (default)
Metadata:
creation_time : 2024-11-08T09:05:46.000000Z
handler_name : SoundHandle
vendor_id : [0][0][0][0]

目光放到视频流信息这里,其中可以看见是视频流的信息,里面有视频分辨率和视频的旋转信息:

1
2
3
4
5
6
7
Stream #0:0[0x1](eng): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709), 1920x1080, 10002 kb/s, 60.02 fps, 59.94 tbr, 90k tbn (default)
Metadata:
creation_time : 2024-11-08T09:05:46.000000Z
handler_name : VideoHandle
vendor_id : [0][0][0][0]
Side data:
displaymatrix: rotation of -90.00 degrees

注意看这个视频流的分辨率——1920x1080?这不是横屏的分辨率吗,怎么回事呢?答案在底下的 Side data 里面的 displaymatrix: rotation of -90.00 degress 这里。

——旋转 90 度!!!

在播放器读取到这样的 Side data 之后播放视频的时候就会自动旋转 90 度,变成1080x1920——也就是播放时所看到的竖屏。

原来如此原来如此。

原来什么啊?所以为什么x264处理视频会旋转呢?

因为x264 疑似 直接丢了旋转的信息(做过实验但是我忘了结果,感兴趣可以自己试试)。而如果你使用 ffmpeg 就不会发生这样的事——ffmpeg会自动检测旋转信息然后在对视频处理的时候默默帮你旋转然后消去旋转信息。

所以解决办法就有了,让ffmpeg先处理把视频的旋转信息消掉,然后再让x264处理就行了。

虽然看起来有些笨,但是暂时是没想到别的简单的方法了。