OpenSL es-操纵音频缓冲队列

时间:2018-02-12 10:04:35

标签: android c++ audio-processing opensl

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

我目前的配置:

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

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

我真的很感激一些帮助。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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

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