[StageFright分析] StageFright的总体架构

[StageFright分析] StageFright的总体架构

StageFright在Android多媒体架构中的位置

Andriod2.3之后多媒体架构默认使用StageFright。StageFright是一个开放的多媒体编解码引擎,拥有良好的架构和可扩张性。要支持新的媒体格式,只需要编写响应的 解析插件,原有架构就支持新格式的解码。

StageFright架构,也很容易上手和使用。JAVA层直接调用播放器为MediaPlayer[JAVA]即可,其他的都不用关心。Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的。如果要扩展StageFright,那就需要在Native层遨游一番啦。在Native层也有一个播放器MediaPlayer[Native], JAVA层和Native层的播放器通过JNI_Andriod_Media_MediaPlayer.cpp联系在一起。Native层的MediaPlayer本质上调用的是StageFrightPlayer类,StageFrightPlayer类是AwesomePlayer类的包装类。StageFright在Android多媒体架构的位置,如图1。

[StageFright分析] StageFright的总体架构_第1张图片


图1 StageFright在Android多媒体架构的位置

StageFright的解码流程图

StageFrightPlayer类是AwesomePlayer类的一个包装类。AwesomePlayer类实现了音视频数据的读取、解析、解码和渲染全流程。如图2左侧所示,AwesomePlayer类解码的流程为:

1) 使用DataSource接口,设置数据源,可以使本地地址(文件描述符)或网络地址(http://,rtsp://);

2) 媒体格式嗅探器(Sniffer),确定媒体的MIME,由此生成相应格式的MediaExtractor;

3) MediaExtractor分解生成音频数据流(mAudioTrack)和视频数据流(mVideoTrack),这两个具有音视频解析功能;

4) 在initVideoDecoder()接口中,又MIME生成两个mVideoSource和mAudioSource这两个音视频解码器,并调用postBufferingEvent_l()开启缓冲

5) 执行缓冲函数onBufferingUpdate(),缓冲满足后,调用play_l()开始播放;

6) play_l()中关键是调用了postVideoEvent_l(),提交了mVideoEvent,该事件被调用函数onVideoEvent()处理;

7) onVideoEvent()函数调用mVideoSource->read()读取一帧数据到mVideoBuffer;

8) mVideoRenderer->render(mVideoBuffer)将视频帧渲染到显示系统。

[StageFright分析] StageFright的总体架构_第2张图片


图2 AwesomePlayer类解码的流程

StageFright的解码扩展

由于项目需要,电视机顶盒上用的Android4.0系统,需要支持IPTV播放功能,节目源视频为FLV格式,音频为MP3格式。对于这样需求,如何扩展StageFright以支持这种需求呢?IPTV的数据流和本地数据流或RTSP数据流区别在于,数据的下载部分可能不是标准协议,故原有需要扩展XXXMediaExtracotr,XXXParser, XXXReader来完成数据的下载和解析。FLV解码部分不用扩展啦,原来就支持哦。这种方式扩展之后,支持IPTV_FLV码流,容易引起一些问题包括:
1) 保证读到音视频数据后才能开始解码,光读到文件头是不能开始解码的;
2) 网络非常不稳定,数据时有时无,没有足够的数据的时候,保证不会出错;
3) 网络顺畅时,数据接收过多,缓冲区要保证不会爆掉,缓冲区不足时,下载过程要暂停;

IPTV_FLV解码过程,如图2右边所示。

从LOG过程来看看,解码流程吧

I/AwesomePlayer( 1601): SetDataSource ===========================
I/AwesomePlayer( 1601): SetDataSource URL: FLV_IPTV://
I/AwesomePlayer( 1601): SetDataSource CREATE: IptvDataSource
I/AwesomePlayer( 1601): SetDataSource CREATE: FLVExtractor

I/OMXCodec( 1601): OMXCodec::CreateDecoder ===========================
I/OMXCodec( 1601): CreateDecoder MIME:video/avc
I/OMXCodec( 1601): CreateDecoder MatchingCodecs:AVCDecoder
I/AvcDecapi( 1601): init done status 0
I/OMXCodec( 1601): CreateDecoder SoftwareCodec:AVCDecoder


I/OMXCodec( 1601): OMXCodec6:1rea26D2coder:==== ==================
I/OMXCodec( 1601): CreateDecoder MIME:audio/mpeg
I/OMXCodec( 1601): CreateDecoder MatchingCodecs:MP3Decoder
I/OMXCodec( 1601): CreateDecoder MatchingCodecs:OMX.google.mp3.decoder
I/OMXCodec( 1601): CreateDecoder SoftwareCodec:MP3Decoder


你可能感兴趣的:(Android4.0,flv,flv,stagefright,iptv,awesomeplayer)