haveVideo = true;
} else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) {
setAudioSource(extractor->getTrack(i));
haveAudio = true;
}
2.3》得到的这两个MediaSource,只具有parser功能,没有decode功能。还需要对这两个MediaSource做进一步的包装,获取了两个MediaSource(具有parse和decode功能):
mVideoSource = OMXCodec::Create(
mClient.intece(), mVideoTrack->getFormat(),
false, // createEncoder
mVideoTrack,
NULL, flags);
mAudioSource = OMXCodec::Create(
mClient.intece(), mAudioTrack->getFormat(),
false, // createEncoder
mAudioTrack);
当调用MediaSource.start()方法后,它的内部就会开始从数据源获取数据并解析,等到缓冲区满后便停止。在AwesomePlayer里就可以调用MediaSource的read方法读取解码后的数据。
对于mVideoSource来说,读取的数据:mVideoSource->read(&mVideoBuffer,
&options)交给显示模块进行渲染,mVideoRenderer->render(mVideoBuffer);
对mAudioSource来说,用mAudioPlayer对mAudioSource进行封装,然后由mAudioPlayer负责读取数据和播放控制。
3、 StageFright的Decode
经过“数据流的封装”得到的两个MediaSource,其实是两个OMXCodec。AwesomePlayer和mAudioPlayer都是从
MediaSource中得到数据进行播放。AwesomePlayer得到的是最终需要渲染的原始视频数据,而mAudioPlayer读取的是最终需
要播放的原始音频数据。也就是说,从OMXCodec中读到的数据已经是原始数据了。
OMXCodec是怎么把数据源经过parse、decode两步以后转化成原始数据的。从OMXCodec::Create这个构造方法开始,它的参数:
IOMX &omx指的是一个OMXNodeInstance对象的实例。
MetaData
&meta这个参数由MediaSource.getFormat获取得到。这个对象的主要成员就是一个
KeyedVector<uint32_t, typed_data>
mItems,里面存放了一些代表MediaSource格式信息的名值对。
bool createEncoder指明这个OMXCodec是编码还是解码。
MediaSource &source是一个MediaExtractor。
char *matchComponentName指定一种Codec用于生成这个OMXCodec。
先使用findMatchingCodecs寻找对应的Codec,找到以后为当前IOMX分配节点并注册事件
器:omx->allocateNode(componentName, observer,
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-50196-2.html
留言好多托