需求场景
最近编辑发现部分上传的mp4视频无法在ios下播放,在chrome上是正常的。通过搜索一般都是说chrome和safari中request header的"range"字段不同,给出的解决方案都是基于后端语言的,而我们的视频都是直接放在nginx上的,并没有经过后段语言处理。实际情况是部分mp4能正常播放,部分mp4不行,更大的可能性在于mp4本身的问题。
解决方案
通过ffmpeg查看能播放的mp4和不能播放的mp4的视频信息ffprobe test.mp4
,两者相比较,可以发现两者有个参数不同,一个是yuv420p,一个是yuv444p,能播放的是yuv420p,不能播放的是yuv444p,通过格式工厂等工具将mp4重新转格式之后,确实可以播放了。
后续探索
可是为什么yuv420p是可以的yuv444p是不行的,safari是不兼容yuv444p么?后来通过搜索,终于发现国外的一位的老哥,也遇到同样的问题,并给出了ffmpeg下yuv444p转yuv420p的方案。ffmpeg -i a.mp4 -vcodec libx264 -acodec copy -vprofile main -pix_fmt yuv420p a-new.mp4
详见video not playing on Android (chrome) and iOS (safari)
yuv444p转yuv420p
ffmpeg -i [input file] -c:v libx264 -pix_fmt yuv420p [output file]
详见FFMPEG Convert YUV444p to YUV420p
基于ffmpeg的批量转mp4命令行工具
基于ffmpeg的GUI工具
ffmpegGUI, 作者没有提供打包的文件,需要自行编译打包,并且暂不支持批量转换
浏览器兼容最好的mp4要求
h264 yuv420p