这里就不再一一赘述,反正就是
高性能,低延迟
。
2. Oboe 播放音频
与AudioTrack 一样,Oboe只支持PCM文件。需将各种音频文件解码后,再写入Oboe,才能播放声音。
有点微妙的是,相比AudioTrack,Oboe显得更加主动。
AudioTrack实现音频播放时,它不会跟你沟通,有什么要播放的,你扔给它就是。
Oboe实现音频播放时,它会一直在问你,有什么要播放的,有,你就给我,没有,等下再来问你。
OnAudioReady是 Oboe 提供的音频播放回调方法,正如上文说的,想要播放什么内容,就往 audioData 里填充,然后 Oboe 就会播出相应的声音。
正是这样,Oboe才显得更加的灵活,比如,播放到中途,静音一段时间。
将 *audioData 填满0,就表示静音了。
DataCallbackResult
AudioEngine::onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) {
if() {
} else {
memset(audioData, 0, sizeof(float) * numFrames * mChannelCount);
return DataCallbackResult::Continue;
基于项目需求,再综合这点点微妙的感觉,Oboe 音频播放的方案如图
1. DataSource
主要功能是解码各种音频文件,解码成PCM文件并存储在FileTrack里
AAssetDataSource 表示数据来源于 Android Assect文件目录
StorageDataSource 表示数据来源 文件系统
2. IRenderableAudio
这里只看FileTrack,其他的先按下不表。它持有pcm,随时可以读写。
3. AudioStreamCallback
AudioStreamCallback类是Oboe提供的,需要继承并实现其 onAudioReady 方法。如前面静音的例子那般,实现后往 audioData 填pcm数据后即可播放声音。
AudioEngline就是实现各种音频操作的关键。诸如音效,音量,混音,静音等等。
那么,接下来就是真正的混音介绍了。卖个关子,下回分解。