永发信息网

如何在Android中整合立体声音效处理库

答案:2  悬赏:20  手机版
解决时间 2021-01-17 18:17
  • 提问者网友:缘字诀
  • 2021-01-17 12:52
如何在Android中整合立体声音效处理库
最佳答案
  • 五星知识达人网友:毛毛
  • 2021-01-17 14:11
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楼网友:白昼之月
  • 2021-01-17 15:26
翻译《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层接口 ,以支持应用层到底层调用的转换。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯