Android下可以直接使用MediaCodec,它更下一层是OpenMAX,再下一层是MPP。

  Ubuntu下理论应该可以使用OpenMAX,但是个人对OpenMAX也没有任何了解,所以只能直接使用MPP了。

  开始接触RK3399硬解码的时候,服务商提供的资料里面提到gstreamer,就去死转它了,浪费了两星期时间,根本没能把它运行起来,稍微修改了一下代码就编译过去了,但是使用gstreamer却一直失败,但是软解是可以使用的,因为对gstreamer也不熟悉只能放弃,转投Android。

  Android下开发很简单,解码显示都没问题,但是一到使用OpenCV处理帧时就出现了重大问题,1080p的帧处理过程既然要达到100ms,跟踪了一下,发现获取得到的帧光拷贝到OpenCV的Mat就花了10ms,听取别人的建议要使用JNI实现,自己觉得干脆直接回到Ubuntu平台彻底放弃Android。

  分析MediaCodec后,对rockchip提供的MPP库才有了新的理解,解码功能迎刃而解!OpenCV 的C++效率果然高了不少,不到40ms做完相同的处理。

  需要注意

  1、Android下MediaCodec得到的帧,其提示是YUV420 NV21,而直接使用MPP解码得到的帧却是YUV NV12,实际上MediaCodec是错的,硬件解码返回的格式为YUV NV12;

  2、返回帧是1920×1088的,而不是有效的1920×1080,一开始处理帧数据的时候,我就直接取1920×1080×3/2的数据,结果显示怎么都是错误。