iOS 14 对 mp4 视频很挑剔,网站app mp4视频的播 放异常处理记录。

最近一直在处理视频问题,因为做的几个应用没有提供统一的转码服务,想让上传者自己转码,但在实际上传的过程中,我们发现视频的兼容性真的是个大坑。

如果你想让自己的视频都能支持在电脑端和手机端播放,需要一个标准转码格式,各种参数需要设置足够合适,如果让用户自己转码,总会转出某个平台不兼容的情况。这里只针对完整的视频mp4文件,关于业界通用的流媒体文件切片后的hls 和m3u8 列表文件也可以参照。

正确的转码格式还是参考H.264(MPEG-4/H.264 AVC)视频编码规范来。

针对这些问题,有同事专门整理了格式工厂的转码截图:
https://www.yuque.com/lexgeeker/qwsa3x/zhuan-ma-ruan-jian-shi-yong-shuo-ming

但用户转码软件很奇怪,有各种奇怪的设置会引起一些重复的问题,这里针对这些不同的异常情况记录一下可能设置的不同。

mp4v视频格式在Chrome中只有声音没有画面:

首先遇到的一种奇怪问题,视频在电脑播放器能放的mp4文件,在Chrome浏览器被认作音频了,播放界面是空白的,只有声音没有画面。在edge浏览器又能播放。排查发现这种mp4在Chrome被当做音频,是因为视频编码格式采用mp4v封装的原因。如果想视频变正常,可以转码成h264格式封装的mp4。

隔行扫描模式的直播流和视频文件在iOS 13、14 部分系统中无法播放:

第二种常见的问题是有些视频在安卓和pc浏览器能看,但是在苹果系统的某些版本(比如最新的iOS 14)不能播放 ,播放器打开视频错误。经过排查发现,iOS 14系统升级以后对mp4视频和直播流的视频格式要求很标准。

在其他平台正常,在iOS系统不能播放的视频遇到过两种情况,一种是视频的扫描模式导致的,iOS不能播放的视频有一种情况是视频扫描格式是隔行扫描。如果是隔行扫描的视频在iOS 14里就播放不了,需要把视频扫描模式改成逐行扫描。

除了mp4文件以外,还有一些直播编码器推流的问题。比如刚升级ios14的时候,有些正常的直播突然在ios14的时候直播就突然不能播放了,排查发现也是视频采用的隔行扫描的问题 把编码器的推流格式改为逐行扫描就可正常播放。

视频色彩空间YUV 不是4:2:0 导致ios视频不能播放:

iOS 14不能播放的情况还有原因可能是色彩空间YUV不遵循h264,正确的H264格式视频色彩空间YUV是4:2:0,一般叫420。而很多采集器输出的色彩模式是4:2:2。解决方式还是重新转码,修改成色彩空间YUV问420的。

视频文件上传失败,链接404:

还遇到过一种情况是视频直接播放不了,打开视频文件也是404,这种情况是用户上传没有完成,或者程序没有成功接收用户上传的文件,可以找程序日志排查和查看服务器是不压力大导致视频上传失败了。

视频文件只播放头部几秒或者几分钟,进度条可以读取到全部时长:

还有一些视频上传以后,播放时看有20分钟,但实际上只播放一分钟就停止了。排查一下 基本上是视频文件的头文件出错了,播放器只能解码前几分钟,后面的视频出错了。解决方式也是用源文件重新转码,格式检查一下。

视频文件码率太高,导致播放卡顿:

如果视频让用户自己转码,你还不限制文件大小的话,还会遇到很多用户说视频上传以后播放起来卡顿,排查一下,一般情况是用户上传的文件超级大,一个几分钟的视频文件有1 g以上,反正是清晰度和画面大的离谱,视频码率动辄25m起。经常是把摄像机和硬盘播放的文件原画直接上传到服务器了,如果自己手机网看着不卡才是奇怪的事情。同样需要转码降低视频码率。

如何看视频编码规范? 视频的编码格式我都是通过VLC 播放器查看的。一般视频用vlc都能打开,如果遇到vlc也打不开的mp4文件,那问题应该需要分析文件本身了。。

关于用户沟通解释:

其实处理这些视频问题很好解决,只要不是源文件有问题,按照统一模式转码就能解决,如果你没有服务器的转码服务,那么就要让用户去自己转码,本身一个很简单的事情,你跟他说需要重新转码,把转码参数告诉他,最多给他提供一个转码软件和操作截图就行。

但我发现与这些用户沟通还是挺难的,就是他们要么不想干,要么不会干。这都好说,最怕的是那些不懂还不听的人,那就是非要让我给他解释,为什么他在本地播放器能播放,为什么放了网上就不行,我就是说你按照我说的要求重新转码就行了,他可以觉得我是忽悠他,就是不信。还要大量的重复沟通,有时候,我发现有人问你问题不是想请教你得到一个答案,好像是来跟你掰扯和试图说服你的,甚至是想来告诉你怎么做到才是他认为正确的。

云转码,视频文件疑难杂症最好的解决方式:

这就难办了,最好的办法是什么?就是上云端转码,可是上云端转码也不是说上就能上的,要有转码服务器或者放到云端,对于临时性项目,这比投资还是挺高的。对于长期项目,又需要采购设备和报预算,程序员开发。以至于有开发同事跟我说,自己想解决这个问题却申请不到转码资源。

所以最低的成本是给用户指导,然后他本地转码,充分利用客户端分布式计算的优势。

了解 h.264 编码规范可以参照这个博客:
https://www.cnblogs.com/renhui/p/7019424.html

非通用设备的视频播放问题:

还遇到过在一些安卓的广告机器,那种大手机的,用来做演示手机app的,定制的安卓机器。app中播放不了视频,最后排查是这个机器系统不兼容https协议的视频,需要改成http格式的视频网址才能播放。

—更新—

MP4文件被上传程序错误转换成了图片文件,大小变小:

最近又遇到一个更奇怪的问题,有个.MP4视频,有用户先是上传不上去,上传上去了又遇到播放不了,查了一下是422 格式,然后找人给按照h.264 编码格式转码以后命名成XXX.MP4 上传到了网站文章里,结果用户说还不行,都快崩溃了,浏览器换了好几个,文件上传试了好几遍才成功,结果还是不能播放。

我给看了一下,上传以后的文件只有172KB 大小,一看视频文件就不正常,开始我不了解,下载172kb的文件以后把文件改名.jpg 直接就是一张图片,我以为他直接把图片改名成MP4了,后来一看,上传的源文件是140M结果传完变成了172kb,我估计是程序把MP4文件当作图片处理了。对于超出配置的文件做了容错处理,直接当作图片进行的转存和压缩,结果还成功了,因为是个意外文件,直接后缀名都没改,还是MP4。

大写后缀的MP4 被压缩成jpg 文件了的解决办法就是直接改上传程序的支持文件列表,对于大写的文件后缀做支持就可以了,当然最好的情况是上传的文件能检测文件类型再做处理,以前哪些php 文件上传漏洞就是这么搞得。

集中上传文件把服务器带宽挤爆:

因为是个活动报名上传视频的应用,开放了一个月,一直在解决转码上传不了的问题,到了活动上传截止日期时,突然视频文件服务带宽被挤爆,因为大家都赶到最后几天疯狂上传,这个时候就是考验服务器内存和带宽能力了。我们的活动就遇到这个问题,对准备的服务器内存和带宽发起了检验,按照预估量预估肯定不够,上传失败检测到大量的失败,临时扩容和迁移服务器到存储集群上才扛住人肉的密集攻击。

如果你做这种视频活动,本地小服务器,没有扩容的环境很有可能只能躺着等人们都失望了以后离开,如果用云服务和有机房可以临时扩容快速应对这个临时的流量洪峰和大文件上传洪峰。

集中上传文件,让转码服务器队列过载而挂起:

我们其实是有一个使用的转码集群的,之前一直是在部分应用中测试视频上传以自动转码服务的。测试一段时间以后,为了减轻人工处理视频咨询的压力,逐步放开了主要业务的视频自动转码服务,本身转码集群预估和检测到平时业务量是足够的,但刚全量放开上传视频自动转码没几天,客户反应上传的视频一直提示转码中,虽然不影响发布使用,但客户不知道,视频发布后一直转码中不敢发布出去,就都反应过来了。

程序一排查,虹软的转码集群服务器直接卡住了,卡住的原因是突然转码队列大幅增加,转码集群超载了,据说是一个客户一下午就上传了接近5000个视频,排队中的还有3000多个。只有把队列重新运行了一次才正常。这种服务器集群的卡住如果没有监控能检测实时的业务异常,那等客户都反应上来很有可能已经崩溃了。。

应对服务异常的报警还是很需要的,一旦上新业务还是最好能配套上自动的业务异常预警比较好。

视频缩略图抽帧失败:

之前我曾经试用过百度云转码(bae时代)和优酷接口上传视频(合并到阿里以前和以后)都遇到过抽帧的视频图片问题,就是有些上传到平台以后批量转码的视频会出现抽取视频缩略图失败或者是视频缩略图抽取的没有合适的问题。

抽帧失败一般是需要程序重新抽帧或者排查失败原因,这个可以直接按日志排查。

如果是固定时段抽帧无法匹配合适的缩略图,一般两种解决方式,进行全视频抽帧,然后让用户自己选择合适的抽帧图片,现在的段视频剪辑软件一般都是这样的操作方式。

如果自己有深度学习能力,可以考虑采取机器学习智能抽帧,可以针对自己的业务实际和视频特点针对性的训练一个抽帧模型,进行智能抽帧。这个自行根据业务特点训练模型,发布实施即可。其实技术含量还是挺高的。

除了处理视频上传以外,图片上传也遇到过一些各种莫名奇妙的问题。图片拉伸,缩放不正常,网页布局超出屏幕范围,不按比例缩放,手机上看正常,放到app和网页图片方向是转向的或者是倒的,转存的图片不能查看等等,有些需要图片格式进行转换,有些需要根据图片按照方向信息进行旋转,还有些问题需要在前端展示时做兼容处理,下次了解一些图片的处理方式,再记录一下。

发表评论

电子邮件地址不会被公开。 必填项已用*标注