MediaPlayer中创建AudioTrack的过程
2013-09-25 13:54
218 查看
使用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函数后一步步被执行到的。
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播放Audio的区别与联系
- AudioRecord 与 AudioTrack
- (uva 10881)蚂蚁(Piotr's Ants)
- 农民也玩数据挖掘:基于物联网的高端种菜模式
- 建筑物联网与智慧城市的建设
- 基于物联网中间件的智慧建筑节能管理系统
- 物联网有助于构建立体防御体系打击入室盗窃
- 常见名称解析_物联网相关
- iotop 分析系统那些进程占用io资源
- 物联网促进数字城市向智慧城市发展
- 物联网学习感
- 简易物联网
- 简易物联网
- 精益与看板——移动物联网的“小,快,灵”(舒军 腾讯)
- 基于物联网的智能建筑的能源消耗检测系统和节能管理系统的 设计
- MarioTCP: Multi Libvent TCP Server 一个高性能的TCP服务器
- UVa 10881 Piotr's Ants (等价转化思想)
- 物联网大时代 人工智能再获腾飞
- 基于物联网的真正智能家居,如何成为现实
- 友宝:掘金生活物联网