我正在开发一款能产生声音的应用程序(目前主要是实验性的),并在Android手机上播放。
现在,我试图播放一个简单的正弦波声音(440赫兹),第一次尝试了一个音轨,但经历了一些缓冲运行不足。所以我决定看看OpenSL。
现在,我已经阅读了大量关于这方面的教程和博客文章,并最终使用带有的OpenSL引擎实现了自己的实现。
现在,在缓冲区回调中,我生成一个新的缓冲区数据并将其添加到队列中,但是延迟要比音频轨道差得多(我可以听到每个缓冲区之间的间隙)。
我的问题是,在OpenSL中生成声音的最佳实践/体系结构是什么?我是否应该在另一个线程中填充缓冲区(然后需要与缓冲区回调同步处理)?
我还没有找到关于OpenSL ES生成声音的教程(大多数是关于播放音频文件或将音频输入重定向到音频输出)。
发布于 2014-01-27 09:28:09
关于延迟:重要的是为您的设备选择正确的采样率和缓冲区大小。您可以通过使用Android的AudioManager (PROPERTY_OUTPUT_SAMPLE_RATE和PROPERTY_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应用程序之后,我编写了一篇小文章,更详细地解释了上面的建议,以及如何构建与音乐相关的应用程序的基本顺序引擎,但是这个页面只是一个基本的体系结构大纲,根据您的需求> OpenSL中的Android音频引擎可能是完全无用的。
https://stackoverflow.com/questions/21184979
复制相似问题