问题标签 [opensl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
877 浏览

android - 带有缓冲队列的 NDK OpenSL ES 循环声音

我正在为所有音频文件使用 SLDataLocator_AndroidSimpleBufferQueue。它工作得很好,但是......它不支持搜索和循环。

OpenSL 不能要求带有缓冲区队列数据源的 SL_IID_SEEK

我如何使用循环文件?不能使用流媒体 - 低延迟。

0 投票
1 回答
697 浏览

android-ndk - 强制对 SLAndroidSimpleBufferQueueItf 进行初始回调

我有一个用于 OpenSL 音频播放器的缓冲区队列接口 (SLAndroidSimpleBufferQueueItf)。我用接口注册了我的回调。在我的回调中,我正在对要填充到循环缓冲区中的数据进行有条件的等待。

我的问题是我不知道如何获得对我的回调的初始调用。

我通过在创建接口后立即将硬编码数据传递给 Enqueue 来强制它。这具有播放我的虚拟数据然后进入我的回调的效果,它将等待循环缓冲区上的数据。

这使一切都可以正常工作。我只是不想传递这个虚拟数据来第一次触发回调。

我错过了什么?

0 投票
1 回答
1859 浏览

android - openSL ES Android:不规则的音频回调

openSL在其中一个Android apps. 当应用程序在前台时,回调非常有规律。麦克风回调大约每 10 毫秒调用一次,扬声器回调也是如此。但是,如果我将我的应用程序放在后台并打开浏览器(或其他应用程序),我会看到在打开浏览器(或浏览)时触发了“风暴”的回调。有没有办法解决这个问题?为什么会这样?openSL 是否会补偿无法执行回调的一段时间?(就像它试图赶上一样)。

我的源代码在C,我在Jelly Bean 4.3.

我试图增加AudioTrackand的线程优先级AudioRecorder,它似乎确实有帮助,但我不确定这是要走的路。

其他问题

所以你是说,即使增加线程优先级,你也可能会收到大量回调,你应该丢弃那些?

这是一个好的解决方案吗?您将丢弃麦克风数据包(或耗尽扬声器数据包的来源),对吗?如果你不丢弃麦克风数据包,麦克风数据包的接收者会将麦克风数据包的突发解释为过度抖动,对吗?

更重要的是:我手动增加了 AudioTrack 和 AudioRecorder 的线程优先级,并将 sched 策略更改为轮询。它需要 root 访问权限和安装 BusyBox(带有用于更改线程优先级/调度策略的命令行工具)。这是如何从 C 以编程方式完成的?我想确保增加的是单个线程优先级,而不仅仅是我的应用程序(进程)的优先级。

0 投票
1 回答
1065 浏览

java - 在 Android 中将循环音频与动画精确同步

问题: 有什么方法可以使用 AudioTrack 和 setLoopPoints() 根据每毫秒的样本/帧数来配置一个准确的循环?

编辑:我知道大多数安卓设备拥有的处理能力不能指望完美的准确性。但是,我希望平均循环时间接近节奏的“真实”间隔(以毫秒为单位),因为这就是我基于“动画”的方式,它也应该与节奏同步(动画是重绘的 SurfaceView在速度间隔期间的一条线的坐标)。

详细信息: 我正在尝试将 AudioTrack 与 setLoopPoints 一起使用来创建准确的节拍器。为此,我使用了两个 wav 文件(Tick 和 Tock)来填充 byte[] 数组以提供给 AudioTrack。考虑一个 4/4 时间的示例,我将填充一个字节 [],一次使用 Tick 从 [0] 开始,三次使用 Tock(使用 arrayCopy())到 [length/4],[length/2],并且[3*length/4],并假设 wav 数据不会相互重叠。

我的代码的粗略示例:

希望您已经开始看到问题所在。在某些节奏下,我只能在循环中进行静态播放(但仅在第 1 和第 3 个 Tock [循环中的第 2 和第 4 个样本] 期间)。

如果我:

  • 不要用任何 wav 数据填充 byte[],但要保持 bytesPerInterval 和 numSamples 相同(正确持续时间的静默循环)。
  • 设置 bytesPerInterval = bytesPerInterval % 4 (从而失去节奏准确性)

工作(非静态)和不工作(静态)速度的示例及其所需的帧数(考虑一秒 = 88200 帧):

如果问题的答案是“不,您不能使用 setLoopPoints() 来配置精确到任何毫秒的循环”,那么我想知道任何其他选项。NDK、SoundPool 或 MediaPlayer 中的 OpenSL ES 是否更适合生成精确的循环?

编辑2:我缩小了导致静态问题的位置:

最重要的是,我想了解为什么以 wavData 奇数索引开始的音频数据会生成静态而不是预期的声音,以及是否有任何补救措施。

0 投票
2 回答
1856 浏览

android - Android上的原生声音库实际上可以改变音高?

我对如何在 Android 上本地设置音调感到困惑。我尝试从使用 OpenSL ES 的 NDK 中更改原生声音样本,但在请求接口时,我得到了一个 SL_RESULT_FEATURE_UNSUPPORTED 用于几乎所有与音高相关的内容。尝试的接口:SL_IID_PITCH、SL_IID_RATEPITCH、SL_3DDOPPLER

结果总是 SL_RESULT_UNSUPPORTED

我的目标是 android-19。我也尝试了许多其他方法无济于事。难道我做错了什么?是否有不需要使用 Java 的替代方案?

谢谢!

0 投票
1 回答
822 浏览

android - Android OpenSL 不支持 SL_IID_PLAYBACKRATE?

我使用 NDK 创建了一个 Audio Instrument,为了获得低延迟性能,我选择 OpenSL 来播放音乐文件。但是我无法更改播放音乐的播放速率。这是快照代码:

关键是:

我尝试在playbackMaxRate 和playbackMinRate 之间设置值(在我的S3 手机上,playbackMaxRate 是2000,playbackMinRate 是500)。但没有效果,android NDK 文档说它支持 SL_IID_PLAYBACKRATE。我的代码有什么问题吗?非常感谢。

0 投票
1 回答
285 浏览

android - OpenSL 可以录制自己吗?

我想从游戏中捕获传出的音频,并在播放时将其录制到音频文件中。这可能在 OpenSL 的框架内吗?就像通过将 OutputMix 连接到 AudioRecorder 或其他方式一样?

0 投票
1 回答
1620 浏览

android - Android OpenSLES 缓冲区饥饿问题

我正在尝试解决 Android OpenSLES 中的以下问题。

OpenSLES 规范说明如下:

http://www.khronos.org/registry/sles/specs/OpenSL_ES_Specification_1.0.1.pdf - 8.12

当播放器处于由 SLPlayItf 接口控制的 SL_PLAYSTATE_PLAYING 状态时[参见第 8.32 节],添加缓冲区将隐式开始播放。在由于队列中的缓冲区不足而导致饥饿的情况下,音频数据的播放将停止。播放器保持在 SL_PLAYSTATE_PLAYING 状态。附加缓冲区排队后,音频数据的播放将恢复。请注意,排队缓冲区的不足会导致音频数据流中出现可听间隙。在播放器不处于播放状态的情况下,添加缓冲区不会开始音频播放。

唉,一旦我们进入 android:

http://mobilepearls.com/labs/native-android-api/ndk/docs/opensles/index.html - 将音频解码为 PCM

根据平台实现,解码可能需要不能闲置的资源。因此,不建议因未能提供足够数量的空 PCM 缓冲区而使解码器饿死,例如通过从 Android 简单缓冲区队列回调返回而不将另一个空缓冲区入队。解码器饥饿的结果未指定;实现可以选择丢弃解码的 PCM 数据、暂停解码过程,或者在严重的情况下终止解码器。

这种非规范行为完全停止了我的项目进展,我不知道如何最好地解决它。将整个文件解码为内存或磁盘中的 pcm 不是一种选择,我真的需要这是一个流式解决方案。对此的任何帮助将不胜感激

0 投票
1 回答
24462 浏览

android - 在 Android 中重定向音频/创建备用声音路径

有没有人有在 Android 中重定向音频或创建新声音路径的经验(使用 OpenSL ES、ALSA 等)?最终目标是创建一个虚拟麦克风来代替外部麦克风,在那里人们可以播放音频文件,就好像他们对着麦克风说话一样。访问麦克风的应用程序AudioSource.MIC应使用此备用流。它没有必要与语音通话一起使用,我相信实现这种功能更难,因为这一切都在无线电中完成。

关于从哪里开始的任何想法?我已经对 OpenSL 和 ALSA 进行了一些研究,但看起来我需要打包新固件 (ROM) 才能定义自定义音频路径。如果可以避免,我想创建一个应用程序级解决方案。电话是“根”的(有 su 二进制文件)。目标设备是三星 Galaxy S4 Google 版 (GT-i9505G)。具体来说,我正在寻找 i9505G 的音频驱动程序配置/源代码或任何参考。

提前致谢!

编辑 - 我检查了 CyanogenMod 10.2 源代码树,以及 jfltexx 驱动程序和内核。以下是 kernel/samsung/jf/sound 的内容:http: //pastebin.com/7vK8THcZ。这在任何地方都有记录吗?

0 投票
1 回答
1182 浏览

android - 使用 OpenSL 播放生成声音

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

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

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

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

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

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