Stagefright (6) - Audio Playback的流程

    技术2022-07-01  76

    到目前為止,我們都只著重在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 outputstatus_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。(5) 至於audio decoder的工作流程則和video decoder相同,可參閱《Stagefright (4) - Video Buffer傳輸流程》


    最新回复(0)