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

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

2013年11月26日 ⁄ 综合 ⁄ 共 1322字 ⁄ 字号 评论关闭

http://daimajishu.iteye.com/blog/1085195

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

抱歉!评论已关闭.