视频转码后宽高给互换了!教你如何对比两个视频文件

2020-10-31 20:57:06 浏览数 (1)

最近发现有些视频好奇怪,播放的时候,是竖屏 1080x1920的,但从腾讯云点播获取到的文件信息,却是横屏1920x1080的;

源文件见附件

下载到我心爱的MacBook看下,居然发现这个文件又是竖屏1080x1920的了;

其他同事用的是windows,他帮我看了下,发现是横屏1920x1080的,看来有古怪;

这一切的背后,到底是人性的泯灭,还是道德的沦丧?

不好意思,走错片场了,这到底是比尔盖茨错了,还是乔布斯错了呢?

云点播转码分析

听说云点播的转码能力很强,能够修复一些点播文件的异常,试着转码看下;

转个超高清的出来看看,操作步骤参考官网文档

结果出乎意料,转码前的分辨率是横屏1920x1080,转码后的视频却是竖屏1080x1920,看来云点播转码认为乔布斯是对的

但谁能告诉我这是为什么呢?

对比分析

对于写代码的工程师来说,如果一个程序修改之后有问题,前后表现不一致,最好的方式是对比下源代码,看看差异点在哪里。

但一个视频文件如何做对比呢?

我们知道(假装大家都知道),一个视频文件其实是:视频帧组成的视频流(可能是H264格式),音频帧组成的音频流(可能是AAC格式),再把视频流和音频流,以一定的格式打包起来(比如封装格式MP4)

那么我们就可以把文件的各个信息拆出来,用FFmpeg工具里的ffprobe读取出文件信息,对比下

指令如下:

代码语言:javascript复制
ffprobe -show_streams -select_streams 0 -of json -i IMG_6896.mov >> 00.json

同样也对转码后的文件做信息读取,以下是读取出的视频信息,并且用beyond compare做了对比。

左边是源文件,文件信息里记录的的确是横屏1920x1080;

右边是转码后视频,文件信息里记录的的确是竖屏1080x1920;

剔除一些和宽高或播放显示无关的信息,可以发现,左边源文件,比右边转码后文件,多了一个Rotate字段,并且标记为90度。

看来问题是定位到了

真相

原来 iOS 上内置相机应用录制的 mov/mp4 视频会产生一个 Rotation 元数据,表示录制视频时摄像头旋转到了多少角度。其值一般为这四个:0、90、180或270。类似于图片文件的Exif信息中的 Orientation 元数据。

Rotation 元数据用于播放器确定渲染视频的方向;

大部分播放器会读取该字段,播放视频时自动旋转画面,已还原真实内容;

但有的播放器会对其视而不见,导致画面被旋转了;

例如mac下的MPlayerX,以及Windows下的Windows Media Player就不会读取该字段并把画面旋转90度;

1、【事实】文件信息里记录的宽高就是横屏1920x1080,但播放时需要旋转90度,播放应为竖屏1080x1920;

2、【播放】我使用的播放器很幸运地,支持了Rotation元数据;

3、【云点播媒资】云点播读取了文件信息里的宽高,因此原样返回了横屏1920x1080,没毛病;

4、【云点播转码】转码后文件删除了Rotation字段,并且修改宽高为竖屏1080x1920,使得文件可以在更多播放器上正常播放,提高了文件兼容性,点赞;

5、【比尔盖茨】Windows下只读取了文件元数据,原样返回了宽高为横屏1920x1080,无可厚非;

6、【乔布斯】Mac下根据实际播放表现,对用户隐藏了技术细节,直接告知文件是竖屏的,因此显示宽高为1080x1920,好像更人性化点;

0 人点赞