stagefright架構(六)-Audio Playback的流程

來源:互聯網
上載者:User

轉自:http://blog.chinaunix.net/space.php?uid=10995602&do=blog&id=2918720

 

到目前為止,我們都只著重在video處理的部分,對於audio卻隻字未提。這篇文章將會開始audio處理的流程。

Stagefright中關於audio的部分是交由AudioPlayer來處理,它是在AwesomePlayer::play_l中被建立的。

(1)
當上層應用程式要求播放影音時,AudioPlayer同時被建立出來,並且被啟動

status_t AwesomePlayer::play_l()
{
  ...

  mAudioPlayer = new AudioPlayer(mAudioSink,...);
  mAudioPlayer->start(...);

  ...
}

(2) AudioPlayer在啟動的過程中會先去讀取第一筆解碼後的資料,並且開啟audio output

status_t AudioPlayer::start(...)
{
  mSource->read(&mFirstBuffer);

  if (mAudioSink.get()!=
NULL)
  {
    mAudioSink->open(...,&AudioPlayer::AudioSinkCallback,...);
    mAudioSink->start();
  }
  else
  {
    mAudioTrack = new AudioTrack(...,&AudioPlayer::AudioCallback,...);
    mAudioTrack->start();
  }
}

從AudioPlayer::start的程式碼來看,AudioPlayer似乎並沒有將mFirstBuffer傳給audio
output。

(3)
開啟audio output的同時,AudioPlayer會將callback函式設給它,之後每當callback函式被呼叫,AudioPlayer便去audio
decoder讀取解碼後的資料

size_t AudioPlayer::AudioSinkCallback(audioSink,
buffer, size,
...)
{
  return fillBuffer(buffer, size);
}
void AudioPlayer::AudioCallback(...,
info)
{
  buffer = info;
  fillBuffer(buffer->raw, buffer->size);
}
size_t AudioPlayer::fillBuffer(data, size)
{
  mSource->read(&mInputBuffer,...);
  memcpy(data, mInputBuffer->data(),...);
}

解碼後audio資料的讀取就是由callback函式所驅動,但是callback函式又是怎麼由audio
output去驅動的,目前從程式碼上還看不出來。另外一方面,從上面的程式片段可以看出,fillBuffer將資料(mInputBuffer)複製到data之後,audio
output應該會去取用data。

 

當然對於video,有一個AwesomePlayer::mQueue::start中建立的線程來處理視頻,即通過向線程的等待隊列mQueue(List<QueueItem>)發事件訊息來驅動;而對於Audio,也有一個mAudioTrackThread::mAudioTrackThread(AudioTrackThread)線程調用回呼函數來驅動。(AudioSink::open時也會建立一個AudioTrack來實現,具體代碼參見:MediaPlayerService::AudioOutput::open)

(5) 至於audio decoder的工作流程則和video
decoder相同,可參閱《Stagefright
(4) - Video Buffer傳輸流程》

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.