问题标签 [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 投票
1 回答
1828 浏览

android - 使用 NDK 进行准确的 POSIX 线程计时

我正在编写一个简单的 NDK OpenSL ES 音频应用程序,它记录用户在虚拟钢琴键盘上的触摸,然后在设定的循环中永远播放它们。经过大量的实验和阅读,我决定使用单独的 POSIX 循环来实现这一点。正如您在代码中看到的,它从睡眠时间中减去任何处理时间,以使每个循环的间隔尽可能接近所需的睡眠间隔(在本例中为 5000000 纳秒。

问题是即使使用它,结果也会更好,但非常不一致。有时音符会一次延迟甚至 50 毫秒,这使得播放非常不稳定。

有没有更好的方法来解决这个问题?为了调试,我运行了以下代码:

这给出了相当一致的读数 - 这并不反映播放不准确。Android 是否还有其他因素在阻止准确计时?还是 OpenSL ES 是一个潜在的问题?所有缓冲区数据都加载到内存中 - 那里可能存在瓶颈吗?

如果需要,很高兴发布更多 OpenSL 代码......但在这个阶段,我正在尝试弄清楚这个线程循环是否准确,或者是否有更好的方法来做到这一点。

0 投票
1 回答
311 浏览

android - Android OpenSL ES 晶振频率

我们有一个使用低级 OpenSL ES 编写的带有移动音频客户端的应用程序,以实现麦克风的低延迟输入。比我们向服务器发送封装在 UDP 数据报中的 10ms 帧。

在服务器上,我们正在做一些后期处理,这在很大程度上取决于来自移动客户端的帧以固定间隔(例如每帧 10 毫秒)出现的假设,因此我们可以对齐它们。

手机内部晶体频率似乎变化很大,正因为如此,我们在开始时得到了完美的对齐,但几分钟后对齐不佳。

我知道,Linux 上的 ALSA 可以告诉你晶体的确切频率——所以你可以根据这个来纠正你的计数。不幸的是,我不知道如何在 Android 中获取这些信息。

谢谢帮助

0 投票
2 回答
8630 浏览

android - 使用 OpenSL ES 在 Android 中录制原生音频

我试图在我的项目中使用 OpenSL ES for Android 以提供低延迟,我发现 NDK 示例 NativeAudio 仅用于录制短快照。

您能否告诉我,我在哪里可以找到如何长时间录制音频的示例?提前致谢。

0 投票
1 回答
921 浏览

android - OpenSL,使用android ndk同时播放不同的声音片段?

我想使用原生 android ndk 和 OpenSL ES 同时播放多个声音。我已经查看了 ndk 中的原生音频示例,但无法弄清楚如何对其进行概括,以便我可以同时播放不同的音频剪辑。我通过最近 50 次左右的搜索尝试在网上找到的大多数示例通常似乎依赖于其他代码,例如第三方库,它们都是用 Java 编写的(我是寻找本地解决方案),否则似乎并非旨在一次处理多个声音。

如果它对如何处理这个有任何影响,对于我想要播放的每个声音,我已经在内存中有一些原始 pcm 数据(小端序)可以播放,并且对于每个我知道它的采样率,每个样本的位数(8 或 16)和通道数(1 或 2)。

任何人都可以提供的任何帮助将不胜感激。提前致谢。

0 投票
4 回答
2381 浏览

android - 如何在 Android 上使用 OpenSL 测量音频延迟?

我使用 OpenSL 在 Android 上录制和播放音频。您能否建议我如何测量延迟,以找到最佳的音频配置(缓冲区、采样率)。

先感谢您!

0 投票
1 回答
1124 浏览

android - Android OpenSL ES + MediaPlayer:使用语音流时跨设备的行为非常不一致

我正在尝试创建一个使用 Android 的 OpenSL ES 实现的实时通信应用程序(类似 SIP、类似 Skype 等)。

问题是,我需要通过通信播放一些 WAV 音频文件(我正在使用 Java 中的 MediaPlayer 执行此操作)。

当然,当 OpenSL ES 未运行时,媒体播放器可以正常工作。但是当它发生时,一切都变得混乱:结果在设备之间存在强烈的不一致。

  • 在 Nexus 7 (4.2.2) 上:wav 可以正常播放
  • 在 Nexus 4 (4.2.2) 和 Galaxy S3 (4.1.2) 上:wav 播放非常低(即使音量设置为最大值)
  • 在 Galaxy S4 (4.2.2) 上:wav 播放非常响亮和饱和(即使音量设置为最小值)

我创建了一个示例项目来演示该问题,如果您在启动引擎之前播放声音(pweeet 按钮),它就可以工作。如果您之后播放,则取决于设备。

以下是我的观察:

  • 在 OpenSL ES 中,如果只有播放器或录音机工作,一切都按预期工作。是播放器和记录器的组合造成了错误(在 MainActivity.java 中,只需注释 StartPlayer() [l.47] 或 StartRecorder() [l.48] 即可看到)。
  • 如果我禁用播放器排队(在 Audio.cpp 中,注释 (*playerBufferQueue)->Enqueue [l.78-80])一切都按预期工作。
  • 如果我没有将 OpenSL ES 设置为在语音流上播放(在 Audio.cpp 中,注释 (*playerConfig)->SetConfiguration [l.146-187]),一切都会按预期工作。

当然,以上都不是我需要的解决方案...

  • 从 OpenSL ES 录制为语音通信
  • 在语音流中从 OpenSL ES 播放
  • 从媒体流中的 MediaPlayer 播放

……同时。

最后,我应该指出,在 Galaxy S4 中,当我从网络接收到的帧入队时,OpenSL ES 播放它的声音太大且饱和,以至于应用程序无法使用。所以我认为问题不在于 MediaPlayer Java 方面。

0 投票
1 回答
259 浏览

android - 如何在 OpenSLES 中获取活动引擎对象

我在 Android 2.3 上使用 OpenSLES 时遇到问题。

当我尝试创建引擎对象时,出现以下错误: slcreateengine while another engine is active

我知道 OpenSLES for Android(2.3?因为我在 Android 4.x 上没有发现这个问题)支持单个引擎,但我根本不知道另一个引擎来自哪里。

OpenSLES 中是否有任何接口可以检查是否已经存在活动引擎?

提前感谢您的任何提示!

0 投票
1 回答
637 浏览

android - 在 Android 中播放音频绝对最快的方法是什么?

最快”是指最低延迟

我知道的两种方法是:

  1. 使用 android.media.AudioTrack
  2. 将 OpenSL ES 与 NDK/C++ 一起使用

两者中,哪个更快?如果还有其他选择,请赐教。

更多细节:假设我的应用程序将播放倾向于原生硬件格式的声音。EG,如果本机播放采样率为 44.1KHz,我会给它一个 44.1K 的声音。如果原始采样率是 48KHz,我会给它一个 48KHz 的声音。不需要系统混合器或重新采样器。

0 投票
2 回答
2072 浏览

android - OpenSL ES 改变音高

我需要一些有关 OpenSL ES 的帮助 - 我想更改 mp3 歌曲的音高。我使用的代码在这里:Android : How to change Playback Rate of music using OpenSL ES但是在这个例子中它被注释了。如果我取消注释它 - 它不会工作。执行代码后

uriPlaybackPitch == NULL

LogCat 是:

0 投票
1 回答
452 浏览

android - 我可以在 OpenSL SE for Android 中创建多少个 PCM AudioPlayer

我只知道我们可以在 OpenSL SE Android 中创建 32 个对象,但是当我使用以下代码创建 PCM AudioPlayer 时,在创建第 11 个 AudioPlayer 时出现错误。AudioPlayer可以正常使用,声音可以正常播放。但为什么我不能一次创造更多。

任何人都遇到过同样的问题,请帮助我。谢谢。

我的源代码是:

错误日志是: