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
- 发送kWhatStart消息即可启动player
- 启动Decoder之后是一直polling input buffer
ConfigDecoder流程
- 初始化Decoder ACodec OMX
- 将Output Buffer塞给OMX
- 填充Input Buffer
Input-Output Buffer流程
- 将Input Buffer送给OMX,并再次填充
- 将Output Buffer设置给OMX,并取得解码后的data
- 见解码后的data送给Render做AV同步
完整序列图
完整序列图源码
打开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
- Android-7.0-Nuplayer-启动流程
- android nuplayer reset处理流程
- Android-7.0-Nuplayer概述
- Android-7.0-Nuplayer概述
- NuPlayer reset处理流程
- nuplayer播放流程分析
- NuPlayer的处理流程
- NuPlayer的处理流程
- android Nuplayer RTSP 学习
- android Nuplayer 分析
- android HLS Nuplayer分析
- Android KK NuPlayer
- Android NuPlayer要点详解
- Android NuPlayer播放框架
- Android NuPlayer播放框架
- Nuplayer
- ICS4.0.3创建NuPlayer的处理流程
- NuPlayer从服务端获取应答消息流程
- C# Redis学习系列一:Redis的认识、下载、安装、使用
- Java Web系列:Spring MVC基础
- JavaWeb实现验证码
- VC复选框的使用
- Google揭露SHA-1碰撞,加速数据重删字节对比
- Android-7.0-Nuplayer-启动流程
- JUN ACM
- Android--逐帧动画FrameAnimation
- OpenGL 帧缓冲
- 日拱一卒,功不唐捐
- scala 排序算法 快速排序
- jdbc学习笔记1
- jdbc学习笔记2
- javascript的模块化编程