stagefright框架(六)-Audio Playback的流程
来源:互联网 发布:fanuc模拟软件 编辑:程序博客网 时间:2024/04/29 19:54
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傳輸流程》
- stagefright框架(六)-Audio Playback的流程
- stagefright框架(六)-Audio Playback的流程
- stagefright框架(六)-Audio Playback的流程
- stagefright框架(六)-Audio Playback的流程
- stagefright框架(六)-Audio Playback的流程
- stagefright框架(六)-Audio Playback的流程
- stagefright框架(六)-Audio Playback的流程
- stagefright框架(六)-Audio Playback的流程
- stagefright框架(六)-Audio Playback的流程
- stagefright框架(六)-Audio Playback的流程
- stagefright框架(六)-Audio Playback的流程
- stagefright框架(六)-Audio Playback的流程
- stagefright框架(六)-Audio Playback的流程
- StageFright框架(六)Audio Playback的流程
- Stagefright (6) - Audio Playback的流程
- Stagefright (6) - Audio Playback的流程
- stagefright框架(一)Video Playback的流程
- stagefright框架(一)Video Playback的流程
- JSP 用监听器Filter来解决中文乱码问题
- RTTI 运行时类型识别
- 集记别单价
- 写一个简单的COM覆盖型的Virus
- Git和Repo扫盲——如何取得Android源代码
- stagefright框架(六)-Audio Playback的流程
- hdu 1754 -- I Hate It (线段树)
- Linq Datatable
- IHttpModule和IHttpHandler 应用笔记
- 新概念英语3 lesson1笔记
- 如何查看证书的16进制DER编码,及证书的各个域DER格式
- 学习jni,快气死我了,进度慢死了,
- 计算机学习
- mysql的SQL_CALC_FOUND_ROWS 使用