原帖地址:

Nuplayer为异步架构,随处可见的AMessage看代码着实头大,

以下为个人总结,供大家参考,如有错误不吝赐教。

Nuplayer简介

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

启动Nuplayer

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

ConfigDecoder流程

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

Input-Output Buffer流程

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

完整序列图

完整序列图源码

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

Title Start流程participant NuPlayerDriver
participant NuPlayer
participant DecoderBase
participant Decoder
participant MediaCodec
participant ACodec
participant BaseState
participant UninitializedState
participant LoadedState
participant LoadedToIdleState
participant IdleToExecutingState
participant ExecutingState
participant OMXopt StartNuPlayerDriver->+NuPlayer: start()NuPlayer-->NuPlayer: kWhatStartNuPlayer-->-NuPlayerDriver:NuPlayer->+NuPlayer: onStart()NuPlayer->+DecoderBase: setRenderer()DecoderBase-->DecoderBase: kWhatSetRendererDecoderBase-->-NuPlayer: NuPlayer->NuPlayer: postScanSources()NuPlayer-->-NuPlayer: kWhatScanSources
end opt Polling InputBufferDecoderBase->+Decoder: onSetRenderer()loop Decoder->DecoderBase: onRequestInputBuffers()DecoderBase->Decoder: doRequestBuffers()Decoder->Decoder: fetchInputData()Decoder->Decoder: onInputBufferFetched()Decoder-->DecoderBase: kWhatRequestInputBuffersendDecoder-->-DecoderBase:
endopt ConfigDecoderNuPlayer->+NuPlayer: instantiateDecoder()NuPlayer->+DecoderBase: init()DecoderBase-->-NuPlayer:NuPlayer->+DecoderBase: configure()DecoderBase-->DecoderBase: kWhatConfigureDecoderBase-->-NuPlayer: NuPlayer-->-NuPlayer:DecoderBase->+Decoder: onConfigure()Decoder->+MediaCodec: CreateByType()MediaCodec->MediaCodec: init()MediaCodec-->MediaCodec: kWhatInitMediaCodec-->-Decoder:MediaCodec->+ACodec: initiateAllocateComponentACodec-->ACodec:kWhatAllocateComponentACodec-->-MediaCodec: ACodec->+UninitializedState: onAllocateComponent()UninitializedState->+OMX: allocateNode()OMX-->-UninitializedState: UninitializedState->+LoadedState: stateEntered()LoadedState-->-UninitializedState: UninitializedState-->-ACodec: Decoder->+MediaCodec: configure()MediaCodec-->MediaCodec: kWhatConfigureMediaCodec-->-Decoder: MediaCodec->+ACodec:initiateConfigureComponent()ACodec-->ACodec: kWhatConfigureComponentACodec-->-MediaCodec:ACodec->+LoadedState: onConfigureComponent()LoadedState->-ACodec: configureCodec()Decoder->+MediaCodec: setCallback()MediaCodec-->-Decoder: Decoder->+MediaCodec: start()MediaCodec-->MediaCodec: kWhatStartMediaCodec->+ACodec: initiateStart()ACodec-->ACodec: kWhatStartACodec-->-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_EventCmdCompleteLoadedToIdleState-->OMX: sendCommand(OMX_StateExecuting)LoadedToIdleState->+IdleToExecutingState: stateEntered()IdleToExecutingState-->-LoadedToIdleState:LoadedToIdleState-->-OMX:OMX-->+IdleToExecutingState: OMX_EventCmdCompleteIdleToExecutingState->+ExecutingState: resume()ExecutingState->ExecutingState: submitOutputBuffers()ExecutingState->ExecutingState: submitRegularOutputBuffersExecutingState-->OMX: fillBuffer()ExecutingState-->BaseState: postFillThisBuffer()IdleToExecutingState->ExecutingState: stateEntered()ExecutingState-->-IdleToExecutingState:IdleToExecutingState-->-OMX:
endloop InputBufferOMX-->+BaseState: omx_message::EMPTY_BUFFER_DONEBaseState->BaseState: onOMXEmptyBufferDone()BaseState->BaseState: postFillThisBuffer()BaseState-->MediaCodec: CodecBase::kWhatFillThisBufferBaseState-->-OMX:MediaCodec->+MediaCodec: onInputBufferAvailable()MediaCodec-->-Decoder: MediaCodec::CB_INPUT_AVAILABLEDecoder->+Decoder: handleAnInputBuffer()Decoder->Decoder: onInputBufferFetched()Decoder->+MediaCodec: queueInputBuffer()MediaCodec-->MediaCodec: kWhatQueueInputBufferMediaCodec-->-Decoder:Decoder-->-DecoderBase: onRequestInputBuffers()MediaCodec->+MediaCodec: onQueueInputBuffer()MediaCodec-->-BaseState: kWhatInputBufferFilledBaseState->+BaseState: onInputBufferFilled()BaseState-->-OMX: emptyBuffer()
endloop OutputBufferOMX-->+BaseState: omx_message::FILL_BUFFER_DONEBaseState->BaseState: onOMXEmptyBufferDone()BaseState-->MediaCodec: CodecBase::kWhatDrainThisBufferBaseState-->-OMX:MediaCodec->+MediaCodec:updateBuffersMediaCodec->MediaCodec: onOutputBufferAvailable()MediaCodec-->-Decoder: MediaCodec::CB_OUTPUT_AVAILABLEDecoder->+Decoder: handleAnOutputBuffer()Decoder->Decoder: onRenderBuffer()Decoder->-MediaCodec: renderOutputBufferAndRelease()MediaCodec-->MediaCodec: kWhatReleaseOutputBufferMediaCodec->+MediaCodec: onReleaseOutputBuffer()MediaCodec-->-BaseState: kWhatOutputBufferDrainedBaseState->+BaseState: onOutputBufferDrained()BaseState-->-OMX: fillBuffer()
end

Android-7.0-Nuplayer-启动流程相关推荐

  1. Android 13.0 SystemUI 启动流程

    1.手机开机后,Android系统首先会创建一个Zygote(核心进程). 2.由Zygote启动SystemServer. 3.SystemServer会启动系统运行所需的众多核心服务和普通服务.以 ...

  2. Android 8.0 Activity启动流程分析

    Activity启动过程中需要注意的一些类: Instrumentation     完成对Application和Activity初始化和生命周期调用的工具类.用来监控系统与应用的交互. Activ ...

  3. Android 10.0 Activity启动详解(二)

    Android 10.0 Activity启动详解(一) 我们在上一篇博客中已经介绍了关于Activity的一些基础概念.这一篇博客我们以Android 10.0的代码来分析Activity的启动流程 ...

  4. 解决unity 打包在Android 8.0上启动出现黑屏问题(Android权限弹窗问题)

    解决unity 打包在Android 8.0上启动出现黑屏问题 本文链接:https://blog.csdn.net/baidu_34248947/article/details/89377983 我 ...

  5. Android 8.0 p2p搜索流程

    #Android 8.0 p2p搜索流程 8.0 wifi p2p整体流程跟其他Android版本相差不大,主要还是多了HIDL一层转换而已 以下是8.0 p2p的搜索流程

  6. Android 7.0 Vold工作流程

    一.Vold工作机制 Vold是Volume Daemon的缩写,它是Android平台中外部存储系统的管控中心,是管理和控制Android平台外部存储设备的后台进程.其功能主要包括:SD卡的插拔事件 ...

  7. Android应用程序进程启动流程

    在学习应用程序进程启动流程前,先要弄清楚系统启动流程,如果有不清楚的同学,建议先看下以前博主的文章: Android系统启动(上篇)_AD钙奶-lalala的博客-CSDN博客 Android系统启动 ...

  8. Android系统完整的启动流程

    Android系统完整的启动过程,从系统层次角度可分为 Linux 系统层.Android 系统服务层.Zygote进程模型三个阶段:从开机到启动 Home Launcher 完成具体的任务细节可分为 ...

  9. android volte功能,Android 8.0 Volte开关流程 HD图标显示

    android 8.0的Volte开关流程.. Volte按钮: vendor/qcom/proprietary/telephont-app/NetworkSetting/src/com/qualco ...

  10. android 4.0模拟器启动不了,Android 4.0 framework源码修改编译,模拟器运行不起来,求助...

    当前位置:编程学习 > wap >> Android 4.0 framework源码修改编译,模拟器运行不起来,求助 我下载编译了android 4.0 ICS的源码,然后能利用编译 ...

最新文章

  1. html中列表的嵌套
  2. python gdbt+fm_GBDT回归的原理及Python实现
  3. 【数据挖掘笔记二】认识数据
  4. msdn画圆弧函数_三角函数常识2020
  5. python exe文件运行依赖环境_python将py代码文件转换为EXE脱离环境运行
  6. python打造社工脚本
  7. POJ 1300 Door Man(欧拉回路的判定)
  8. 简易自动电阻测试仪_开始自动测试您的网站的简单方法
  9. html鼠标悬停文字变颜色,鼠标悬停,文字颜色逐渐改变是怎样实现的??
  10. PADS 导入cadence dsn文件,同步pads layout
  11. 【Android开发经验】Android相关问题的好文章整理——温故而知新,可以为师矣
  12. Kubernetes存储Longhorn
  13. 游戏开发19课 tilemap 创建瓦片
  14. 禹司凤扛鸿蒙炉,琉璃美人煞12人物结局,司凤 璇玑完满,柏麟 副宫主结局大快人心...
  15. 逆向-360逆向writeup
  16. python连乘函数_(Python3) 连加 连乘 代码
  17. 1000行代码徒手写正则表达式引擎【1】--JAVA中正则表达式的使用
  18. 你要知道的测试面试题
  19. 程序员老鸟写sql语句的经验之谈
  20. 使用cookie实现简易的登录计时

热门文章

  1. 【原创】Java移位运算
  2. 检验杜宾 瓦森检验法R语言_2018年9-11月高级计量经济学主要授课内容概要
  3. linux修改max user processes limits
  4. 【微服务直播】60分钟掌握微服务治理之道
  5. Centos6.7安装Apache2.4+Mysql5.6+Apache2.4
  6. strcmp函数使用中的一些细节问题
  7. Hibernate(5)—— 联合主键 、一对一关联关系映射(xml和注解) 和 领域驱动设计...
  8. JVM中也有并发GC,CMS机制
  9. 安全狗云备份爆笑段子~~~如果上天再给我一次机会
  10. Delphi程序结构