现在的位置: 首页 > 综合 > 正文

Stagefright (6) – Audio Playback的流程

2013年11月13日 ⁄ 综合 ⁄ 共 1308字 ⁄ 字号 评论关闭

到目前為止,我們都只著重在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。

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

【上篇】
【下篇】

抱歉!评论已关闭.