OpenCore随想
这几天在搞一个Android上的项目,其中有一个功能,是要将Android系统录制拍摄的音视频经过编码后,取出来通过网络传输到服务端。
看过Android在Java层的接口,只有MediaRecorder比较靠谱,但是它的输出只能是本地文件(string指定)或者一个FileDescriptor的东西,这个FileDescriptor可以是Socket或者本地文件的句柄,但这都不适合项目的要求,最后只能考虑直接搞Android的多媒体核心Opencore(比较遗憾的是,12月7号发布的Android 2.3已经彻底抛弃OpenCore了,还得重新折腾)。
这几天的收获如下:
1、Opencore的架构:
我这里不出摘录opencore那些系统文档里面的图啊什么的,直接按照我的理解来画:
黄色部分编译出来的库名为libopencore*;绿色部分为omx架构,编译出来的库名为libomx*.
针对2.2的源码,编译出来的库如下:
libopencore_author.so
libopencore_downloadreg.so
libopencore_mp4localreg.so
libopencore_net_support.so
libopencore_rtspreg.so
libopencore_common.so
libopencore_download.so
libopencore_mp4local.so
libopencore_player.so
libopencore_rtsp.so
libomx_aacdec_sharedlibrary.so
libomx_amrenc_sharedlibrary.so
libomx_m4vdec_sharedlibrary.so
libomx_sharedlibrary.so
libomx_amrdec_sharedlibrary.so
libomx_avcdec_sharedlibrary.so
libomx_mp3dec_sharedlibrary.so
注意上述文件中的黑色部分。
其中libopencore_common.so为opencore的公共类库,包含了oscl部分以及opencore的基本函数和数据结构;libopencore_player.so和libopencore_author.so为opencore针对播放和录制的核心引擎以及针对Android系统的媒体适配层库。
而libomx_sharedlibrary.so为omx针对opencore的接口层库,也就是说在每个模拟器上libomx_sharedlibrary.so向外(即opencore)提供的接口应该是一致的。
那么我们可以这样设计:
对于opencore部分(即上述libopencore_common.so libopencore_player.so libopencore_author.so三个库)可以使用我们自己编译出来的版本,而omx部分(以libomx_sharedlibrary.so分界)使用各个手机本身系统提供的库(以及omx插件)。
那么对于我们的问题,我们可以通过定制自己的opencore代码,在opencore中为author加入node节点,将录制并且编码后的数据通过node,通过jni反馈回java层,在java层进行socket传输。
验证:
使用android源码进行编译,输出上述文件,位于:/mydroid/out/target/product/generic/obj/lib(mydroid为android源码根目录);
同时在编译时指定编译test选项:#export BUILD_PV_TEST_APPS=1,将会编译并输出测试文件test_pvauthorengine,位于:/mydroid/out/target/product/generic/system/bin;
将test_pvauthorengine放到某物理设备下,进行执行:./test_pvauthorengine,这时候将会输出:
link_image[1995]: failed to link ./test_pvauthorengine
CANNOT LINK EXECUTABLE
这是因为系统的opencore和自己编译的opencore并不兼容,导致test_pvauthorengine链接的动态库不匹配报错。
接下来,你将自己编译出来的libopencore_common.so libopencore_player.so libopencore_author.so也拷贝到物理设备的执行目录,并且指定系统优先在当前目录查找动态库(执行指令:export LD_LIBRARY_PATH=./),再次执行:./test_pvauthorengine。
这时候测试用例应该能够正确跑起来了。