gpt4 book ai didi

android - 使用 OpenSL 播放生成的声音

转载 作者:搜寻专家 更新时间:2023-11-01 08:53:13 26 4
gpt4 key购买 nike

我正在构建一个可以生成声音的应用程序(目前它主要是实验性的)并在 Android 手机上播放。

目前,我正在尝试播放简单的正弦波声音 (440 Hz),并首先尝试使用 Audiotrack,但遇到了一些缓冲区不足的情况。所以我决定看看 OpenSL。

现在我已经阅读了很多关于此的教程和博客文章,并最终使用带有 Android 简单缓冲区队列的 OpenSL 引擎实现了我自己的实现。

现在在缓冲区回调中,我生成了一个新的缓冲区数据并将其添加到队列中,但是延迟比音轨差得多(我可以听到每个缓冲区之间的间隙)。

我的问题是,在 OpenSL 中生成声音的最佳实践/架构是什么?我应该在另一个线程中填充缓冲区(然后需要一些与缓冲区回调的同步过程)吗?

我还没有找到有关生成声音的 OpenSL ES 教程(大多数是关于播放音频文件或将音频输入重定向到音频输出)。

最佳答案

关于延迟:为您的设备选择正确的采样率和缓冲区大小非常重要。您可以使用 Android SDK 的 AudioManager 查询设备的推荐值(PROPERTY_OUTPUT_SAMPLE_RATEPROPERTY_OUTPUT_FRAMES_PER_BUFFER 仅在 API 级别 17 后可用)并将这些值传递到 NDK 应用程序:

// getting the samplerate and buffer size
if ( android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 )
{
AudioManager am = ( AudioManager ) aContext.getSystemService( Context.AUDIO_SERVICE );
int sampleRate = Integer.parseInt( am.getProperty( AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE ));
int bufferSize = Integer.parseInt( am.getProperty( AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER ));
}

正确设置采样率的重要性在于,如果它不同于设备的首选采样率(一些使用 48 kHz,另一些使用 44.1 kHz),则音频在被硬件输出之前会经过系统重采样器,添加到整体延迟。此外,获得正确的缓冲区大小的重要性是为了防止样本/帧在多次缓冲区回调后丢失,这可能会导致您描述回调之间出现间隙/故障的问题。您可以使用倍数(2 的幂)来减少/增加缓冲区大小,以试验更稳定的引擎(更大的缓冲区大小)和更快的响应(更小的缓冲区大小)。

在创建了一些简单的 Android 应用程序之后,我写了一篇小文章,稍微详细地解释了上述建议,以及如何构建用于音乐相关应用程序的基本序列引擎,但是该页面只是一个基本的架构大纲,根据您的需要可能完全没用 > Android audio engine in OpenSL

关于android - 使用 OpenSL 播放生成的声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21184979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com