4.1》AwesomePlayer的Video主要有以下几个成员:
mVideoSource(解码视频)
mVideoTrack(从多媒体文件中读取视频数据)
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()提交事件开启缓冲。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-50200-4.html
雷不死给了多少钱
#给烊烊520#1128生日评论集体向520万刷起来#护千玺到远方##易烊千玺真的很不错#