如何在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中传输两次(缺陷) ï¼Œå¹¶ä¸”需要协调组件之间的通信问题。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-03-23
翻译《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中传输两次”的缺陷。下面wo们探讨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]组件。

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