最近发现有些视频好奇怪,播放的时候,是竖屏 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,好像更人性化点;