使用MediaPlayer播放音视频时,会创建AudioTrack对象用于播放音频数据。下面就来看看MediaPlayer创建AudioTrack的过程:

1.创建AudioTrack对象
MediaPlayer类中并没有直接创建AudioTrack,而是把创建AudioTrack对象的操作放在了MediaPlayerService类的内部类AudioOutput中
具体代码是在 MediaPlayerService::AudioOutput::open函数中,通过新建(new)一个AudioTrack对象,赋给AudioOutput类的成员变量mTrack来实现的。
mTrack是AudioTrack类型的指针变量。

另外,AudioOutput类不但是MediaPlayerService的内部类,还是继承自MediaPlayerBase::AudioSink的派生类。

既然知道了AudioTrack对象是在AudioOutput::open函数中创建的,那么接下来我们就看看AudioOutput类对象是在哪里创建的,以及AudioOutput::open是在什么时候被调用的。

2.创建AudioOutput类对象
在MediaPlayerService::Client::setDataSource函数中,当使用AudioFlinger进行软件混音时会创建AudioOutput类对象mAudioOutput。
然后调用播放器的setAudioSink函数,把mAudioOutput对象赋值给相应播放器的AudioSink对象。
假设播放的是本地音视频,在GB、ICS中默认的播放器框架是StagefrightPlayer,对应的播放器对象是AwesomePlayer。
最后调用AwesomePlayer::setAudioSink函数,把mAudioOutput赋给AwesomePlayer类的MediaPlayerBase::AudioSink类型的mAudioSink成员变量。
AwesomePlayer类的成员变量mAudioSink又作为创建AudioPlayer类对象的构造函数参数,传递给AudioPlayer类成员变量mAudioSink,它也是MediaPlayerBase::AudioSink类型的变量。

这样就把MediaPlayerService中创建的AudioOutput类对象,最终传递给了AudioPlayer的成员mAudioSink,以待播放时使用。

3.调用AudioOutput::open函数
由于创建AudioTrack对象是在AudioOutput::open函数中进行的,所以清楚什么时候调用AudioOutput::open函数就很重要。
根据2中我们已经知道了AudioOutput对象已经赋给了AudioPlayer的成员mAudioSink,所以只要知道调用mAudioSink的open函数,也就知道了调用AudioOutput::open函数的处理。
查找AudioPlayer类可知,调用mAudioSink的open函数是在AudioPlayer::start函数中进行的。
   在AudioPlayer::start函数中,当mAudioSink对象不为空(NULL)时,就调用了mAudioSink的open函数。并且设置了参数默认文件格式为AudioSystem::PCM_16_BIT,默认audio sink缓冲区个数为DEFAULT_AUDIOSINK_BUFFERCOUNT,值为4。然后调用mAudioSink的start函数,即MediaPlayerService::AudioOutput::start函数进行音频数据输出。MediaPlayerService::AudioOutput::start函数中又调用了AudioTrack的start函数。
   当mAudioSink对象为空(NULL)时,则直接创建AudioTrack对象,然后调用AudioTrack对象的start函数。目前为止,还没有遇到过直接创建AudioTrack对象的处理,因为mAudioSink对象不为空。
AudioPlayer::start函数是在用户调用MediaPlayer的start函数后一步步被执行到的。

MediaPlayer中创建AudioTrack的过程的更多相关文章

  1. Android Multimedia框架总结(三)MediaPlayer中创建到setDataSource过程

    转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52392430 前言:前一篇的mediaPlayer ...

  2. Android Multimedia框架总结(二十二)MediaCodec中C++中创建到start过程及状态变换

    上一章介绍MediaCodec中创建到start过程(到jni部分),从今天开始,将深入源码中看看其c++过程,看下Agenda如下: mediacodec.h CreateByType initMe ...

  3. Android Multimedia框架总结(二十一)MediaCodec中创建到start过程(到jni部分)

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53386117 我最近正在参加CS ...

  4. Android Multimedia框架总结(四)MediaPlayer中从Java层到C++层类关系及prepare及之后其他过程

    转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52420803 前言:在上篇中,分析了MediaPl ...

  5. Android MediaPlayer架构 -- MediaPlayer的创建过程

    本文系作者自己学习之所用,文章内容仅出自作者拙劣之思考,问题之处烦请不吝指教. MediaPlayer 能被用来控制音/视频文件或流媒体的回放.Android中以MediaPlayer类作为音视频播放 ...

  6. QT源码解析(七)Qt创建窗体的过程,作者“ tingsking18 ”(真正的创建QPushButton是在show()方法中,show()方法又调用了setVisible方法)

    前言:分析Qt的代码也有一段时间了,以前在进行QT源码解析的时候总是使用ue,一个函数名在QTDIR/src目录下反复的查找,然后分析函数之间的调用关系,效率实在是太低了,最近总结出一个更简便的方法, ...

  7. ASP.NET Web API 过滤器创建、执行过程(二)

    ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...

  8. ASP.NET Web API 过滤器创建、执行过程(一)

    ASP.NET Web API 过滤器创建.执行过程(一) 前言 在上一篇中我们讲到控制器的执行过程系列,这个系列要搁置一段时间了,因为在控制器执行的过程中包含的信息都是要单独的用一个系列来描述的,就 ...

  9. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

随机推荐

  1. [译]servlet3.0与non-blocking服务端推送技术

    Non-blocking(NIO)Server Push and Servlet 3 在我的前一篇文章写道如何期待成熟的使用node.js.假定有一个框架,基于该框架,开发者只需要定义协议及相关的ha ...

  2. zhuan:windows用一键安装包安装(推荐)-禅道

    访问地址:http://www.zentao.net/book/zentaopmshelp/76.html 一键安装包 解压缩必须 解压缩到根目录下面.

  3. (转)Qt Model/View 学习笔记 (三)——Model类

    Model类 基本概念 在model/view构架中,model为view和delegates使用数据提供了标准接口.在Qt中,标准接口QAbstractItemModel类中被定义.不管数据在底层以 ...

  4. linux标准输入输出重定向

    command > filename 把标准输出重定向到一个文件,如果文件不存在则新建,如果存在则覆盖其内容.command >> filename 把标准输出重定向到一个文件中,如 ...

  5. having count(*) > 1

    select phone from aa group by phone having count(*) > 1 后面的having子句是什么意思啊? 以phone分组,分组后每组里面phone出 ...

  6. Objective-C程序结构及语法特点

    程序文件分为头文件(.h)和实现文件(.m): 使用#import关键字将所需的头文件导入程序,并且可以避免程序重复引用相同的头文件: @autoreleasepool { … } 自动释放池: 符号 ...

  7. 动态设置uitableview高度,参考

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { //  ...

  8. js 人工获取年月日

    var date = new Date(); var months = new Array("01", "02", "03", " ...

  9. 一个好用且方便的FastCgi C++库 - FastCgi++

    不知道你是不是曾经发愁过使用FastCgi库来使用C++开发Fastcgi程序繁琐而且会与C++ STL代码产生冲突的地方,或者你还是习惯了cout而不是pringf,那这篇文章就可以了解到一个使用的 ...

  10. springside springmvc 的一个SB问题

    <form  id="inputForm" modelAttribute="order" action="${ctx}/myorder/orde ...