android11 stagefright AudioPlayer 播放音频流程解析

文章详细阐述了Android系统中StagefrightAudioPlayer的源码流程,包括AudioPlayer如何解码音频数据并利用AudioTrack进行播放。解码过程涉及SimpleDecodingSource和MediaCodec,AudioTrack通过AudioTrackThread处理解码后的音频流数据。
摘要由CSDN通过智能技术生成

stagefright AudioPlayer源码位置 :

frameworks/av/cmds/stagefright/AudioPlayer.cpp

流程为:
AudioPlayer自己解码音频数据,然后把解码之后的数据送往AudioTrack来播放。

AudioPlayer的使用

	sp<AudioPlayer> player = sp<AudioPlayer>::make(nullptr);
    player->setSource(rawSource);
    rawSource.clear();
    err = player->start(true /* sourceAlreadyStarted */);

AudioPlayer的start方法

在 start方法中创建了一个AudioTrack ,然后调用它的start方法 。

AudioTrack简单解析 :

我们的AudioPlayer::start()调用 AudioTrack::start(), 后者调用AudioTrackThread::resume() ,后者执行mMyCond.signal() 唤醒AudioTrackThread, 开始调用AudioTrackThread::threadLoop()。
它调用AudioTrack::processAudioBuffer(),后者调用mCbf(EVENT_MORE_DATA, …) 去取音频数据,这个会调用到stagefright的 AudioPlayer::onMoreData方法。

AudioPlayer::onMoreData()
AudioTrack请求填充数据。它调用 AudioPlayer::fillBuffer,继续到AudioPlayer.cpp的mSource->read 方法 。

MediaSource::read() :
我们的AudioPlayer的mSource的类型是SimpleDecodingSource,
一个SimpleDecodingSource有以下主要方法:
start()
stop()
getFormat()
read()
送入解码器,拿出解码的数据。

如何判断到达文件末尾:

mCodec->dequeueOutputBuffer 会返回是否到达文件末尾.

编解码流程:

位置在SimpleDecodingSource::doRead方法 。
mCodec->queueInputBuffer。
mCodec->dequeueOutputBuffer。

AudioTrack是如何处理解码之后的音频流数据的:

后面完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值