黄万里三峡问题:stagefright框架(六)-Audio Playback的流程
来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 07:15:53
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传输流程》