stagefright简介

上传人:第*** 文档编号:32828756 上传时间:2018-02-12 格式:DOCX 页数:5 大小:18.43KB
返回 下载 相关 举报
stagefright简介_第1页
第1页 / 共5页
stagefright简介_第2页
第2页 / 共5页
stagefright简介_第3页
第3页 / 共5页
stagefright简介_第4页
第4页 / 共5页
stagefright简介_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《stagefright简介》由会员分享,可在线阅读,更多相关《stagefright简介(5页珍藏版)》请在金锄头文库上搜索。

1、1、 StageFright 介绍Android froyo 版本多媒体引擎做了变动,新添加了 stagefright 框架,并且默认情况android 选择 stagefright,并没有完全抛弃 opencore,主要是做了一个 OMX 层,仅仅是对 opencore 的 omx-component 部分做了引用。stagefright 是在 MediaPlayerService 这一层加入的,和 opencore 是并列的。 Stagefright 在 Android 中是以 shared library 的形式存在(libstagefright.so),其中的 module - Awe

2、somePlayer 可用来播放 video/audio。 AwesomePlayer 提供许多 API,可以让上层的应用程序(Java/JNI)来调用。2、 StageFright 数据流封装2.1由数据源 DataSource 生成 MediaExtractor。通过 MediaExtractor:Create(dataSource)来 实现。Create 方法通过两步来生成相应的 MediaExtractor(MediaExtractor.cpp):通过 dataSource-sniff 来探测数据类型生成相应的 Extractor:if (!strcasecmp(mime, MEDIA

3、_MIMETYPE_CONTAINER_MPEG4)| !strcasecmp(mime, audio/mp4) return new MPEG4Extractor(source); else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG) return new MP3Extractor(source, meta); else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)| !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB) return new

4、AMRExtractor(source); else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_WAV) return new WAVExtractor(source); else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_OGG) return new OggExtractor(source); else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MATROSKA) return new MatroskaExtractor(source)

5、; else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG2TS) return new MPEG2TSExtractor(source);2.2把音视频轨道分离,生成 mVideoTrack 和 mAudioTrack 两个 MediaSource。代码如下(AwesomePlayer.cpp):if (!haveVideo & !strncasecmp(mime, video/, 6) setVideoSource(extractor-getTrack(i);haveVideo = true; else if (!haveAudio

6、 & !strncasecmp(mime, audio/, 6) setAudioSource(extractor-getTrack(i);haveAudio = true;2.3得到的这两个 MediaSource,只具有 parser 功能,没有 decode 功能。还需要对这两个 MediaSource 做进一步的包装,获取了两个 MediaSource(具有 parse 和 decode 功能):mVideoSource = OMXCodec:Create(mClient.interface(), mVideoTrack-getFormat(),false, / createEncod

7、ermVideoTrack,NULL, flags);mAudioSource = OMXCodec:Create(mClient.interface(), mAudioTrack-getFormat(),false, / createEncodermAudioTrack);当调用 MediaSource.start()方法后,它的内部就会开始从数据源获取数据并解析,等到缓冲区满后便停止。在 AwesomePlayer 里就可以调用 MediaSource 的 read 方法读取解码后的数据。对于 mVideoSource 来说,读取的数据:mVideoSource-read(&mVideoB

8、uffer, &options)交给显示模块进行渲染,mVideoRenderer-render(mVideoBuffer);对 mAudioSource 来说,用 mAudioPlayer 对 mAudioSource 进行封装,然后由mAudioPlayer 负责读取数据和播放控制。3、 StageFright 的 Decode经过“ 数据流的封装” 得到的两个 MediaSource,其实是两个 OMXCodec。AwesomePlayer和 mAudioPlayer 都是从 MediaSource 中得到数据进行播放。AwesomePlayer 得到的是最终需要渲染的原始视频数据,而

9、mAudioPlayer 读取的是最终需 要播放的原始音频数据。也就是说,从 OMXCodec 中读到的数据已经是原始数据了。OMXCodec 是怎么把数据源经过 parse、decode 两步以后转化成原始数据的。从OMXCodec:Create 这个构造方法开始,它的参数:IOMX &omx 指的是一个 OMXNodeInstance 对象的实例。MetaData meta 这个参数由 MediaSource.getFormat 获取得到。这个对象的主要成员就是一个 KeyedVector mItems,里面存放了一些代表 MediaSource 格式信息的名值对。bool createE

10、ncoder 指明这个 OMXCodec 是编码还是解码。 MediaSource source 是一个 MediaExtractor。char *matchComponentName 指定一种 Codec 用于生成这个 OMXCodec。先使用 findMatchingCodecs 寻找对应的 Codec,找到以后为当前 IOMX 分配节点并注册事件监听 器:omx-allocateNode(componentName, observer, &node)。最后,把 IOMX 封装进一个 OMXCodec:sp codec = new OMXCodec(omx, node, quirks,cr

11、eateEncoder, mime, componentName,source);这样就得到了 OMXCodec。AwesomePlayer 中得到这个 OMXCodec 后,首先调用 mVideoSource-start()进行初始化。 OMXCodec 初始化主要是做两件事:向 OpenMAX 发送开始命令。mOMX-sendCommand(mNode, OMX_CommandStateSet, OMX_StateIdle)调用 allocateBuffers()分配两个缓冲区,存放在 Vector mPortBuffers2中,分别用于输入和输出。AwesomePlayer 开始播放后,

12、通过 mVideoSource-read(&mVideoBuffer, &options)读取数据。mVideoSource-read(&mVideoBuffer, &options)具体是调用 OMXCodec.read 来读取数据。而 OMXCodec.read 主要分两步来实现数据的读取:通过调用 drainInputBuffers()对 mPortBufferskPortIndexInput进行填充,这一步完成 parse。由 OpenMAX 从数据源把 demux 后的数据读取到输入缓冲区,作为 OpenMAX 的输入。通过 fillOutputBuffers()对 mPortBuf

13、ferskPortIndexOutput进行填充,这一步完成 decode。由 OpenMAX 对输入缓冲区中的数据进行解码,然后把解码后可以显示的视频数据输出到输出缓冲区。AwesomePlayer 通过 mVideoRenderer-render(mVideoBuffer)对经过 parse 和 decode 处理的数据进行渲染。一个 mVideoRenderer 其实就是一个包装了 IOMXRenderer 的AwesomeRemoteRenderer:mVideoRenderer = new AwesomeRemoteRenderer(mClient.interface()-creat

14、eRenderer(mISurface, component,(OMX_COLOR_FORMATTYPE)format,decodedWidth, decodedHeight,mVideoWidth, mVideoHeight,rotationDegrees);4、 StageFright 处理流程Audioplayer 为 AwesomePlayer 的成员,audioplayer 通过 callback 来驱动数据的获取,awesomeplayer 则是通过 videoevent 来驱动。二者有个共性,就是数据的获取都抽象成mSource-Read()来完成,且 read 内部把 pars

15、er 和 dec 绑在一起。 Stagefright AV 同步部分,audio 完全是 callback 驱动数据流,video 部分在 onVideoEvent 里会获取 audio 的时间戳,是传统的 AV 时间戳 做同步。4.1AwesomePlayer 的 Video 主要有以下几个成员:mVideoSource(解码视频)mVideoTrack(从多媒体文件中读取视频数据)mVideoRenderer(对解码好的视频进行格式转换,android 使用的格式为 RGB565)mISurface(重绘图层)mQueue(event 事件队列) 4.2stagefright 运行时的 A

16、udio 部分抽象流程如下:设置 mUri 的路径启动 mQueue,创建一个线程来运行 threadEntry(命名为 TimedEventQueue,这个线程就是 event 调度器)打开 mUri 所指定的文件的头部,则会根据类型选择不同的分离器(如MPEG4Extractor)使用 MPEG4Extractor 对 MP4 进行音视频轨道的分离,并返回 MPEG4Source 类型的视频轨道给 mVideoTrack根据 mVideoTrack 中的编码类型来选择解码器,avc 的编码类型会选择 AVCDecoder,并返回给 mVideoSource,并设置 mVideoSource 中的 mSource 为 mVideoTrack插入 onVideoEvent 到 Queue 中,开始解码播放通过 mVideoSou

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号