翻译《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层接口 ,以支持应用层到底层调用的转换。

更多相关文章

  1. 【usb存储挂载】android6.0固定usb存储挂载路径
  2. Android(安卓)非技术问题硬知识点整理
  3. android的UI中include、merge和viewstub用法
  4. Android(安卓)桌面组件【app widget】 进阶项目--心情记录器
  5. Android(安卓)分享两个你学习android 平台开发必须碰到的几个知
  6. Android之四大组件(Service的开启与关闭)
  7. Android(安卓)官方架构组件 Navigation 使用详解
  8. 在用户组件中使用自定义标签
  9. Android基础知识巩固系列 Android之四大组件——Service(服务)

随机推荐

  1. android Style属性介绍
  2. Android(安卓)textAppearance的属性设置
  3. android:inputType参数类型说明
  4. Android应用开发——系统自带样式Android
  5. Google的Android设备别名
  6. Android应用开发——系统自带样式Android
  7. android:inputType参数类型说明
  8. Android学习笔记(九):Activity-RelativeLayo
  9. Android应用开发——系统自带样式Android
  10. 【Android】系统自带的主题与样式(theme