使用MediaPlayer播放音視頻時,會創(chuàng)建AudioTrack對象用于播放音頻數(shù)據(jù)。下面就來看看MediaPlayer創(chuàng)建AudioTrack的過程: 1.創(chuàng)建AudioTrack對象 MediaPlayer類中并沒有直接創(chuàng)建AudioTrack,而是把創(chuàng)建AudioTrack對象的操作放在了MediaPlayerService類的內(nèi)部類AudioOutput中 具體代碼是在 MediaPlayerService::AudioOutput::open函數(shù)中,通過新建(new)一個AudioTrack對象,賦給AudioOutput類的成員變量mTrack來實現(xiàn)的。 mTrack是AudioTrack類型的指針變量。 另外,AudioOutput類不但是MediaPlayerService的內(nèi)部類,還是繼承自MediaPlayerBase::AudioSink的派生類。 既然知道了AudioTrack對象是在AudioOutput::open函數(shù)中創(chuàng)建的,那么接下來我們就看看AudioOutput類對象是在哪里創(chuàng)建的,以及AudioOutput::open是在什么時候被調(diào)用的。 2.創(chuàng)建AudioOutput類對象 在MediaPlayerService::Client::setDataSource函數(shù)中,當(dāng)使用AudioFlinger進行軟件混音時會創(chuàng)建AudioOutput類對象mAudioOutput。 然后調(diào)用播放器的setAudioSink函數(shù),把mAudioOutput對象賦值給相應(yīng)播放器的AudioSink對象。 假設(shè)播放的是本地音視頻,在GB、ICS中默認(rèn)的播放器框架是StagefrightPlayer,對應(yīng)的播放器對象是AwesomePlayer。 最后調(diào)用AwesomePlayer::setAudioSink函數(shù),把mAudioOutput賦給AwesomePlayer類的MediaPlayerBase::AudioSink類型的mAudioSink成員變量。 AwesomePlayer類的成員變量mAudioSink又作為創(chuàng)建AudioPlayer類對象的構(gòu)造函數(shù)參數(shù),傳遞給AudioPlayer類成員變量mAudioSink,它也是MediaPlayerBase::AudioSink類型的變量。 這樣就把MediaPlayerService中創(chuàng)建的AudioOutput類對象,最終傳遞給了AudioPlayer的成員mAudioSink,以待播放時使用。 3.調(diào)用AudioOutput::open函數(shù) 由于創(chuàng)建AudioTrack對象是在AudioOutput::open函數(shù)中進行的,所以清楚什么時候調(diào)用AudioOutput::open函數(shù)就很重要。 根據(jù)2中我們已經(jīng)知道了AudioOutput對象已經(jīng)賦給了AudioPlayer的成員mAudioSink,所以只要知道調(diào)用mAudioSink的open函數(shù),也就知道了調(diào)用AudioOutput::open函數(shù)的處理。 查找AudioPlayer類可知,調(diào)用mAudioSink的open函數(shù)是在AudioPlayer::start函數(shù)中進行的。 在AudioPlayer::start函數(shù)中,當(dāng)mAudioSink對象不為空(NULL)時,就調(diào)用了mAudioSink的open函數(shù)。并且設(shè)置了參數(shù)默認(rèn)文件格式為AudioSystem::PCM_16_BIT,默認(rèn)audio sink緩沖區(qū)個數(shù)為DEFAULT_AUDIOSINK_BUFFERCOUNT,值為4。然后調(diào)用mAudioSink的start函數(shù),即MediaPlayerService::AudioOutput::start函數(shù)進行音頻數(shù)據(jù)輸出。MediaPlayerService::AudioOutput::start函數(shù)中又調(diào)用了AudioTrack的start函數(shù)。 當(dāng)mAudioSink對象為空(NULL)時,則直接創(chuàng)建AudioTrack對象,然后調(diào)用AudioTrack對象的start函數(shù)。目前為止,還沒有遇到過直接創(chuàng)建AudioTrack對象的處理,因為mAudioSink對象不為空。 AudioPlayer::start函數(shù)是在用戶調(diào)用MediaPlayer的start函數(shù)后一步步被執(zhí)行到的。 |
|