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

crash - OpenSL ES RegisterCallback 导致崩溃

我必须在我的项目中使用 OpenSL(尝试过 Soundpool,但它一点都不好)。但是,在多次播放声音后(大约连续 35 次),应用程序被关闭(我猜可能是因为溢出)。

我试图释放缓冲区/内存来解决问题(看在上帝的份上,我不知道如何使用这个 OpenSL)。所以我决定在文件播放完毕后尝试释放。OpenSL ES 为我们提供了RegisterCallback可能有所帮助的功能。在我的情况下(使用 URI 文件)发生了新问题,RegisterCallback导致我的应用程序再次崩溃。它卡住了。

这是我的代码。请帮忙。紧接着就崩溃了//register callback for uri

0 投票
0 回答
249 浏览

android - 如何将辅助效果附加到全局输出组合?

如何通过 OpenSL 将混响和包络混响效果附加到全局输出组合?

0 投票
2 回答
217 浏览

perl - 使用反引号 Perl 捕获 SSL 输出

我可能只是简单地看待这个问题,我不确定我想做的事情是否可行,但希望这可以节省大量时间,不必读入和读出不同的文件。

我想做的是使用反引号来接收 OpenSLL exe 的输出,它将加密字符串的某个部分。然后使用输出将其添加到另一个文件中。OpenSLL 会自动输出到一个文本文件。

例如:

届时将

我知道这可以通过读入和解析加密文本然后将输出附加到一个新文件来完成,但是当我希望对 100 或 1000 行执行此操作时,我希望避免这种情况,因为这将是很多额外的加工。

希望您能看到我的想法,如果有人可以提供帮助,将不胜感激。

0 投票
3 回答
1678 浏览

android - Android 上的 OpenSL ES 替代方案

我正在为需要的 android 构建一个应用程序,将队列播放器中的 pcm 数据作为浮点数播放。据我所知,这是不可能的。描述

SL_DATAFORMAT_PCM 不允许应用程序将数据的表示形式指定为有符号整数、无符号整数或浮点数。Android 实现假定 8 位数据是无符号整数,而 16 位数据是有符号整数。此外,字段 samplesPerSec 是用词不当,因为实际单位是毫赫兹。这些问题预计将在下一个 OpenSL ES 版本中得到解决,该版本将引入一种新的扩展 PCM 数据格式,允许应用程序明确指定表示,并更正字段名称。由于这将是一种新的数据格式,并且当前的 PCM 数据格式仍然可用(尽管已弃用),因此不需要立即更改您的代码。

有没有机会通过 openssl es (1.0.1) 完成这项工作,或者对于 android ndk 是否有替代 opensl es 的方法?

0 投票
0 回答
788 浏览

android - Android AlertDialog 在显示几秒钟后冻结应用程序 - 原因似乎与 OpenSL 有关

好的,我尝试了我可以找到的“一切”并阅读了我搜索的所有内容,问题很简单,但我无法理解问题所在。

我正在使用 NDK(CPP 中的本机代码)。

我有一个非常简单的 Activity,它有一个 OpenGL GLSurfaceView,其中完成了一些非常简单的渲染,在某些时候我希望能够用两个按钮打开一个简单的 AlertDialog。

现在我尝试了许多不同的方法,基本上都陷入了这样的想法:“一条消息被发布到一个 Java 线程,该线程只是轮询消息,然后当它收到一个消息时,它会使用 Handler 向运行的主 UI 线程发布一条消息创建 AlertDialog 的消息处理程序”。

我尝试了其他一些方法,包括通过向 GLSurfaceView 的 onTouchEvent() 函数内的 Handler 发布一条消息来做 - 用于测试 - “全部来自 Java”,如下面的代码片段所示:

接收消息的处理程序执行以下操作:

发生的事情是出现了 AlertDialog,一切似乎都正常,但几秒钟后一切都冻结了,没有错误消息,什么都没有,但即使 GLSurfaceView() 上的渲染也停止了,因为不再调用 .step(),一切只是冻结停止而不显示任何类型的错误消息,并且几乎永远停留在那里和/或偶尔进入“应用程序无响应”。

这种行为似乎发生在 Nexus 7 平板电脑上,但在另一台平板电脑上我没有发生,但在我第 4 次或第 5 次启动/关闭对话框之后。

我唯一设法理解的事情似乎在某些时候停止接收各种触摸和/或就像“没有窗口”和/或某些窗口消失了,我真的不知道发生了什么。

我正在重新添加一些经过广泛测试后才发现的信息。

在获得经典的基本 OpenGL 示例后,简单地绘制一个三角形并将所有代码放回其中的那个发现它一切正常,所以回到第一方并在我的代码上重新尝试相同的示例,我开始将 #ifdef 放入在我找到“崩溃点”之前,各个地方都可以删除代码片段。

一段时间后我发现了这一点,似乎原因根本不在那段代码中,而是与我在后台工作的音频有关。

这是一个非常简单的基于 OpenSL 的播放器和一个播放器对象,它在循环中连续播放一个循环缓冲区,其中混合了样本,似乎一切都归结为这段代码:

AUDIO_DATA_CHUNK_SIZE 是 128,这个东西被设计成循环播放一个循环缓冲区,其中混合了样本,它不断播放(采样率 11.025 Khz)。

如果我在 Alertdialog 启动时禁用播放声音,一切都会完美无缺。

不知道到底发生了什么,除非在某些时候你可以看到这种情况发生:

似乎在某种程度上,音频播放会干扰输入。

0 投票
1 回答
1274 浏览

android - Android NDK,OpenSL ES - 知道缓冲区何时被填满

如果我将一个缓冲区排入队列以记录到缓冲区队列中 - 有没有办法知道该缓冲区何时被实际填充,所以我可以使用它?

同样,有没有办法知道缓冲区何时播放?

对于上下文:我正在修改名为“native-audio”的 NDK 示例。它使用 SLAndroidSimpleBufferQueueItf 进行播放,并评论说,对于我想做的流记录,也应该使用这样的队列。现在我想知道,因为从我记得在某处读过的内容来看,不能保证在下一次录制回调调用时缓冲区已被填充(或在播放回调中播放,就此而言) - 人们怎么知道什么时候缓冲区已被使用?肯定有什么办法,否则这一切都会有点没用?^^

0 投票
2 回答
7216 浏览

android - 使用opensl es和android ndk实时播放音频

我想做的是录制一个声音,处理它就像为录制的音频添加一些效果,然后使用opensl尽可能快地重放它。我很难在网上找到关于做这样的事情的信息,所以我实际上有几个问题。

我查看了 android 原生音频示例,以及以 android ndk 开头的书,这让我开始使用 opensl,但它们并没有真正帮助我很好地理解录音。

1)首先,要立即播放录制的音频,我是否能够从播放音频的线程中读取缓冲区,同时录制线程正在写入缓冲区?我知道有人可能会为这个想法发疯,因为同时通过两个不同的线程访问内存中的某个对象的想法可能会导致问题,但如果确保记录线程总是在之前写入内存播放音频线程,那有可能吗?

2)或者实时回放,我会使用带有两个或三个非常小的缓冲区的缓冲区队列,并且每次填充一个缓冲区时都会调用一个回调,然后在下一个缓冲区被录制填充时播放该缓冲区音频线程?但我正在阅读,有人说回调并不总是被调用(我发现的最有用的链接是:https ://groups.google.com/forum/#!msg/android-ndk/hLSygQrmcPI/qtwB76JNa_EJ ) . 另外,这意味着录制的音频和播放的音频之间的时间差将是缓冲区的大小加上回调让录制对象知道使用下一个缓冲区开始录制所需的时间。我认为录音机停止录音和重新开始录音之间会有一个差距。

3) android 录制缓冲区队列也是我理解问题的地方。我必须在android中使用缓冲区队列来录制音频吗?或者是否可以在不使用缓冲区队列的情况下直接记录到缓冲区?我对此有疑问,因为明确的方法SLAndroidSimpleBufferQueueItf实际上似乎不起作用。显然它是一个错误。而且我似乎无法在缓冲区已填充数据后对其进行记录。由于 clear 方法似乎不起作用,我如何告诉记录器要记录到队列中的哪个缓冲区?

我知道这有很多问题要问,而且我没有说出我尝试过的所有内容,但我希望有人对此有一些经验,可以为我和其他任何在回放录制时遇到问题的人提供一些启示使用opensl实时音频。

0 投票
1 回答
742 浏览

android - opensl 中的音频播放器可以输出到两个数据接收器吗?

音频播放器有什么方法可以输出到两个数据接收器?

更具体地说,我正在尝试使用将数据源设置为 uri 的音频播放器从网络将 mp3 流式传输到缓冲区和输出混合。现在我将音频播放器的接收器设置为只是一个输出混合,所以我可以流式传输这个文件并在预取说有足够的数据时播放它,但我也想把这个流式传输的数据同时放入缓冲区时间。

0 投票
1 回答
614 浏览

android - 从 uri 流式传输音频时,opensl 中的音频播放器缓冲区在哪里?

我正在尝试使用 opensl 从 uri 流式传输音频文件。我想立即播放它,但也可以在播放器播放完文件后访问流数据。

我知道数据在内存中的某个地方,因为我可以在流式音频播放期间使用搜索。此外,当播放器完成播放流式音频文件时,我会停止播放器,这会将播放器位置设置回“0”,在那里我可以再次开始播放音频。

我需要访问这些数据,但它在哪里?我能以某种方式获得指向它的指针吗?

0 投票
3 回答
2671 浏览

android - 在 Android 上使用 OpenSL ES 通过套接字通信流式传输 MP3 音频

我正在尝试通过接入点使用 WiFi 将 MP3 从 Android 手机流式传输到另一部 Android 手机。问题是 OpenSL ES 似乎只支持 PCM 音频缓冲区作为源(除非使用 URI)。与其在发送之前在“主”端解码一个潜在的巨大文件,我更愿意让“客户端”将 MP3 解码为 PCM。请记住,这必须在文件流传输时发生,而不是简单地发送整个文件然后解码。有没有办法使用 OpenSL ES 来完成这个?音轨?这似乎是一个相当普遍的要求。