【发布时间】:2014-02-06 17:30:01
【问题描述】:
我正在构建一个应用程序,它会产生声音(目前它主要是实验性的)并在 Android 手机上播放它。
现在我正在尝试播放简单的正弦波声音 (440 Hz),并首先尝试使用 Audiotrack,但遇到了一些缓冲区欠载。所以我决定看看 OpenSL。
现在我已经阅读了很多关于这方面的教程和博客文章,最后使用带有 Android 简单缓冲区队列的 OpenSL 引擎制作了自己的实现。
现在在缓冲区回调中,我生成了一个新的缓冲区数据并将其添加到队列中,但是延迟比音轨差得多(我可以听到每个缓冲区之间的间隙)。
我的问题是,在 OpenSL 中生成声音的最佳实践/架构是什么?我应该在另一个线程中填充缓冲区(然后需要一些与缓冲区回调同步的过程)吗?
我还没有找到有关生成声音的 OpenSL ES 教程(大多数是关于播放音频文件或将音频输入重定向到音频输出)。
【问题讨论】:
-
“延迟比音轨差很多(我可以听到每个缓冲区之间的间隙)”。在我看来,您在描述缓冲区不足(缓冲区正在排队,但尚未完全填满)。除非您在每个缓冲区之间停止并重新启动播放器对象,否则缓冲区之间应该没有延迟;当您第一次启动播放器对象时,只有第一个。至于你的问题;我只是使用缓冲区队列回调将下一个缓冲区排入队列,但我必须尝试不同的缓冲区大小才能找到一个有效的缓冲区。
标签: android android-ndk opensl