编码格式导致Android中MediaPlayer播放视频失败

由于项目需求,要在Android中实现APP启动播放视频的功能。

想起来前段时间装过的Any.Do Cal就有启动视频。实现这个功能不难,主要是有点担心稳定性和可靠性,于是参考了一下Cal(反编译简单分析了一下其代码),发现实现起来比较简单,用的是比较常规的MediaPlayer+TextureView,播放的是mp4视频文件。

很快就参考网上的资料写好了代码,播放Any.Do Cal中的视频并在多台机器上测试通过。但是之后在项目中换了UI提供的视频后,发现视频根本没有被播放,而是直接调用了播放完成的回调。查看在LogCat中输出的信息,大概就是解码失败的意思。

在网上找了一通,都说是MediaPlayer主要支持MP4的H.264编码格式,其他格式可能不支持。但是看了一下,这两个视频都是H.264的,一个能播放另一个却不能播放。和其他人讨论了下,自己也在寻找解决方法。

因为以前用了多年的Windows,但工作后换成了Mac,想到Mac上很可能会有兼容问题(很多时候Mac上输出的文件都不能被Windows兼容),另外自己更熟悉Windows上的很多软件,特地切换到Windows虚拟机环境下。

发现Android的MediaPlayer不能播放的视频,在Windows自带的MediaPlayer上也不能播放,时长是对的,但画面是黑的。然后就下载了我熟悉的视频格式转换软件“格式工厂”,尝试转换了好多次,UI那边也帮忙试着转换了好几种格式的视频,但是要么转换出错,要么还是不能播放。

之后又下载了其他几个视频转换软件,也尝试了很多中转换输出格式,最后发现使用“魔影工厂”转换的通用MP4格式可以被播放,但是一直想不明白为什么。详细查看了这几个视频的参数,也找了一些MP4视频编码相关的文章,还有视频转换软件中的参数设置,最后终于发现了问题。

因为现在的手机分辨率都比较高,为了保证比较清晰的显示效果,UI给的是1248x2000的高分辨率视频。在魔影工厂中,MP4格式默认的编码方式不是H.264,而是MPEG-4。H.264格式压缩率更高,生成的文件更小,同时解码需要的运算量也会更大。用H.264格式转换出622x1000的低分辨率视频,是可以播放的,MPEG-4格式的高分辨率也可以播放,但是H.264格式的高分辨率视频,可能是解码对性能要求很高,所以Android的MediaPlayer就没法播放了。