由
于stagefright和openmax运行在两个不同的进程上,所以他们之间的通讯要经过openBinder进行处理,对openBinder这一
块还没有了解,所以恕stagefright和openmax之间的通信不能做分析,还有就是本小结不考虑音频这一块,假设视频为MP4封装的AVC编码
文件.
最早看的是opencore,但opencore兼顾了多平台的移植性而过于复杂,后来就改看stagefright了,stagefright使
用的OMX IL为opencore中的代码........所以我蛮期待google什么时候能重写一个OMX IL框架来全面替代opencore
先简单的看一下stagefright是怎么工作的,
stagefright使用event来进行驱动,event调度器和event运行在同一个线程中,播放器向队列插入event来驱动整个解码流
程,event调度器的工作抽象流程如下:
1.检测队列是否为空,为空则等待event的插入
2.获取队列中的第一个event
3.计
算event所要求的delay time后进行延时操作
4.将event从队列中剔除后执行该event
event调度器通过不断循
环这样的过程来进行调度,在具体代码中还会根据特殊情况进而改变调度过程,目前event事件有如下几种:
1.onVideoEvent
2.onStreamDone
3.onBufferingUpdate
4.onCheckAudioStatus
5.onPrepareAsyncEvent
stagefright的播放器类为AwesomePlayer,这个类主要有以下几个成员(排除Audio部分):
1.mVideoSource(解
码视频)
2.mVideoTrack(从多媒体文件中读取视频数据)
3.mVideoRenderer(对解码好的视频进行格式转
换,android使用的格式为RGB565)
4.mISurface(重绘图层)
5.mQueue(event事件队列)
stagefright运行时的抽象流程如下:
下面以一个mp4文件(avc编码)来分析AwesomePlayer的抽象工作流程(排除
Audio部分)
1)设置mUri为xxxx.MP4的绝对路径
2)启动mQueue,这会创建一个线程来运行
threadEntry,并命名为TimedEventQueue,这个线程就是event调度器
3)打开mUri所指定的文
件,xxxx.MP4文件的头部为(....ftypisom....),则会选择MPEG4Extractor来作为分离器
4)使用
MPEG4Extractor对MP4进行音视频轨道的分离,并返回MPEG4Source类型的视频轨道给mVideoTrack
5)根据
mVideoTrack中的编码类型来选择解码器,avc的编码类型会选择AVCDecoder
(假设不使用OMX),并返回给mVideoSource,并设置mVideoSource中的mSource为mVideoTrack
6)插
入onVideoEvent到Queue中,开始解码播放
7)通过mVideoSource对象来读取解析好的视频buffer
8)如
果解析好的buffer还没到AV时间戳同步的时刻,则推迟到下一轮操作
9)mVideoRenderer为空,则进行初始化,如果不使用
OMX会将mVideoRenderer设置为AwesomeLocalRenderer
10)通过mVideoRenderer对象将解析好
的视频buffer转换成RGB565格式并发给display模块进行图像绘制
11)将onVideoEvent重新插入event调度器来
循环
OMX IL作为底层解码部件的集合层,为上层多媒体框架提供了统一的接口,在Android2.2的stagefright中,
stagefright使用的是opencore中的OMX IL实现,使用该OMX
IL框架需要将mVideoSource设置为OMXCodec类,OMX IL层的对外接口主要有以下几种:
1)stagefright使用
OMX_MasterInit初始化OMX框架,加载component
2)stagefright使用
OMX_MasterGetHandle匹配OMX中的component,匹配成功则返回OMX_HANDLETYPE用于OMXCodec与
component之间进行通信
3)OMXCodec使用OMX_SendCommand来设置component的状态,操作
component的port
4)OMXCodec使用EventHandler通知OMXCodec的Command执行结果
5)OMXCodec
使用OMX_GetParameter和OMX_SetParameter来获取和设置component的属性参数
6)OMXCodec使用
OMX_UseBuffer设置compoment使用的buffer为OMXCodec分配的buffer
7)OMXCodec使用
OMX_EmptyThisBuffer传递未解码的buffer给component,用于解码
8)OMXCodec使用
OMX_FillThisBuffer传递空的bffer给component用于存储解码后的帧
9)compoment使用
EmptyBufferDone通知OMXCodec已完成inputport buffer的读取
10)compoment使用
FillBufferDone通知OMXCodec已完成outputport buffer的填充
初始化流程如下:
OMX component的数据主要通过port来进行交互,port分为input和output ,
port通过和OMXCodec共享buffer来进行编解码,如下图:
buffer的处理主要由以下4个命令来进行驱动:
OMXCodec使用
OMX_EmptyThisBuffer传递未解码的buffer给component,component收到该命令后会读取input port
buffer中的数据,将其组装成帧进行解码,读取buffer中的数据完成后会调用EmptyBufferDone通知OMXCodec
compoment
使用EmptyBufferDone通知OMXCodec已完成inputport buffer的读取,
OMXCodec收到该命令后会通过mVideoTrack读取新的视频buffer到input
port的buffer中,并调用OMX_EmptyThisBuffer通知component
OMXCodec使用
OMX_FillThisBuffer传递空的bffer给component用于存储解码后的帧,component收到该命令后将解码好的帧数据复制
到该buffer上,然后调用FillBufferDone通知OMXCodec
compoment
使用FillBufferDone通知OMXCodec已完成outputport buffer的填充,
OMXCodec收到该命令后将解码好的帧传递给mISurface进行图像绘制,绘制完毕后使用OMX_FillThisBuffer通知
component有空的buffer可填充
抽象图如下:
OMX IL中的解码分成了两个部分,以AVC的解码为例:
1)使用AssemblePartialFrames将input
port的buffer组装成帧
2)将帧传递给AvcDecoder_OMX进行解码后输出到output port的buffer中
如
下图:
假设input port
buffer中有2个buffer,分别为buffer_1和buffer_2,并且这两个buffer所携带的数据可构成1帧,则
AssemblePartialFrames首先申请一块内存区域tmp_buffer_1,将buffer_1的有效数据拷贝到
tmp_buffer_1上,然后再申请一块内存区域tmp_buffer_2,申请完后第一步将tmp_buffer_1的数据拷贝到自身的前半部,第
二步将buffer_2的有效数据拷贝到后半部来组合成为1帧.
组合完成后将tmp_buffer_2和output
port的buffer交给AvcDecoder_OMX进行解码, AvcDecoder_OMX将解码后的帧数据拷贝到output port
buffer中.
分享到:
相关推荐
【Stagefright与OMX详解】 在Android操作系统中,Stagefright和OpenMAX(OMX)是两个关键的多媒体处理框架,它们对于处理音频、视频等媒体内容起着至关重要的作用。下面将对这两个概念进行深入解析。 1. **Stage...
《Android多媒体框架Stagefright深度解析》 在Android系统中,多媒体处理是一个至关重要的部分,它涉及音频、视频的播放、编码以及解码等众多功能。Stagefright是Android平台上的核心多媒体框架,负责处理多媒体...
在Android系统中,多媒体处理是不可或缺的一部分,而Stagefright和OpenCore是两个重要的多媒体框架。它们各自在不同的时期和环境下承担着Android平台上的多媒体播放和处理任务。下面将详细对比这两个框架,以便理解...
Android多媒体Stagefright框架是Android系统中用于处理多媒体内容的一个重要框架,其关键组件包括OMX、AwesomePlayer以及处理AAC音频等多媒体数据的模块。本文档将详细解析Stagefright框架的基本结构、工作原理以及...
### Android系统下Stagefright Player框架详解 #### Stagefright在Android多媒体架构中的核心地位 在深入探讨Stagefright框架之前,我们先了解其在Android多媒体架构中的位置。Stagefright是Google为Android平台...
Stagefright 框架 2.0.pdf Stagefright 框架是 Android 多媒体框架的一部分,自 Android 2.0 开始作为OpenCORE 的替代品。Stagefright 框架具有简洁的架构,易于维护,但仍然保留了跨平台的移植性。 Stagefright...
Stagefright 框架 2.0 Stagefright 框架 2.0 是 Android 中的多媒体框架,自 Android 2.0 开始引入,以逐渐取代 OpenCORE。Stagefright 框架具有简洁的架构和良好的跨平台移植性,是 Android 多媒体架构中的重要...
stageFright_OpenMax系统.doc,对Android2.3的 stagefright框架和openMAx的深入分析
### StageFright_Video Playback流程详解 在深入探讨StageFright框架中视频播放流程之前,有必要先简要介绍StageFright。StageFright是Android系统中用于多媒体处理的核心框架,负责音频、视频的编码和解码工作。它...
本文将深入探讨Stagefright处理HLS的缓冲机制,同时也会涉及到Android Binder机制,它是Android系统中进程间通信(IPC)的核心部分。 一、Android Binder机制 Android Binder是Android系统服务和应用程序之间进行...
了解stagefright的缓存机制,对于android多媒体的移动开发有很大帮助
StageFright是Android系统中的一个多媒体框架,它存在一个名为"StageFright"的安全漏洞,这个漏洞与处理RM(RealMedia)文件有关,可能会导致远程代码执行或系统安全风险。本文档将深入解析RM视频文件格式,以帮助...
StageFright通过OpenMAX框架来实现其编解码功能,尤其依赖于OpenCORE的OMX(OpenMAX IL)实现。 #### 初始化过程 StageFright和OpenMAX的交互始于`OMX_Init`调用。`OMX_Init`函数初始化OpenMAX环境,创建必要的...
在深入探讨StageFright与OMXVideoDecoder之间的视频Buffer传输流程之前,我们先来了解两个核心概念:StageFright和OMX(OpenMAX)。 **StageFright**是Android系统中的多媒体框架,负责处理音频、视频等媒体格式的...
《Stagefright AwesomePlayer框架详解》 Android多媒体框架在早期主要依赖于OpenCORE,这是一个功能强大但结构复杂的框架,适合跨平台移植。然而,自Android 2.0开始,Google引入了一个更为简洁高效的框架——Stage...
stagefright opencore对比 mp4范例stagefright opencore对比 mp4范例stagefright opencore对比 mp4范例stagefright opencore对比 mp4范例
- **与OpenCore的关系**:StageFright并没有完全替代OpenCore,而是通过构建一个OMX(OpenMAX)层来与OpenCore进行交互。这一层主要引用了OpenCore的OMX组件部分。 - **架构位置**:StageFright位于...