问题标签 [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 回答
1092 浏览

android - openssl es : 音频回调模式

我正在一些 Android 平台 (>= 4.1.1) 上工作,其中 openSL ES 音频驱动程序表现出非常不规则的回调模式。

我的期望是,如果我将音频驱动程序配置为每 10 毫秒给我一次回调,我会大约每 10 毫秒得到一次回调(给或需要几毫秒)。理想情况下,回调模式看起来像这样:

t = 0ms : 扬声器回调

t = 1ms : 麦克风回调

t = 10ms : 扬声器回调

t = 11ms : 麦克风回调

t = 20ms : 扬声器回调

t = 21ms : 麦克风回调

t = 30ms : 扬声器回调

t = 31ms : 麦克风回调

麦克风回调获取接收到的麦克风数据并将其写入环形缓冲区。然后它向另一个线程发送一个“信号”以唤醒并处理麦克风数据。麦克风数据的处理会产生 10ms 的说话人数据。该扬声器数据被写入扬声器环缓冲区,扬声器回调从中读取。

如果回调模式看起来像我上面描述的扬声器和麦克风回调轮流进行的情况,那么一切正常。

但是,如果回调模式不规则,事情就会开始变得混乱。例如:一连串的麦克风回调将推动扬声器环形缓冲区的大小通过屋顶。如果我 - 无论出于何种原因 - 没有得到相同类型的扬声器回调突发,我突然在扬声器路径中有很大的延迟。

另一个问题是,如果我收到大量的扬声器回调。在这种情况下,扬声器环形缓冲区将耗尽样本,我将不得不返回静音数据包。

所以我想知道这类问题是否有某种标准解决方案?我什么都想不出来。

以下链接是回调模式的示例:

http://wikisend.com/download/143908/timestamps.txt

其中“1”是麦克风回调,“2”是扬声器回调。

0 投票
1 回答
409 浏览

android - “错过位置的 SL_PLAYEVENT_HEADATNEWPOS”消息

我使用 OpenSL ES 编写了一个音乐播放器。libOpenSLES除了从库中发出一条警告消息外,它工作正常。这是消息。

当我寻找媒体轨道时,它就出现了。有时我可以在没有警告的情况下进行搜索,有时该消息会出现在日志中。

实现非常简单。在初始化时,我选择了寻找控制。

然后,当用户更改轨道位置时,我调用SetPosition如下方法。

两个调用都返回成功结果,并且位置更改也一直有效。唯一的问题是上面提到的警告消息。

任何想法为什么会出现此消息以及如何避免它?

更新:

虽然一半的赏金是自动分配的,但问题还没有回答。我们不知道是什么导致了这个问题以及如何避免它。

0 投票
1 回答
1596 浏览

android - 使用 OpenSL 的所有安卓设备以 8KHz 采样率进行语音通信

我需要创建一个 VOIP 应用程序并且我正在使用 OpenSL ES。我需要为所有 android 设备以 8KHz 采样率捕获和播放 pcm 音频数据。但是,当我以 8KHz 采样率捕获音频并同时播放(语音通信)时,它会产生噪音,并且对于三星 Galaxy S3、S4 等某些设备,音频会失真。我知道,有一个特定的首选采样率对于每个设备,我想知道是否有任何解决方法或任何方法可以仅使用 8KHz 采样率而没有任何失真?

我尝试增加缓冲区大小和许多其他事情,但未能找到最佳和通用的解决方案。我的编码器和解码器需要以 8KHz 采样的音频数据。作为我的第二个想法,我在将音频数据传递给我的编码器或解码器之前对其进行了重新采样,但这不是我正在寻找的解决方案。

我发现 CSipSimple 使用了 OpenSL,并且我也浏览了他们的一些代码。但是,我找不到解决方案,可能是我不明白该集中在哪里。我被困在这里了!

0 投票
1 回答
2307 浏览

android - 在屏幕锁定/唤醒期间遇到 Android 音频卡顿

我正在开发一个以音频播放为中心的 Android 应用程序,我遇到了一些不稳定的行为(音频卡顿和打嗝),我怀疑这可能是某些设备、操作系统版本或设备的本机缓冲区大小所固有的。

关于我的实现 - 我需要低延迟,所以我在 OpenSL ES 回调中处理我的音频,并使用 128 个样本的相当小的缓冲区大小将缓冲区排入队列。我在回调期间进行 mp3 解码,但由于我的环形缓冲区大小,我不需要在每个回调周期中解码。

我正在使用远程测试服务来衡量各种设备和操作系统版本上的音频播放质量,这里有一些我发现的不一致的例子。

  • 配备 Android 4.4 的三星 Galaxy S4 - 没有音频播放问题
  • 配备 Android 4.3 的三星 Galaxy S4 - 用户在锁定/解锁设备时会遇到音频中断/卡顿
  • 三星 Galaxy Note 2 w/Android 4.1.2 - 没问题
  • 三星 Galaxy Note 2 w/Android 4.3 - 播放期间音频丢失,锁定/解锁屏幕时卡顿。

就个人而言,我有一个配备 4.1.2 的 Galaxy S3 和一个配备 4.4 的 Nexus 5,并且从未遇到过这些问题。我也有一些较旧的 2.3.7 设备不会出现这些问题(2010 Droid Incredible、LG Optimus Elite)。

我相当有信心我不会过度使用处理器,因为我可以在较旧的 Gingerbread 设备上运行它。

我的问题:

  1. 如果我将我的基本 SDK 提升到 4.2,我可以从硬件检测本机缓冲区大小,并在我的缓冲区队列回调期间使用其中的一些倍数。在出现口吃和辍学问题的情况下,尤其是在屏幕锁定期间,这会产生很大的不同吗?
  2. Android 4.3 中是否存在音频播放受到影响的已知错误,尤其是在屏幕锁定操作期间?这可能只是三星的问题吗?
  3. 还有其他提高性能的方法来避免这个问题吗?我的应用程序绝对需要 OpenSL ES。

谢谢。

0 投票
1 回答
727 浏览

java - 如何将文件传递给 JNI 以在 OpenSL ES AudioPlayer 中播放?

我正在尝试创建 AudioPlayer(根据 Native-Audio NDK 示例),但不使用 AssetManager,因为要播放的文件是动态下载的,因此不会打包为资产。

所以我想知道是否可以将 Java 中的 FileDescriptor 传递给 JNI,以便在下面的示例 JNI 代码(不使用 AssetManager)这样的情况下使用:

不幸的是,在 Java 方面,FileDescriptor 是一个类,而不是 SLDataLocator_AndroidFD 使用的 int (SLuint32)。

下面的构造函数:

任何帮助,将不胜感激!

0 投票
1 回答
2353 浏览

android - OpenSL ES Android:“对象太多”SL_RESULT_MEMORY_FAILURE

我在 Android 上遇到了 OpenSL ES 的问题。我正在使用 OpenSL 播放音效。目前,我每次播放声音时都会创建一个新播放器。(我知道这不是非常有效,但暂时“足够好”。)

播放一段时间后,我开始收到这些错误:

我正在跟踪我的创建/销毁模式,并且在任何给定时间我都不会超过 4 个未完成的对象,远低于 32 的系统限制。当然,这是假设 Destroy 正常工作。

我现在唯一的猜测是我在清理播放器对象时做错了什么。一个可能的问题是 Destroy 经常在播放器回调的上下文中调用(基本上是在播放完播放器后销毁播放器),尽管我找不到任何参考表明这是一个问题。除了“销毁”播放器对象之外,我还应该采取其他清理步骤吗?接口是否也需要以某种方式清理?

- 添加 -

经过更多测试后,在创建第 30 个玩家之后,它始终如一地发生(还有一个引擎和一个混合,所以总共有 32 个对象)。所以我一定不能正确地破坏物体。这是代码-我很想知道出了什么问题:

0 投票
2 回答
1397 浏览

audio - Android OpenSL 示例不加载 libOpenSLES.so?

在本教程http://audioprograming.wordpress.com/2012/03/03/android-audio-streaming-with-opensl-es-and-的帮助下,我成功构建了一个使用 Android 中的 OpenSL 库的 Android NDK 应用程序 -ndk/

在 opensl_io.h 中说明了以下内容:

我想知道这是否会影响我的设备上的库/system/lib/libOpenSLES.so已加载。

我认为必须在某个时候加载该库,因为在 Android.mk 中有说明

ndk 文档告诉我,这意味着/system/lib/libOpenSLES.so而不是任何其他用于-lOpenSLES

所以我编写了一个具有超级用户权限的应用程序,该应用程序在该文件上有一个 FileWatcher。

但是,当我使用我的 OpenSL 示例时,似乎从未触及过该库。

对于其他库,例如/system/lib/libstdc++.so,我可以通过 FileWatcher 看到它们已加载。

所以我的问题是:为什么/system/lib/libOpenSLES.so不使用?

0 投票
1 回答
1223 浏览

android - OpenSL ES on android 播放率

我目前正在开发一个需要放慢音乐节奏的应用程序,我在网上搜索,在 android 中执行此操作的唯一真正选择是 OpenSL ES。我从基础开始,所以我刚刚播放了一个音频文件,但由于某种原因我无法改变节奏。我收到以下错误

我已经检查过该功能是否受支持,并且文档说支持,所以也许我的代码中有一些错误?我以前从未使用过 C++,因此感谢您的帮助。我的代码如下

任何帮助是极大的赞赏。谢谢

0 投票
0 回答
499 浏览

android - 在 Android Kit Kat 上访问和配置 Qualcomm MSM8960 音频 Api

我有几个关于 Android Kit Kat 上的 Qualcomm MSM 8960 的问题。

  1. 当我使用 openSL 在本机代码中录制/渲染音频时,将模式设置为 Java 中的 IN_CALL 时,Qualcomm MSM8960 回声消除器似乎正在运行。但是如果我将模式设置为 IN_COMMUNICATION,回声消除器似乎没有运行。所以我的问题是:在本机代码中调用 Qualcomm HW AGC、AEC 和噪声抑制器的正确方法是什么?

  2. 技术上是否可以直接在本机代码中配置 Qualcomm MSM 8960 音频子系统(绕过 openSL 和/或 Java 音频接口)?我希望我的代码尽可能接近硬件。

链接: https ://android.googlesource.com/platform/hardware/qcom/audio/+/android-4.4.2_r2/hal/msm8960/

0 投票
1 回答
847 浏览

android - 为什么openSL在使用麦克风时不报告???(安卓 4.4)

这是来自 logcat:

这是我的应用程序和“Hi-Q MP3 Recorder”(来自 Android 商店)之间的互操作问题。录音机正在后台录制麦克风音频,我启动我的应用程序来录制麦克风音频。

AudioPolicyManagerALSA 告诉我麦克风正在使用中,但消息不会通过 AudioRecord 传播到 openSL(因为它应该,对吗?)。如您所见,AudioRecord 也知道正在使用的麦克风!但是openSL什么也没告诉我!

当您使用 openSL 音频 API 时,如何检测麦克风是否正在使用?

这是一个已知的错误?