mVideoRenderer(对解码好的视频进行格式转换,android使用的格式为RGB565)
mISuce(重绘图层)
mQueue(event事件队列)
4.2》stagefright运行时的Audio部分抽象流程如下:
设置mUri的路径
启动mQueue,创建一个线程来运行 threadEntry(命名为TimedEventQueue,这个线程就是event调度器)
打开mUri所指定的文件的头部,则会根据类型选择不同的分离器(如MPEG4Extractor)
使用 MPEG4Extractor对MP4进行音视频轨道的分离,并返回MPEG4Source类型的视频轨道给mVideoTrack
根据 mVideoTrack中的编码类型来选择,avc的编码类型会选择CDecoder,并返回给mVideoSource,并设置mVideoSource中的mSource为mVideoTrack
插入onVideoEvent到Queue中,开始解码播放
通过mVideoSource对象来读取解析好的视频buffer
如果解析好的buffer还没到时间戳同步的时刻,则推迟到下一作
mVideoRenderer为空,则进行初始化(如果不使用 OMX会将mVideoRenderer设置为AwesomeLocalRenderer)
通过mVideoRenderer对象将解析好的视频buffer转换成RGB565格式,并发给display模块进行图像绘制
将onVideoEvent重新插入event调度器来循环
4.3》数据由源到最终解码后的流程如下:
URI,FD
|
DataSource
|
MediaExtractor
|
mVideoTrack mAudioTrack//音视频数据流
|
mVideoSource mAudioSource//音视频
| |
mVideoBuffer mAudioPlayer
说明:
设置DataSource,数据源可以两种URI和FD。URI可以,rtsp://等。FD是一个本地文件描述符,能过FD,可以找到对应的文件。
由DataSource生成MediaExtractor。通过sp<MediaExtractor> extractor =
MediaExtractor::Create(dataSource);来实现。
MediaExtractor::Create(dataSource)会根据不同的数据内容创建不同的数据读取对象。
通过调用setVideoSource由MediaExtractor分解生成音频数据流(mAudioTrack)和视频数据流(mVideoTrack)。
onPrepareAsyncEvent()如果DataSource是URL的话,根据地址获取数据,并开始缓冲,直到获取到mVideoTrack和
mAudioTrack。mVideoTrack和mAudioTrack通过调用initVideoDecoder()和
initAudioDecoder()来生成
mVideoSource和mAudioSource这两个音视频。然后调用postBufferingEvent_l()提交事件开启缓冲。
数据缓冲的执行函数是onBufferingUpdate()。缓冲区有足够的数据可以播放时,调用play_l()开始播放。play_l()中关键是
调用了postVideoEvent_l(),提交了
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-50196-4.html
盯住日本动态
太棒了
衣服什么的