首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用OpenSL播放生成声音

用OpenSL播放生成声音
EN

Stack Overflow用户
提问于 2014-01-17 11:35:40
回答 1查看 1.2K关注 0票数 2

我正在开发一款能产生声音的应用程序(目前主要是实验性的),并在Android手机上播放。

现在,我试图播放一个简单的正弦波声音(440赫兹),第一次尝试了一个音轨,但经历了一些缓冲运行不足。所以我决定看看OpenSL。

现在,我已经阅读了大量关于这方面的教程和博客文章,并最终使用带有的OpenSL引擎实现了自己的实现。

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-27 09:28:09

关于延迟:重要的是为您的设备选择正确的采样率和缓冲区大小。您可以通过使用Android的AudioManager (PROPERTY_OUTPUT_SAMPLE_RATEPROPERTY_OUTPUT_FRAMES_PER_BUFFER只能从API 17中获得)查询设备的推荐值,并将这些值传递给NDK应用程序:

代码语言:javascript
复制
// 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音频引擎可能是完全无用的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21184979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档