Android上jni c++使用MediaCodec的方法
在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:
这是编译好的so库以及使用代码和说明:MediaCodec c++
这是从Android5.0的源码里面抽取了MediaCodec so实现的代码,分别在Android4.1 ~ 4.4 源码上编译的so库。所以接口使用和5.0的MediaCodec其实是一样的。
ps:关于那些库的编译步骤,编译时要跟随不同系统版本的源码分别编译一个,因为编译时依赖了系统里面的东西,为了不重新编译整个系统源码,可以从Android模拟器里面把依赖到的so库pull出来,源码只提供头文件,编译时链接pull出来的so库即可。
编译好的库我已经提供出来了,直接下载使用即可。
更多相关文章
- 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
- Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
- Android——控件跟随手指移动
- Eclipse Android(安卓)SDK content Loader一直显示为0%的问题
- [android] 转上传图片到LAMP服务器
- kotlin 实现一个简单 Android(安卓)路由(2)---》rxbus 代替intent
- Android(安卓)去掉系统默认提示音、移除音量调节的进度条、增加
- Android培训班(全世界最便宜,还送6410开发板)
- 大约Android远程监控APP源代码