昨天qim遇到一个非常诡异的bug。
步骤:
1 横屏拍摄一段视频后,添加滤镜马赛克,发表,然后把发表的视频保存到本地。
2 启动拍摄,选择上一步保存的视频,发表。
问题:
1 发表成功后,本地缓存的视频被拉伸放大。
2 其他客户端看到的这个视频,下半部黑屏,显然是横的视频没有被翻转90度。
3 本地清缓存,重新下载的视频,下半部黑屏,跟其他客户端看到的一致。
报过来这个bug的时候,我第一反应是不是视频导出的代码有问题,因为前段时间也遇到过类似的问题。自从产品上了本地视频可编辑这个功能后,就像开启了潘多拉魔盒,各种奇怪的bug不断。因为本地视频可能来自不同的设备,可能被各种编辑软件编辑过,其比例,参数,格式等等千差万别,而日迹只支持竖屏,这意味着很多的视频在发表的时候都需要处理一次,把横的竖过来,并且统一尺寸。
本地尝试重现:
模拟器无法重现。
真机调试,可以重现。
这就非常蛋疼了。
再仔细分析现象,发现问题没这么简单:
1 发布端第一次看到的视频仅仅被拉伸,清缓存后的视频却是下半部分黑屏
2 同一个视频,用模拟器发没问题,真机有问题
3 其他的横屏视频没问题
首先第一个问题,我怀疑是不是本地预览视频跟最后上传服务器的视频不是同一个,因为“看"的和“传”的不是同一个。于是视频抓出来看看,装了itools,捣鼓捣鼓了半天,终于把视频抓出来了。但是问题更加诡异了。
视频处理后生成的本地文件:
上图可以看到,用系统默认播放器播放,视频被拉伸。用其他播放器mpv,mplayerx等,可以正常观看。
清缓存,从服务器把刚上传的文件拉下来:
上图看到,下载后的视频,两种播放器都是下半部分黑屏。
第一个现象,我怀疑是导出视频时,视频信息被写乱了。或者导出的视频和上传视频不是同一个
第二个现象,无法解释,难道视频在上传时(复制时),视频信息被修改了??
第一个问题确认,导出的视频在上传前需要经过压缩处理,所以这一步,拉伸的视频被裁剪了?
第二个问题,视频尺寸在压缩时会被修改,从320x569 变成 640x960。
问题原因找到了,但是解决方案呢? 没有,让我们再总结一下这个bug诡异的地方:
1 模拟器没问题,真机有问题。 (排除了ios版本问题)
2 本地导出的视频,quicktime播放有问题,其他播放器播放没问题。
3 视频压缩后被裁剪,其他同样尺寸的视频却无此问题。
模拟器没问题,真机有问题,为毛? 难道苹果的模拟器有问题
其他播放器看视频没问题,就系统播放器有问题? 难道系统的默认播放参数与其他播放器不一样 ?
专门看了一下系统播放器是否有什么参数可调,又变现一个奇怪的现象:
有问题的视频,其”实际大小“的选项是灰色的
一般的视频,其”实际大小”是可以点击的。
不过也不是必然,有些正常播放的视频,其”实际大小“也是disable。
我又比较了一下,正常与不正常的视频的参数,发现一个问题:
正常视频
被拉伸视频
其clean Aperture width 与实际大小不相符,问题应该处在这里
压缩后的视频
压缩后的视频其clean Aperture width和width又是一致的
猜测这里的问题是,导出的视频clean Aperture width与实际width不一致,所以在系统播放器里,视频被拉伸了320->568,其他播放器忽略或者纠正了这个问题,所以能正常播放。
然后,系统继续使用错误参数,在视频压缩的时候,被拉伸的视频被裁剪了。
所以问题出在导出视频的时候,参数错了。
上面的推论可以解释现象,但无法解释为什么模拟器是正常的。但问题肯定出在导出这一步,所以我调整参数看看正导出过程到底发生了什么。
这个过程看起来都没问题,但是发现一旦把最后的平移设置为视频的宽度时(320),导出的视频就会拉伸,最后经过测试,取了一个最接近值319.999999。算暂时解决了这个问题。
最后总结一下这个问题的原因:
1 导出视频时,视频的长宽参数有问题,系统播放视频时拉伸了视频。
2 视频压缩时,按照错误的长宽进行了裁剪。
3 模拟器没问题,真机有问题。
最后通过修改精度解决此问题,这是否是因为模拟器的计算精度比真机的计算高度要高,所以能正确导出这个视频 ?待有时间继续研究。