现在的位置: 首页 > 综合 > 正文

Android 文件解析->解码->输出 的个人分析

2013年08月19日 ⁄ 综合 ⁄ 共 1700字 ⁄ 字号 评论关闭

花了一个月的时间熟悉Opencore和OpenMax,又花了近半个月,来研究这玩意儿,终于有了一些结论了.在这里记录下来,帮助后来者,更重要的是怕自己以后忘记...

以下分析适用与.3gp文件的播放,Android版本为1.5...

暂时还有几个地方没有弄清楚,一个是Mp4ParserNode如何将parse(解析)后的数据向下交给解码Node,另一个是解码出来的OutputBuffer是如何send到显示输出的地方,这两处,代码中都使用的PVMFPortInterface* 来完成的.如果以后能够完成,我会来补充完整.

 

Android媒体播放部分(尤其是Opencore文件夹下,除了媒体播放,其他部分我也没看过- -)的所有线程(?),都有一种基本的模式,就是schedule或者是commandqueue,每一次功能的调用都会添加一个相应的cmd到commandQueue中,之后在Run()或者xxxxProcess()这样的函数中通过switch...case...的模式,来匹配执行DoXXXX()函数,在将相应的cmd从commandqueue中dequeue.

 

OMX和OpenCore Nodes的规范,我就不再写了,在源码的pdf中有详细的讲解.

 

Android视频软解,是通过将codec_v2/video/dec/或codec_v2/audio/dec/ 集成为codec_v2/omx/omx_xxx下相应的OMX components.然后再将这些components 集成到nodes/pvomxvideodecnode

 

Android文件解析,则是通过将fileformates/<format>/parser/ 封装为相对应的node,如nodes/pvmp4ffparsernode.(Android 1.5虽然在fileformats下提供了名为avi的文件夹,但是并未有对应的node,Android 2.2也是一样,目前暂时还无法估算出自己创建pvaviffparsernode的工作量有多大,但是,应该不小).在pvmf_mp4ffparser_node.cpp中,一个比较重要的参数就是iNodeTrackPortList,在DoRequestPort()中,通过文件格式,获得文件相关信息,以及track的size,再通过RetrieveTrackData()获取到iMediaData,然后将trackportinfo  push_back到iNodeTrackPortList中,然后再由SendTrackData(),将其送出.(Maybe some mistakes here)

 

 

简单,通俗的说,播放流程就是:

启动播放器,系统启动MediaPlayerService线程(下文不做说明的,都是线程),MediaPlayerService创建PVPlayer,PVPlayer创建PlayerDriver,PlayerDriver创建PVPlayerEngine和调用OMX_Init. 在PVPlayerEngine初始化时,会加载.so库中相应的node(通过几个QueryxxxRegistry()方法,获得诸如Recognizer和Decoder的Node);在接受到播放指令后,播放器会做一系列的初始化操作,在setDataSource流程中,会通过PVPlayerEngine::DoQuerySourceFormatType取得相应的fileformat parser node,并调用之,进入文件解析的流程.

 

然后,会执行命令SET_VIDEO_SURFACE和SET_AUDIO_SINK,为视频和声音的输出做准备,这里具体的,也没跟下去.

 

接着,会执行命令PLAYER_PREPARE,PLAYER_SET_LOOP,PLAYER_START,启动解码.解码的流程很直接,向下一路到mp4dec_api.cpp,最后在pvmf_omx_videodec_node.cpp中"send to downstream node".

 

 

抱歉!评论已关闭.