您的位置:首页 > 移动开发 > Android开发

如何在Android中整合立体声音效处理库|OpenCORE|组件间隧道通信方式|应用层与OpenCORE沟通

2011-06-16 17:24 309 查看

翻译《Integrating Audio Effects in Android》

一、概述

   随着移动手持设备的广泛应用,用户对手机的音效要求越来越高。可惜因为手机处理能力的限制,往往不能满足用户对音质的要求。这对这种情况下面提出一种为手机添加立体声的音效
的解决方案。

     openCORE是Android的媒体功能实现的关键
,使开发人员能在此之上构建新的应用,它支持音视频播放、音视频录制、可视电话、博客、实时流媒体服务等。



openCORE使用了引擎驱动,节点框架(Node architecture)
,它由C++语言编写。引擎接收应用层的命令来负责管理和控制整个节点链路(Node graph)
。节点和节点链路的选取和搭建取决于播放参数(音视频剪辑的类型、操作等)。

 

通常的节点链路的搭建为以下模式:

输入节点(Source Node) --- 多个处理节点(Decoder Node)或 Codecs ... --- 输出节点(Sink Node)

 

openCORE还包括一个开放源码的多媒体编解码器,视频(如MPEG- 4,H.264),音频(如MP3,AAC,MIDI), 以及语音(如AMRNB,AMR WB)等。OpenCORE 使用的OpenMAX IL
框架将编解码器整合到openCORE框架中
。 OpenMAX IL API在嵌入式移动领域非常有名,它为组件的移植提供了一个的抽象层。

二、将音效处理整合到Android多媒体播放器

主要的两大步骤:

1.在openCORE的后端添加对音效库的支持

2.在媒体播放器(应用层)中添加对openCORE中音效处理节点(Node)的支持

 

第一步、在openCORE的后端添加对音效库的支持

OpenCORE为编解码器的整合提供了多种可选方法,分别可以作为:OpenMAX编解码节点、OpenMAX IL组件、多媒体I/O
。多媒体I/O常常用在输出显示。在音效处理整合中可行的方法是将音效库“包装为”OpenMAX编解码节点 或 OpenMAX IL组件。以下分别说明这两种方式的用法。

1.OpenMAX编解码节点

这种方法要求播放器引擎支持多种音频效果。每个效果组件被实现为一个节点Node,当数据路链路创建后由引擎创建这些节点。数据流在路链的节点Node间“流动”,并有引擎进行管理和控制。同时,随着多个效果节点Node产生的线程增加,系统负荷也会增重。



 

2.OpenMAX IL组件

音频效果组件所处理的数据为解码组件的输出,所以最好将[音频解码]和[音效处理]组件放在同一层
。OpenCORE采用Open MAX IL为所有的Codec提供API操作,OpenCORE这种特性使得整合音效处理变得非常直接了当。



 

音效处理库被编译成为静态库
,并用ARM的RVCT优化后,用OpenMAX IL 包装起来构成了OpenCORE组成部分。

[音频解码]和[音效处理]组件是通过API的IL层进行通信的,OMX音频解码节点Node在OpenCORE充当客户端的角色,这个Node节点负责创建、删除、数据流动
,并将控制命令、数据Buffer传入到音频解码器中,音频解码器处理了数据Buffer后又将它们返回给Node节点。Node节点又将数据Buffer传递给[音效处理]组件。

这种方法与第一种方法相比带来系统负荷较小,但不是说它没有系统负荷。流数据要在两个组件和Node中传输两次(缺陷)
,并且需要协调组件之间的通信问题。

 

[音频解码Audio Codec]和[音效处理Audio Effects]组件间使用隧道通信方式

      默认情况下,OpenMAX IL中的OMX音频解码节点Node只支持非隧道通信方式。存在“流数据要在两个组件和Node中传输两次”的缺陷。下面我们探讨OpenMAX 的隧道通信方式,它能进一步优化系统性能和更好地利用资源。

      隧道通信方式带来的好处是,两个组件之间的通信不须经过Node,而是之间直接进行数据沟通
。对于OMX音频解码节点Node节点来说,它只需要知道[音频解码]组件的输入端口和[音效处理]组件的输出端口即可。

      与非隧道方式相比,非隧道方式需要同时管理[音频解码]和[音效处理]组件的创建和删除,这需要改动OpenCORE框架
来支持。而隧道方式将[音频解码]和[音效处理]组件连接起来就能将OpenCORE的改动降到最小





 

第二步、在媒体播放器(应用层)中添加对openCORE中音效处理节点(Node)的支持

      因为是否启用音效,取决于用户的选择,所以必须在应用层提供开启/关闭音效的控制。Android应用程序都是用Java语言编写,运行

在Dalvik虚拟机上。Java应用层通过JNI方式调用底层的OpenCORE的Native C++代码




      应用层的音效控制命令,先通过多层(JNI层、适配层)到达Media Framework,然后再经过OpenCORE Framework最终到达OMX Decoder Node,再利用OpenMax API进一步控制
[音效处理Audio Effects]组件。

 

      我们需要扩展Android的媒体播放器,增加立体音效的支持。要做到这点,需要为Android的媒体播放器类(android.media.MediaPlayer)原有的API扩展一个支持立体音效的方法,应用程序可以通过传递参数到这个方法实现底层操作。同时,需要更新JNI层接口
,以支持应用层到底层调用的转换。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息