Android-7.0-Nuplayer-启动流程

来源:互联网 发布:上海人工智能产业园区 编辑:程序博客网 时间:2024/06/02 04:25

Nuplayer为异步架构,随处可见的AMessage看代码着实头大,
以下为个人总结,供大家参考,如有错误不吝赐教。

Nuplayer简介

Android2.3时引入流媒体框架,而流媒体框架的核心是NuPlayer。Android4.0之后HttpLive和RTSP协议开始使用NuPlayer播放器,Android5.0(L版本)之后本地播放也开始使用NuPlayer播放器。

启动Nuplayer

  1. 发送kWhatStart消息即可启动player
  2. 启动Decoder之后是一直polling input buffer

Start流程

ConfigDecoder流程

  1. 初始化Decoder ACodec OMX
  2. 将Output Buffer塞给OMX
  3. 填充Input Buffer

ConfigDecoder流程

Input-Output Buffer流程

  1. 将Input Buffer送给OMX,并再次填充
  2. 将Output Buffer设置给OMX,并取得解码后的data
  3. 见解码后的data送给Render做AV同步

Input-Output Buffer流程

完整序列图

Start流程

完整序列图源码

打开Web Sequence Diagrams网址,直接粘贴进去即可。

Title Start流程participant NuPlayerDriverparticipant NuPlayerparticipant DecoderBaseparticipant Decoderparticipant MediaCodecparticipant ACodecparticipant BaseStateparticipant UninitializedStateparticipant LoadedStateparticipant LoadedToIdleStateparticipant IdleToExecutingStateparticipant ExecutingStateparticipant OMXopt Start    NuPlayerDriver->+NuPlayer: start()        NuPlayer-->NuPlayer: kWhatStart    NuPlayer-->-NuPlayerDriver:    NuPlayer->+NuPlayer: onStart()            NuPlayer->+DecoderBase: setRenderer()            DecoderBase-->DecoderBase: kWhatSetRenderer            DecoderBase-->-NuPlayer:         NuPlayer->NuPlayer: postScanSources()    NuPlayer-->-NuPlayer: kWhatScanSourcesend opt Polling InputBuffer    DecoderBase->+Decoder: onSetRenderer()        loop         Decoder->DecoderBase: onRequestInputBuffers()        DecoderBase->Decoder: doRequestBuffers()        Decoder->Decoder: fetchInputData()        Decoder->Decoder: onInputBufferFetched()        Decoder-->DecoderBase: kWhatRequestInputBuffers        end    Decoder-->-DecoderBase:endopt ConfigDecoder    NuPlayer->+NuPlayer: instantiateDecoder()        NuPlayer->+DecoderBase: init()        DecoderBase-->-NuPlayer:        NuPlayer->+DecoderBase: configure()        DecoderBase-->DecoderBase: kWhatConfigure        DecoderBase-->-NuPlayer:     NuPlayer-->-NuPlayer:    DecoderBase->+Decoder: onConfigure()        Decoder->+MediaCodec: CreateByType()            MediaCodec->MediaCodec: init()            MediaCodec-->MediaCodec: kWhatInit        MediaCodec-->-Decoder:        MediaCodec->+ACodec: initiateAllocateComponent            ACodec-->ACodec:kWhatAllocateComponent        ACodec-->-MediaCodec:         ACodec->+UninitializedState: onAllocateComponent()            UninitializedState->+OMX: allocateNode()            OMX-->-UninitializedState:             UninitializedState->+LoadedState: stateEntered()            LoadedState-->-UninitializedState:         UninitializedState-->-ACodec:         Decoder->+MediaCodec: configure()            MediaCodec-->MediaCodec: kWhatConfigure        MediaCodec-->-Decoder:         MediaCodec->+ACodec:initiateConfigureComponent()            ACodec-->ACodec: kWhatConfigureComponent        ACodec-->-MediaCodec:        ACodec->+LoadedState: onConfigureComponent()        LoadedState->-ACodec: configureCodec()        Decoder->+MediaCodec: setCallback()        MediaCodec-->-Decoder:         Decoder->+MediaCodec: start()            MediaCodec-->MediaCodec: kWhatStart            MediaCodec->+ACodec: initiateStart()                ACodec-->ACodec: kWhatStart            ACodec-->-MediaCodec:        MediaCodec-->-Decoder:    Decoder-->-DecoderBase:    ACodec->+LoadedState: onStart()        LoadedState-->OMX: sendCommand(OMX_StateIdle)        LoadedState->+LoadedToIdleState: stateEntered()            LoadedToIdleState->LoadedToIdleState: allocateBuffers()            LoadedToIdleState->+ACodec: allocateBuffersOnPort()            ACodec-->-LoadedToIdleState:         LoadedToIdleState-->-LoadedState:    LoadedState-->-ACodec:    OMX-->+LoadedToIdleState: OMX_EventCmdComplete        LoadedToIdleState-->OMX: sendCommand(OMX_StateExecuting)        LoadedToIdleState->+IdleToExecutingState: stateEntered()        IdleToExecutingState-->-LoadedToIdleState:    LoadedToIdleState-->-OMX:    OMX-->+IdleToExecutingState: OMX_EventCmdComplete        IdleToExecutingState->+ExecutingState: resume()            ExecutingState->ExecutingState: submitOutputBuffers()            ExecutingState->ExecutingState: submitRegularOutputBuffers            ExecutingState-->OMX: fillBuffer()            ExecutingState-->BaseState: postFillThisBuffer()            IdleToExecutingState->ExecutingState: stateEntered()        ExecutingState-->-IdleToExecutingState:    IdleToExecutingState-->-OMX:endloop InputBuffer    OMX-->+BaseState: omx_message::EMPTY_BUFFER_DONE        BaseState->BaseState: onOMXEmptyBufferDone()        BaseState->BaseState: postFillThisBuffer()        BaseState-->MediaCodec: CodecBase::kWhatFillThisBuffer    BaseState-->-OMX:    MediaCodec->+MediaCodec: onInputBufferAvailable()    MediaCodec-->-Decoder: MediaCodec::CB_INPUT_AVAILABLE    Decoder->+Decoder: handleAnInputBuffer()        Decoder->Decoder: onInputBufferFetched()        Decoder->+MediaCodec: queueInputBuffer()            MediaCodec-->MediaCodec: kWhatQueueInputBuffer        MediaCodec-->-Decoder:    Decoder-->-DecoderBase: onRequestInputBuffers()    MediaCodec->+MediaCodec: onQueueInputBuffer()    MediaCodec-->-BaseState: kWhatInputBufferFilled    BaseState->+BaseState: onInputBufferFilled()    BaseState-->-OMX: emptyBuffer()endloop OutputBuffer    OMX-->+BaseState: omx_message::FILL_BUFFER_DONE        BaseState->BaseState: onOMXEmptyBufferDone()        BaseState-->MediaCodec: CodecBase::kWhatDrainThisBuffer    BaseState-->-OMX:    MediaCodec->+MediaCodec:updateBuffers    MediaCodec->MediaCodec: onOutputBufferAvailable()    MediaCodec-->-Decoder: MediaCodec::CB_OUTPUT_AVAILABLE    Decoder->+Decoder: handleAnOutputBuffer()    Decoder->Decoder: onRenderBuffer()    Decoder->-MediaCodec: renderOutputBufferAndRelease()    MediaCodec-->MediaCodec: kWhatReleaseOutputBuffer    MediaCodec->+MediaCodec: onReleaseOutputBuffer()    MediaCodec-->-BaseState: kWhatOutputBufferDrained    BaseState->+BaseState: onOutputBufferDrained()    BaseState-->-OMX: fillBuffer()end
0 0