分享

OpenCore随想

 arm_embed 2012-07-27

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。

这时候测试用例应该能够正确跑起来了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多