Android平台OpenMax多媒体引擎介绍
Android应用开发揭秘——实验六

实验六姓名:马征学号:2011303502 班级:14011107一、了解Android多媒体开发1、Open CoreOpen Core是Android多媒体框架的核心所有Android平台的音频、视频的采集以及播放等操作都是通过它来实现。
它也被称为PV Packet VideoPacket Video是一家专门提供多媒体解决方案的公司。
程序员可以通过Open Core方便快速地开发出想要的多媒体应用程序例如录音、播放、回放、视频会议、流媒体播放等等。
可以看出Open Core支持的格式包括MPEG4、、MP3、AAC、AMR、JPG、PNG、GIF等。
Open Core多媒体框架有一套通用可扩展的接口针对第三方的多媒体编码器输入、输出设备等等。
具体功能如下多媒体文件的播放、下载包括3GPPMPEG-AAC和MP3 containers。
流媒体文件的下载、实时播放包括3GPPHTTP和RTSP/RTP。
动态视频和静态图像的编码、解码例如和AVCJPEG。
语音编码格式AMR-NB和AMR-WB。
音乐编码格式MP3AACAAC+。
视频和图像格式3GPPMPEG-4和JPEG。
视频会议基于H324-M标准Open Core是一个多媒体的框架从宏观上来看它主要包含了两大方面的内容PVPlayer提供多媒体播放器的功能完成各种音频Audio、视频Video流的回放Playback功能。
PVAuthor提供媒体流记录的功能完成各种音频、视频流以及静态图像的捕获功能。
Open Core的代码在Android代码的External/Opencore目录中其子目录及其具体功能描述如下Android这里面是一个上层的库它实现了一个为Android使用的音视频采集、播放的接口及DRM数字版权管理的接口实现。
Baselibs包含数据结构和线程安全等内容的底层库。
Codecs_v2音视频的解码器基于OpenMAX的头文件。
AndroidOpencoreOpenMAX学习(2)...

AndroidOpencoreOpenMAX学习(2)...Android Opencore OpenMAX学习(2)文章分类:移动开发数据格式及OMX输入缓冲细节1.1 帧起始代码2 y9 ?* ?6 d* d" N一般不用,H.264可能使用。
1.2 OMX缓冲区8 M3 r; I4 \% ^: f$ G# \三个值得信赖的关键参数nFilledLen 缓冲区长度nTimestamp 缓冲区时间戳1 P& v( w3 A% q9 M' {OMX_BUFFERLAG_ENDOFFRAME 缓冲区结束标志位+ |4 l2 @$ C( X: m! B: p1.3多帧合并输入缓冲一些音频信息,单帧过小(eg ARM),将其合并作为一个缓冲区处理。
( Q$ k0 ^% `9 x P. QnFilledLen为所有帧总长度,nTimestamp指向缓冲区第一帧时间。
1.4部分帧/ @' x |- B& R视频解码单帧过大情况下,可能将单帧拆分后传递给缓冲区。
4 |8 p& A3 }( K2 V& @: j部分帧情况下,只有最后一帧的缓冲区才拥有OMX_BUFFERLAG_ENDOFFRAME。
部分帧缓冲区不会包含两帧信息。
) x' M" S0 Q. B8 \/ R: @. b4 ] 流媒体可能包含多帧。
部分帧的nTimestamp应当相同。
6 n9 {( |' e- T总结:OMX输出缓冲区可能包含——完整多帧% ~! F9 r% t; _# o+ Z——完整单帧——部分帧9 c" ~0 k/ Z# @/ y, |$ J0 `7 a1.5 错误的数据封装多帧的部分帧封装 eg wrong(Frame1+Frame2 part)1.6 Codec配置数据Codec配置缓冲区使用OMX_BUFFERLAG_ENDOFFRAME 和OMX_BUFFERFLAG_CODECCONFIG标志位。
玩转 Android 手机,百科全书

玩转Android 手机,百科全书第一章:了解Android什么是AndroidAndroid是基于Linux内核的软件平台和操作系统,是Google在2007年11月5日公布的手机系统平台,早期由Google开发,后由开放手机联盟(英语:Open Handset Alliance)(Open Handset Alliance)开发。
它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分。
低层以Linux内核工作为基础,只提供基本功能;其他的应用软件则由各公司自行开发,以Java作为编写程序的一部分。
另外,为了推广此技术,Google和其它几十个手机公司建立了开放手机联盟。
Android在未公开之前常被传闻为Google电话或gPhone。
大多传闻认为Google开发的是自己的手机电话产品,而不是一套软件平台。
到了2010年1月,Google始发表自家品牌手机电话的Nexus One。
历史第一台上市的Android 手机开发Google于2005年并购了成立仅22个月的高科技企业Android,展开了短信、手机检索、定位等业务,同时基于Linux的通用平台也进入了开发。
2008 Patrick Brady于Google I/O 演讲“Anatomy & Physiology of an Android”,并提出的Android HAL 架构图。
HAL 以●.so 档的形式存在,可以把Android framework 与Linux kernel 隔开。
公布前的传闻Google的东南亚销售与营运常务董事Richard Kimber 曾说:"At this point in time, we are very focused on the software, not the phone.(目前我们完全专注于软件而非电话)"。
可是Google并未正式否认正在制作电话的传闻,Google可能与一家硬件生产商合作创作Google Phone。
android多媒体框架

媒体层结构
媒体播放器 MIDIFile-Player 功能 主要负责midi音频文件的播放(*.mid、*.midi、 *.smf、*.xmf、*.imi、*.rtttl、*.rtx、*.ota)
Vorbis-Player
主要负责ogg格式的音频文件的播放(*.ogg、 *.oga)
PVPlayer
opencore-端口(Port)
代码实现: pvmi/pvmf/src/pvmf_port_base_impl.cpp pvmi/pvmf/include/pvmf_port_interface.h pvmi/pvmf/include/pvmf_port_base_impl.h
opencore-消息(Msg)
2. 在NodeA调用Send()返回Busy后, PortB会异步的通过调用PortA>ReadyToReceive()函数来通知PortA可以发送消息到PortB(在NodeB调用 DequeueIncomingMsg()函数时, PortB会检查是否需要调用PortA>ReadyToReceive());
负责除以上2种播放器之外的所有媒体的播放
媒体层结构-目录结构
目录名 media/java media/jni media/libmedia 代码描述 存放java层媒体相关代码 媒体层jni接口代码库 媒体层client端代码库
media/libmediaplayers 媒体层server端代码库 ervice media/mediaserver libs/audioflinger libs/surfaceflinger 媒体层服务端应用程序 媒体层audioFlinger代码库 媒体层surfaceFlinger代码库
android 4.0 Stagefright中的OpenMax

status_t OMX::allocateNode(const char *name, const sp<IOMXObserver> &observer, node_id *node) {
Mutex::Autolock autoLock(mLock);
*node = 0; //1.new OMXNodeInstance
OMXNodeInstance *instance = new OMXNodeInstance(this, observer);
OMX_COMPONENTTYPE *handle; OMX_ERRORTYPE err = mMaster->makeComponentInstance(name, &OMXNodeInstance::kCallbacks, instance, &handle); *node = makeNodeID(instance); mDispatchers.add(*node, new CallbackDispatcher(instance)); instance->setHandle(*node, handle); mLiveNodes.add(observer->asBinder(), instance); observer->asBinder()->linkToDeath(this);
String8 name8(name); mPluginByComponentName.add(name8, plugin); } }
三.Component 的创建
1. 创建流程
2.具体实现 sp<MediaSource> OMXCodec::Create(
const sp<IOMX> &omx, const sp<MetaData> &meta, bool createEncoder, const sp<MediaSource> &source, const char *matchComponentName, uint32_t flags, const sp<ANativeWindow> &nativeWindow) { ……. const char *mime; // 获取之前设定了编码算法 // enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC); bool success = meta->findCString(kKeyMIMEType, &mime); CHECK(success);
安卓操作系统简介

简言:Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。
目前,最新版本为Android 2.4 Gingerbread和Android 3.0 Honeycomb。
系统介绍:Android是基于Linux内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统,早期由Google开发,后由开放手持设备联盟(Open Handset Alliance)开发。
它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分。
底层Linux内核只提供基本功能;其他的应用软件则由各公司自行开发,部分程序以Java编写。
2010年末数据显示,仅正式推出两年的操作系统Android已经超越称霸十年的诺基亚(Nokia)Symbian OS系统,采用Android系统主要手机厂商包括宏达电子(HTC)、三星(SAMSUNG)、摩托罗拉(MOTOROLA)、LG、Sony Ericsson、魅族M9等,使之跃居全球最受欢迎的智能手机平台,Android系统不但应用于智能手机,也在平板电脑市场急速扩张。
系统架构:应用程序:Android以Java为编程语言,使接口到功能,都有层出不穷的变化,其中Activity 等同于J2ME的MIDlet,一个Activity 类(class)负责创建视窗(window),一个活动中的Activity就是在foreground(前景)模式,背景运行的程序叫做Service。
两者之间通过由ServiceConnection和AIDL连结,达到复数程序同时运行的效果。
如果运行中的Activity 全部画面被其他Activity 取代时,该Activity 便被停止(stopped),甚至被系统清除(kill)。
腾讯云游戏多媒体引擎基础功能开发指南说明书

游戏多媒体引擎基础功能开发指南产品⽂档【版权声明】©2013-2023 腾讯云版权所有本⽂档著作权归腾讯云单独所有,未经腾讯云事先书⾯许可,任何主体不得以任何形式复制、修改、抄袭、传播全部或部分本⽂档内容。
【商标声明】及其它腾讯云服务相关的商标均为腾讯云计算(北京)有限责任公司及其关联公司所有。
本⽂档涉及的第三⽅主体的商标,依法由权利⼈所有。
【服务声明】本⽂档意在向客户介绍腾讯云全部或部分产品、服务的当时的整体概况,部分产品、服务的内容可能有所调整。
您所购买的腾讯云产品、服务的种类、服务标准等应由您与腾讯云之间的商业合同约定,除⾮双⽅另有约定,否则,腾讯云对本⽂档内容不做任何明⽰或模式的承诺或保证。
⽂档⽬录基础功能开发指南鉴权密钥实时语⾳⾓⾊设置⾳质选择基础功能开发指南鉴权密钥最近更新时间:2023-04-04 15:36:01为⽅便开发者调试和接⼊腾讯云游戏多媒体引擎产品,这⾥向您介绍适⽤于所有平台的鉴权密钥相关技术⽂档。
语⾳密钥后台部署腾讯云游戏多媒体引擎提供鉴权密钥,⽤于实时语⾳及离线语⾳的鉴权,此⽂档为后台部署⽅案。
鉴权所⽤到的签名产⽣过程涉及到明⽂、密钥和算法。
明⽂明⽂为以下字段的⽹络序拼接:字段描述类型/⻓度值定义/备注cVer unsigned char(1)版本号,填写数值:1wOpenIDLen unsigned short(2)⽤户的帐号⻓度strOpenID string⽤户的帐号字符dwSdkAppid unsigned short(4)开发者的 SDKappiddwReserved1unsigned int(4)填写数值:0dwExpTime unsigned int(4)过期时刻(当前时间+有效期[单位:秒,建议300秒])dwReserved2unsigned int(4)填写数值:-1或者 0xFFFFFFFFdwReserved3unsigned int(4)填写数值:0wRoomIDLen unsigned short(2)⽤户要进⼊的房间号码⻓度,如果是离线语⾳服务,请填写0 strRoomID string⽤户要进⼊的房间号码字符密钥腾讯云 GME 控制台获取相关权限密钥。
android数据及多媒体模块day06.

MediaRecorder使用 为了增加对录制音视频的支持,Android系统提供了一个MediaRecordediaRecorder的各个状态的介绍: Initial:初始状态,当使用new()方法创建一个MediaRecorder对象或者调用了reset()方法时,该 MediaRecorder对象处于Initial状态。在设定视频源或者音频源之后将转换为Initialized状态。另外,在除 Released状态外的其它状态通过调用reset()方法都可以使MediaRecorder进入该状态。 Initialized:已初始化状态,可以通过在Initial状态调用setAudioSource()或setVideoSource()方法进入该状态。 在这个状态可以通过setOutputFormat()方法设置输出格式,此时MediaRecorder转换为 DataSourceConfigured状态。另外,通过reset()方法进入Initial状态。 DataSourceConfigured:数据源配置状态,这期间可以设定编码方式、输出文件、屏幕旋转、预览显示等 等。可以在Initialized状态通过setOutputFormat()方法进入该状态。另外,可以通过reset()方法回到Initial状 态,或者通过prepare()方法到达Prepared状态。 Prepared:就绪状态,在DataSourceConfigured状态通过prepare()方法进入该状态。在这个状态可以通过 start()进入录制状态。另外,可以通过reset()方法回到Initialized状态。 Recording:录制状态,可以在Prepared状态通过调用start()方法进入该状态。另外,它可以通过stop()方法 或reset()方法回到Initial状态。 Released:释放状态(官方文档给出的词叫做Idle state 空闲状态),可以通过在Initial状态调用release()方 法来进入这个状态,这时将会释放所有和MediaRecorder对象绑定的资源。 Error:错误状态,当错误发生的时候进入这个状态,它可以通过reset()方法进入Initial状态。 提示:与MediaPlayer相似使用MediaRecorder录音录像时需要严格遵守状态图说明中的函数调用先后顺序, 在不同的状态调用不同的函数,否则会出现异常。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OpenMax是一个多媒体应用程序的框架标准。
其中,OpenMax IL(集成层)技术规格定义了媒体组件接口,以便在嵌入式器件的流媒体框架中快速集成加速编解码器。
在Android中,OpenMax IL层,通常可以用于多媒体引擎的插件,Android的多媒体引擎OpenCore 和StageFright都可以使用OpenMax作为插件,主要用于编解码(Codec)处理。
在Android的框架层,也定义了由Android封装的OpenMax接口,和标准的接口概念基本相同,但是使用C++类型的接口,并且使用了Android的Binder IPC机制。
Android封装OpenMax的接口被StageFright使用,OpenCore没有使用这个接口,而是使用其他形式对OpenMax IL层接口进行封装。
Android OpenMax的基本层次结构如图18-1所示。
▲图18-1 Android中OpenMax的基本层次结构OpenMax系统的结构1.OpenMax总体层次结构OpenMax是一个多媒体应用程序的框架标准,由NVIDIA公司和Khronos在2006年推出。
OpenMax是无授权费的,跨平台的应用程序接口API,通过使媒体加速组件能够在开发、集成和编程环节中实现跨多操作系统和处理器硬件平台,提供全面的流媒体编解码器和应用程序便携化。
OpenMax的官方网站如下所示:/openmax/OpenMax实际上分成三个层次,自上而下分别是,OpenMax DL(开发层),OpenMax IL(集成层)和OpenMax AL(应用层)。
三个层次的内容分别如下所示。
第一层:OpenMax DL(Development Layer,开发层)OpenMax DL定义了一个API,它是音频、视频和图像功能的集合。
硅供应商能够在一个新的处理器上实现并优化,然后编解码供应商使用它来编写更广泛的编解码器功能。
它包括音频信号的处理功能,如FFT和filter,图像原始处理,如颜色空间转换、视频原始处理,以实现例如MPEG-4、H.264、MP3、AAC和JPEG等编解码器的优化。
第二层:OpenMax IL(Integration Layer,集成层)OpenMax IL作为音频、视频和图像编解码器能与多媒体编解码器交互,并以统一的行为支持组件(例如,资源和皮肤)。
这些编解码器或许是软硬件的混合体,对用户是透明的底层接口应用于嵌入式、移动设备。
它提供了应用程序和媒体框架,透明的。
S编解码器供应商必须写私有的或者封闭的接口,集成进移动设备。
IL的主要目的是使用特征集合为编解码器提供一个系统抽象,为解决多个不同媒体系统之间轻便性的问题。
第三层:OpenMax AL(Appliction Layer,应用层)OpenMax AL API在应用程序和多媒体中间件之间提供了一个标准化接口,多媒体中间件提供服务以实现被期待的API功能。
OpenMax的三个层次如图18-2所示。
OpenMax API将会与处理器一同提供,以使库和编解码器开发者能够高速有效地利用新器件的完整加速潜能,无须担心其底层的硬件结构。
该标准是针对嵌入式设备和移动设备的多媒体软件架构。
在架构底层上为多媒体的编解码和数据处理定义了一套统一的编程接口,对多媒体数据的处理功能进行系统级抽象,为用户屏蔽了底层的细节。
因此,多媒体应用程序和多媒体框架通过OpenMax IL可以以一种统一的方式来使用编解码和其他多媒体数据处理功能,具有了跨越软硬件平台的移植性。
提示:在实际的应用中,OpenMax的三个层次中使用较多的是OpenMax IL集成层,由于操作系统到硬件的差异和多媒体应用的差异,OpenMax的DL和AL层使用相对较少。
▲图18-2 OpenMax的三个层次2.OpenMax IL层的结构OpenMax IL目前已经成为了事实上的多媒体框架标准。
嵌入式处理器或者多媒体编解码模块的硬件生产者,通常提供标准的OpenMax IL层的软件接口,这样软件的开发者就可以基于这个层次的标准化接口进行多媒体程序的开发。
OpenMax IL的接口层次结构适中,既不是硬件编解码的接口,也不是应用程序层的接口,因此比较容易实现标准化。
OpenMax IL的层次结构如图18-3所示。
▲图18-3 OpenMax IL的层次结构图18-3中的虚线中的内容是OpenMax IL层的内容,其主要实现了OpenMax IL中的各个组件(Component)。
对下层,OpenMax IL可以调用OpenMax DL层的接口,也可以直接调用各种Codec实现。
对上层,OpenMax IL可以给OpenMax AL 层等框架层(Middleware)调用,也可以给应用程序直接调用。
OpenMax IL主要内容如下所示。
客户端(Client):OpenMax IL的调用者组件(Component):OpenMax IL的单元,每一个组件实现一种功能端口(Port):组件的输入输出接口隧道化(Tunneled):让两个组件直接连接的方式OpenMax IL的基本运作过程如图18-4所示。
▲图18-4 OpenMax IL的基本运作过程如图18-4所示,OpenMAL IL的客户端,通过调用四个OpenMAL IL组件,实现了一个功能。
四个组件分别是Source组件、Host组件、Accelerator组件和Sink组件。
Source组件只有一个输出端口;而Host组件有一个输入端口和一个输出端口;Accelerator组件具有一个输入端口,调用了硬件的编解码器,加速主要体现在这个环节上。
Accelerator组件和Sink组件通过私有通讯方式在内部进行连接,没有经过明确的组件端口。
OpenMAL IL在使用的时候,其数据流也有不同的处理方式:既可以经由客户端,也可以不经由客户端。
图18-4中,Source组件到Host组件的数据流就是经过客户端的;而Host组件到Accelerator 组件的数据流就没有经过客户端,使用了隧道化的方式;Accelerator组件和Sink组件甚至可以使用私有的通讯方式。
OpenMax Core是辅助各个组件运行的部分,它通常需要完成各个组件的初始化等工作,在真正运行过程中,重点的是各个OpenMax IL的组件,OpenMax Core不是重点,也不是标准。
OpenMAL IL的组件是OpenMax IL实现的核心内容,一个组件以输入、输出端口为接口,端口可以被连接到另一个组件上。
外部对组件可以发送命令,还进行设置/获取参数、配置等内容。
组件的端口可以包含缓冲区(Buffer)的队列。
组件的处理的核心内容是:通过输入端口消耗Buffer,通过输出端口填充Buffer,由此多组件相联接可以构成流式的处理。
OpenMAL IL中一个组件的结构如图18-5所示。
▲图18-5 OpenMAL IL中一个组件的结构组件的功能和其定义的端口类型密切相关,通常情况下:只有一个输出端口的,为Source组件;只有一个输入端口的,为Sink组件;有多个输入端口,一个输出端口的为Mux组件;有一个输入端口,多个输出端口的为DeMux组件;输入输出端口各一个组件的为中间处理环节,这是最常见的组件。
端口具体支持的数据也有不同的类型。
例如,对于一个输入、输出端口各一个组件,其输入端口使用MP3格式的数据,输出端口使用PCM格式的数据,那么这个组件就是一个MP3解码组件。
隧道化(Tunneled)是一个关于组件连接方式的概念。
通过隧道化可以将不同的组件的一个输入端口和一个输出端口连接到一起,在这种情况下,两个组件的处理过程合并,共同处理。
尤其对于单输入和单输出的组件,两个组件将作为类似一个使用。
3.Android中OpenMax的使用情况Android系统的一些部分对OpenMax IL层进行使用,基本使用的是标准OpenMax IL层的接口,只是进行了简单的封装。
标准的OpenMax IL实现很容易以插件的形式加入到Android系统中。
Android的多媒体引擎OpenCore和StageFright都可以使用OpenMax作为多媒体编解码的插件,只是没有直接使用OpenMax IL层提供的纯C接口,而是对其进行了一定的封装。
在Android2.x版本之后,Android的框架层也对OpenMax IL层的接口进行了封装定义,甚至使用Android中的Binder IPC机制。
Stagefright使用了这个层次的接口,OpenCore没有使用。
提示:OpenCore使用OpenMax IL层作为编解码插件在前,Android框架层封装OpenMax接口在后面的版本中才引入。
Android OpenMax实现的内容Android中使用的主要是OpenMax的编解码功能。
虽然OpenMax也可以生成输入、输出、文件解析—构建等组件,但是在各个系统(不仅是Android)中使用的最多的还是编解码组件。
媒体的输入、输出环节和系统的关系很大,引入OpenMax标准比较麻烦;文件解析—构建环节一般不需要使用硬件加速。
编解码组件也是最能体现硬件加速的环节,因此最常使用。
在Android中实现OpenMax IL层和标准的OpenMax IL层的方式基本,一般需要实现以下两个环节。
编解码驱动程序:位于Linux内核空间,需要通过Linux内核调用驱动程序,通常使用非标准的驱动程序OpenMax IL层:根据OpenMax IL层的标准头文件实现不同功能的组件Android中还提供了OpenMax的适配层接口(对OpenMax IL的标准组件进行封装适配),它作为Android本地层的接口,可以被Android的多媒体引擎调用。