在Android上做媒体开发,避免不了对视频数据进行编解码。
软件编解码有FFmpeg。虽然FFmpeg软件编解码兼容性和适应性很好。但是在大部分主流的机器上,解码720p视频已经很勉强了,更不用提更高的分辨率。编码的话要求更高。
所以在移动平台上做视频编解码应当优先使用机器自带的硬件编解码来实现。
Android系统底层的硬件编解码框架是OpenMaxIL。使用这个可以跨的版本最多。从Android2.3以后支持。不过使用难度大。这里不讨论了。
Android从4.1以后提供了MediaCodec这个框架做视频编解码,但是5.0系统以前只提供了java版,5.0以后才能在jni native code使用。
很多情况下视频处理的数据都是放在native code那边处理的,编解码部分也希望在native code里面一起实现。
虽然可以用java 的MediaCodec稍微封装下,然后在jni 里面用c/c++代码里面用jni的交互接口(FindClass、Call...Method 等配合调用)。但是这种方法不仅代码封装性不好,还得频繁的进程native code与jvm的交互,效率不高。而且破坏代码可读和封装。
所以这里提供个4.1以后的系统都能在native code像5.0那样使用MediaCodec的方法,方便c++开发者使用MediaCodec:
<