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

android - Android OpenSL ES AAC 解码器

是否有任何示例源代码如何使用 Android OpenSL ES AAC 解码器代码将 AAC 帧解码为 PCM?我需要将存储在内存缓冲区中的 AAC 帧(带或不带 ADTS 标头)解码为 PCM。

0 投票
0 回答
275 浏览

android - Android 遇到 CAudioPlayer 的未知 AudioTrack 事件 5

我正在使用 OpenSL 在 Android 上播放声音。我不断收到此错误:遇到 CAudioPlayer 的未知 AudioTrack 事件 5。根据 android_AudioPlayer.cpp,这不应该发生,因为值 5 (EVENT_BUFFER_END) 不被视为错误。我使用安卓 4.1.1。

0 投票
2 回答
2020 浏览

android - 带有 3D 音频的 OpenSLES

OpenSLES 规范 1.0.1 演示了 3D 音频的实现。我的兴趣是指定 3D 音频源的位置。

我尝试在 android 14 中实现它,但结果是“SL_RESULT_FEATURE_UNSUPPORTED”。正如此链接中所述,OpenSL ES 中的 3D 声音功能(如 3D 位置、侦听器)以及一般所有 3D 功能都需要设置 USE_PROFILES_GAME。

因为 OpenSLES 不是一个独立的实体并且依赖于其他系统库(如 wilhelm.so),所以我无法真正独立地编译该库。所以我下载了整个android源,设置了USE_PROFILES_GAME标志,在Android.mk中包含默认排除的3D相关类,然后构建新系统。

现在使用新的 android 系统映像,我可以获得位置推断,但它似乎不起作用,即我感觉不到源音频的位置发生变化。

有没有人在 android 中成功实现过 3D 音频功能(尤其是 3D 音频位置)?3D 音频功能是否对移动硬件有任何依赖性?

任何帮助表示赞赏。

0 投票
7 回答
40082 浏览

android - Android 上的低延迟音频播放

我目前正在尝试最小化一个简单应用程序的音频延迟:

我在 PC 上有一个视频,我正在通过 RTP 将视频的音频传输到移动客户端。使用非常相似的缓冲算法,我可以在 iOS 上实现 90ms 的延迟,但在 Android 上却是可怕的 ±180ms。

我猜这种差异源于Android 上众所周知的延迟问题

然而,在阅读了一会之后,我发现了这篇文章,其中指出:

  1. 自 Android 4.1/4.2 起,某些设备可以使用低延迟音频。

  2. 使用 libpd 可以实现低延迟音频,它是 Android 的纯数据库

我有 2 个问题,与这 2 个陈述直接相关:

  1. 在哪里可以找到有关 Jellybean 中新的低延迟音频的更多信息?这就是我能找到的全部,但它非常缺乏具体的信息。这些更改对我来说应该是透明的,还是我应该实施一些新的类/API 调用以让我注意到我的应用程序中的任何更改?我正在使用 AudioTrack API,我什至不确定它是否应该从这种改进中受益,或者我是否应该研究一些其他的音频播放机制。

  2. 我应该考虑使用 libpd 吗?在我看来,这是实现更低延迟的唯一机会,但由于我一直认为 PD 是一种音频合成实用程序,它真的适合从网络流中抓取帧并播放它们的项目吗? ? 我并没有真正进行任何合成。我走错路了吗?

作为附加说明,在有人提到 OpenSL ES 之前,这篇文章非常清楚地表明,使用它应该不会改善延迟

“由于 OpenSL ES 是本机 C API,调用 OpenSL ES 的非 Dalvik 应用程序线程没有与 Dalvik 相关的开销,例如垃圾收集暂停。但是,除此之外,使用 OpenSL ES 没有额外的性能优势。在特别是,使用 OpenSL ES 不会导致比平台通常提供的更低的音频延迟、更高的调度优先级等。”

0 投票
1 回答
773 浏览

android - 支持的音频效果

我正在尝试确定正在运行的设备支持哪些 OpenSL ES 效果。

Andorid SDK 的 AudioEffect 类提供了这样做的方法。

public static Descriptor[] queryEffects ()

我的问题是,鉴于该方法返回的所有AudioEffect.Descriptor,我不知道如何确定其中一个是否真的是我需要的。

公共 UUID 类型

在 API 级别 9 中添加 表示效果的通用类型(均衡器、低音增强...)。UUID 对应于此类效果的 OpenSL ES 接口 ID。

type属性似乎是我应该使用的属性,但我找不到指定所有效果类型 UUID 的 OpenSL ES 参考。

你知道我在哪里可以找到吗?

我可以找到在设备上测试方法结果的 UUID,但是,

我可以假设 UUID 在每个设备上对于特定类型的效果总是相同的吗?

提前致谢

0 投票
1 回答
3374 浏览

android - 将简单的音频过滤器连接到 android 下播放的音乐

我正在尝试构建一个应用程序,该应用程序使用数字过滤器来处理从其他(股票音乐播放器和 spotify 等)应用程序播放的音频。

到目前为止,我已经能够在 OpenSL ES 中为来自麦克风的音频输入创建过滤器。然后将过滤后的音频发送到硬件输出。该应用程序基于此教程http://audioprograming.wordpress.com/2012/03/03/android-audio-streaming-with-opensl-es-and-the-ndk/

如何从其他应用程序获取类似的输入缓冲区,以便在将其发送到硬件输出之前对其进行处理?

它不需要使用 OpenSL ES 或其他本机代码。澄清; 该应用程序应该以与android.media.audiofx.AudioEffect类似的方式应用自定义过滤器效果,然后才可以将其附加到全局音频输出混合(音频会话 0)。

0 投票
1 回答
1348 浏览

android - Android - OpenSL ES 高麦克风增益

我在此链接中描述了类似的问题:

OpenSL 中的 RecorderObject 没有实现在 Android 上设置音量或配置的接口

问题是我无法在录音机上设置音量,因为 Android 中的 OpenSL ES 不支持获取录音机的音量接口。对于大多数手机来说这不是问题,但如果您对着麦克风大声说话,某些手机(例如三星 Note 2)捕获的音频会严重失真。

是否有任何解决方法可以调整 OpenSL ES 中捕获的音频的音量?

0 投票
2 回答
595 浏览

android - Android 2.3.4、OpenSL ES 和大量垃圾日志,原因不明

我创建的一个应用程序会在客户的设备上引发大量垃圾日志:

我在 NDK 环境中使用 OpenSL 来生成实时音频。每次我使用 SLAndroidSimpleBufferQueueItf 的 Enqueue() 函数时,android 都会创建一个日志条目,因为该调用会隐式调用音频接口上的 play()。

这看起来像这样:

这就是我将新的音频缓冲区排入 OpenSLES 的方式:

OpenSLES 不会抱怨该调用并返回 SL_RESULT_SUCCESS。

我用谷歌搜索了一下,发现日志条目来自 Android 源 AudioTrack,我在这里找到了它:

https://android.googlesource.com/platform/frameworks/base/+/android-2.2.3_r2.1/media/libmedia/AudioTrack.cpp

start() 函数的开头是日志记录:

但是,是什么让 OpenSL 在每次新缓冲区入队时都隐式调用 play() 呢?我在这里查看了 OpenSL 的规范:http ://www.khronos.org/registry/sles/specs/OpenSL_ES_Specification_1.0.1.pdf

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

由于手机没有噼啪作响,我认为音频仍然可以很好地播放,并且文档中的这个描述对我来说听起来好像它们总是隐式地开始播放,这实际上意味着我没有机会阻止这种日志垃圾邮件。

有任何想法吗?

0 投票
1 回答
1076 浏览

android - NDK OpenSL ES,使用 URI(非缓冲)播放器无缝循环声音

为了使用 OpenSL ES 的 URI 播放器获得无缝循环,我尝试运行代码,取自这个问题(查询音频的长度):

结果我得到-1,无论如何。

除了整个文件循环工作之外,我似乎什么也做不了。当我设置循环时:

然后查询循环点:

我得到“开始:0 结束:-1”,文件从头到尾循环,而不是仅仅循环一小部分(这就是我所追求的)。这里的文档只提到了整个文件循环:

寻找

SetLoop 启用整个文件循环。startPos 参数应为零,endPos 参数应为 SL_TIME_UNKNOWN。

但它并没有具体说明不支持循环文件的一部分。有没有人在这方面取得任何成功?或者可以验证 OpenSL ES Android 实现不支持此功能?

0 投票
1 回答
1076 浏览

android - 在 Android 中同时流式传输多个 OGG

我需要能够同时播放两个或更多(比如说,最多 5 个)短 ogg 文件。同时,我的意思是完美同步。我可以将它们加载到 SoundPool 并播放,但这有时会在播放开始时间上产生明显的差异,我想摆脱这种差异。

据我了解,如果将 PCM 混合到一个缓冲区中并播放,则可以避免这种情况。但是 OGG 不是 PCM,需要在播放前以某种方式有效地解码,并且延迟必须非常低,理想情况下,只要用户按下按钮。所以我想我需要一种将 OGG 流式传输到 PCM 的方法,当我收到缓冲区时,我会将它们混合并馈送到 AudioTrack。我的要求是 Android 2.3.3+,所以我不能使用 Jelly Bean 中提供的任何新编解码器。

此外,虽然 OGG 本身很小,但数量很多。因此,将它们全部解码在内存中(SoundPool 或一些预解码)也可能会出现问题。

有人可以给我提示在哪里挖掘吗?OpenSL ES 可以为我做到这一点吗?还是我应该考虑集成ffmpeg?甚至可以以低延迟流式传输同步文件吗?

谢谢