原址

Nuplayer简介

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

MediaPlayer基本使用方式

MediaPlayer mp = new MediaPlayer();
mp.setDataSource("/sdcard/test.mp3");
mp.prepare();
mp.start();

程序说明: 
这个例子只是描述了MediaPlayer的基本使用步骤和方式,MediaPlayer还有多种使用方式和方法,并不只局限于例子所介绍的一种。具体来看:

1)如何获得MediaPlayer实例

  • 可以使用直接new的方式:MediaPlayer mp = new MediaPlayer();
  • 也可以使用create的方式,如:MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了

2) 如何设置要播放的文件

MediaPlayer要播放的文件主要包括3个来源

  • a. 用户在应用中事先自带的resource资源,例如:MediaPlayer.create(this, R.raw.test);
  • b. 存储在SD卡或其他文件路径下的媒体文件,例如:mp.setDataSource(“/sdcard/test.mp3”);
  • c. 网络上的媒体文件,例如:mp.setDataSource(“http://www.citynorth.cn/music/confucius.mp3“);

MediaPlayer的setDataSource一共四个方法

  • setDataSource (String path);
  • setDataSource (FileDescriptor fd);
  • setDataSource (Context context, Uri uri);
  • setDataSource (FileDescriptor fd, long offset, long length);

3)对播放器的主要控制方法

  • Android通过控制播放器的状态的方式来控制媒体文件的播放,其中:
  • prepare()和prepareAsync() 提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了
  • start()是真正启动文件播放的方法
  • pause()和stop()比较简单,起到暂停和停止播放的作用
  • seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的
  • release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源
  • reset()可以使播放器从Error状态中恢复过来,重新回到Idle状态

4)设置播放器的监听器

  • MediaPlayer提供了一些设置不同监听器的方法来更好地对播放器的工作状态进行监听,以期及时处理各种情况
  • 如:setOnCompletionListener(MediaPlayer.OnCompletionListener listener),setOnErrorListener(MediaPlayer.OnErrorListener listener)等,设置播放器时需要考虑到播放器可能出现的情况设置好监听和处理逻辑,以保持播放器的健壮性

Nuplayer

在实现上NuPlayer和Awesomeplayer不同,NuPlayer基于StagefrightPlayer的基础类构建,利用了更底层的ALooper/AHandler机制来异步地处理请求,ALooper列队消息请求,AHandler中去处理,所以有更少的Mutex/Lock在NuPlayer中。Awesomeplayer中利用了omxcodec,而NuPlayer中利用了Acodec。

架构图

重要概念

  • NuPlayer::Source is the parser module. Actually its interface looks like a combination of MediaExtractor and MediaSource, and it also makes seekTo as an explicit API now.

  • NuPlayer::Decoder connects to ACodec for AVC decoding, and to DecoderWrapper for AAC decoding, which in turn wrapps AAC software decoder in the OpenMAX style. ACodec is functionally similar as OMXCodec in Stagefright, besides the application of State pattern and passing MediaBuffers around with messages.

  • NuPlayer::Render is responsible for rendering audio and also controls when to post video buffers back to NativeWindow for A/V sync.

视频是如何播放的

DataSource有两个概念

  • 上面框图中的DataSourceInput(或者直接叫DataSource)指的是单纯的数据输入(未demux的)。
  • 在后文中setDataSource中DataSource指的是从数据输入到demux输出的一个过程(即图中最外层的DataSource)。

VideoTrack与AudioTrack

指的是Extractor(即demux)的两个通道,从这里输出的分别就是单纯的解复用后的Video和Audio流。再经过Decoder后输出的就是音、视频的输出了 
- VideoRenderer + Surface即视频的输出; 
- AudioSink即音频的输出;

Nuplayer执行序列图

序列图源码

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

Title Nuplayer流程participant NuPlayerDriver
participant NuPlayer
participant GenericSource
participant FileSource
participant MediaExtractor
participant AnotherPacketSource
participant DecoderBase
participant Decoderopt setDataSourceNuPlayerDriver->+NuPlayer: setDataSourceAsync()NuPlayer-->GenericSource: new GenericSource()NuPlayer-->GenericSource: setDataSource()NuPlayer-->NuPlayer: kWhatSetDataSourceNuPlayer-->-NuPlayerDriver:NuPlayer->+NuPlayer: kWhatSetDataSourcenote right of NuPlayer: msg->findObject("source", &obj)\nmSource = static_cast<Source *>(obj.get());NuPlayer-->-NuPlayerDriver: notifySetDataSourceCompleted()
end opt prepareNuPlayerDriver->+NuPlayer: prepareAsync()NuPlayer-->NuPlayer: kWhatPrepareNuPlayer-->-NuPlayerDriver:NuPlayer->+NuPlayer: kWhatPrepareNuPlayer->+GenericSource: prepareAsync()GenericSource-->GenericSource: kWhatPrepareAsyncGenericSource-->-NuPlayer: NuPlayer-->-NuPlayer:GenericSource->+GenericSource: onPrepareAsync()GenericSource-->FileSource: new FileSource()GenericSource->GenericSource:initFromDataSource()GenericSource-->AnotherPacketSource: new AnotherPacketSource()GenericSource-->FileSource: sniff()GenericSource-->MediaExtractor:MediaExtractor::Create()GenericSource-->-NuPlayer: finishPrepareAsync()
end opt StartNuPlayerDriver->+NuPlayer: start()NuPlayer-->NuPlayer: kWhatStartNuPlayer-->-NuPlayerDriver:NuPlayer->+NuPlayer: onStart()NuPlayer->+GenericSource: start()GenericSource->GenericSource: postReadBuffer()GenericSource-->GenericSource: kWhatReadBufferGenericSource->GenericSource: onReadBuffer()GenericSource->GenericSource:readBuffer()GenericSource-->AnotherPacketSource: queueAccessUnit()GenericSource-->GenericSource: kWhatStartGenericSource-->GenericSource: restartPollBuffering()GenericSource-->-NuPlayer:NuPlayer->+DecoderBase: setRenderer()DecoderBase-->DecoderBase: kWhatSetRendererDecoderBase-->-NuPlayer: NuPlayer->NuPlayer: postScanSources()NuPlayer-->-NuPlayer: kWhatScanSources
end 

Android-7.0-Nuplayer流程图相关推荐

  1. android 6.0权限库,Android 6.0动态权限适配

    前言 最近项目发现比较多的问题是关于Android 6.0的问题,APP安装之后,在Android 6.0之后的系统,点击直接奔溃打不开,这是为什么昵?这就是Android 6.0以上的系统引入运行时 ...

  2. Android 7.0 Keyguard流程分析

    在android 6.0 上Keyguard作为了SystemUI的一个库文件被引用,所以编译的时候不会出现Keyguard.apk这个文件,Keyguard也伴随着SystemUI的启动而启动,其中 ...

  3. Android 4.0 截屏(Screenshot)代码流程小结

    Android 4.0 截屏 在Android 4.0 之前,Android手机上如果要使用截屏功能,只能通过Root手机,且使用第3方截图软件来实现截屏功能. Android4.0中,系统自带了截屏 ...

  4. 从 Android 6.0 源码的角度剖析 Binder 工作原理 | CSDN 博文精选

    在从Android 6.0源码的角度剖析Activity的启动过程一文(https://blog.csdn.net/AndrExpert/article/details/81488503)中,我们了解 ...

  5. 谈谈Android 6.0运行时权限理解

    前言 谷歌在2015年8月份时候,发布了Android 6.0版本,代号叫做"棉花糖"(Marshmallow ),其中的很大的一部分变化,是在用户权限授权上,或许是感觉之前默认授 ...

  6. Android 4.0 ICS SystemUI浅析——SystemUI启动流程

    阅读Android 4.0源码也有一段时间了,这次是针对SystemUI的一个学习过程.本文只是对SystemUI分析的一个开始--启动流程的分析,网上有很多关于2.3的SystemUI的分析,可4. ...

  7. Android Binder 之 ServiceManager (基于android 12.0/S)

    Binder 原理整理: 因为Linux中的进程的用户空间是不共享的,内核空间是共享的,所以IPC通信是两个用户空间(APP 进程)通过共享的内核空间(Binder驱动)进行数据交互. Binder ...

  8. 【高通SDM660平台 Android 10.0】(14) --- Camera ISP

    [高通SDM660平台 Android 10.0]--- Camera ISP 一.Camera ISP 与 DSP 区别 1.1 名词解释 1.2 功能解释 1.3 手机摄像头ISP是独立好还是内置 ...

  9. AOSP Android 8.0 冷启动流程分析(二)

    前奏: Android系统虽然基于Linux系统的,但是由于Android属于嵌入式设备,并没有像PC那样的BISO程序,取而代之的是Bootloader----系统启动加载器. /boot : 存放 ...

  10. android AVB2.0(二)Uboot阶段AVB2.0校验流程

    android AVB2.0学习总结传送门 本篇属于android AVB2.0学习总结系列的第二篇文章,本篇主要介绍一下UBOOT或者UEFI阶段AVB2.0的介绍. 支持原创,转载请标明链接 ht ...

最新文章

  1. JAX_WS 2.2 规范的webservices客户端实现(Axis2,Cxf)
  2. vue+mint-ui地址三级or四级联动
  3. DFS Gym 100553J Jokewithpermutation
  4. django一对多、多对多模型、自关联的建立
  5. 项目管理一般知识:项目的组织方式
  6. Android高德地图自定义Markers的例子
  7. PHP移除json数据最右侧的逗号!
  8. 在Blazor中构建数据库应用程序——第4部分——UI控件
  9. 统计通话次数和时间的软件_通话时间统计app下载-通话时间统计安卓版 v2.2.2 - 安下载...
  10. eXtremeComponents介绍
  11. 移动端证件识别,支持离线识别
  12. Kinect外包团队(长年承接微软Kinect体感项目外包,有大型Kinect案例)
  13. 从linaro下载安装二进制文件安装交叉编译工具
  14. 风控每日一问:风控工作的价值在于?
  15. 谷歌浏览器打开金格在线编辑插件
  16. .Net 简单使用 Hangfire
  17. Linux 文件系统类型 文件系统结构 与Windows文件系统的比较
  18. [HNOI2004]打鼹鼠 简单DP
  19. TCP协议(Transmission Control Protocol)
  20. RPC服务和HTTP服务对比

热门文章

  1. 第二期: 如何搭建 多用户的平台?(未完)
  2. Linux服务器创建及维护记录
  3. 关于使用UIWebView加载HTTPS站点
  4. 使用PHP实现请求响应和MySql访问
  5. myeclipse 8.6安装freemarker插件
  6. 让你更好的使用jQuery插件
  7. Speaker Recognition: Feature Extraction
  8. 2019.3.9日面试自我介绍
  9. html tab键自动填充,HTML tabindex — TAB按键操作
  10. okhttp配置缓存策略_一网打尽OkHttp中的缓存问题