OpenSL es操作音频缓冲区队列

问题描述 投票:1回答:1

我对openl es很新。我目前正在尝试使用opensl es for android的录制和播放功能。现在我有一个记录功能,可以将数据存储在缓冲队列中。然后我可以播放缓冲队列。有人能够解释我如何正确操作缓冲区队列中的数据吗?所以播放声音与录音不同。

我目前的配置:

sampleFormat.pcmFormat_ = static_cast<uint16_t>(engine.bitsPerSample_);
//the buffer
uint8_t *buf_;

在操作之前,我需要对缓冲区中的数据进行任何类型的转换或解码吗?

我真的很感激一些帮助。

android c++ audio-processing opensl
1个回答
0
投票

您的问题很广泛,我能做的就是告诉您应该如何使用它,以及如何处理从录制中获得的音频数据。

1)一旦你正确设置了OpenSL_ES引擎,录音机和播放器(很多例子),你已经为OpenSL_ES提供了一个缓冲区,用于从麦克风中读取pcm数据,还有一个缓冲区,用于读取您希望为其提供的数据一旦读取数据的过程结束(根据您的设置,如采样率,缓冲区大小等一段时间后),回放的下沉,以及将在完成时调用的2个回调函数,将调用记录回调, OpenSL_ES创建的一个线程,它取决于设备和配置,可能是一个高优先级的线程,通常称为快速跟踪(所以你不在回调中处理你的线程,但在OpenSL_ES的线程中,必须小心不要进行阻塞操作那里)。现在,如果您想要的是尽可能快地播放音频,请在回调内部处理音频信号处理,如果响应时间对您来说不是很重要,您可以使用回调作为线程开始读取过程音频的信号您希望缓冲区中的数据。在两种情况下播放音频时,您必须将数据(已处理或未处理)排入队列以进行播放过程(播放时也会在完成时调用播放器回调)。

2)现在,如果你想处理音频,你需要应用滤波器,可以应用多种音频信号滤波器,你应该在实时播放的情况下寻找动态滤波器。 (有些过滤器需要大量数据才能开始处理,实时可能不好,有些过滤器则经过优化,可以使用小块数据并动态调整输出)。因此,您需要按特定顺序创建一系列过滤器以获得所需内容。音频世界是巨大的,你需要阅读相当多的东西才能开始理解音频处理。音频性能是另一回事,直接取决于您拥有的设备(硬,软)。

3)对您获得的缓冲区的数据操作取决于您的处理器。例如endianess,一些处理器可能使用很少或大端,你可以用大端格式获取数据。没有压缩,因此pcm数据已准备好进行处理。 (如果你想从它创建一个wav,你只需要添加一个wave标头并在标题的数据块中添加pcm数据,如果你想要其他格式如mp3,你还需要使用压缩算法处理你的数据到您想要的格式并将该数据添加到正确的标题中)

另外通过OpenSL_ES播放数据需要未压缩的音频数据,因此无法直接播放mp3,需要先将其解压缩为pcm数据

这是OpenSL_ES的基本功能,希望能回答你的问题。如果有什么不清楚,请告诉我。

PS:Android说现在使用新的库AAudio更容易进行音频处理,它承诺完成与OpenSL_ES相同的任务,其复杂性只有三分之一(可能存在一些延迟问题,有些人遇到但我敢打赌它们正在修复当你读)

© www.soinside.com 2019 - 2024. All rights reserved.