问题标签 [oboe]

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 回答
174 浏览

android - Flutter 中的同步(高性能)音频播放是否可能/现实?

类似的问题在 Flutter 应用程序中使用 Android NDK 中的 AssetManager 类 通过 Flutter 从 C++ 插件访问资产 已被询问,而不是寻求技术答案,我正在寻求指导。

(这也是我在这里的第一个问题,所以如果我做错了什么请宽恕:))

基本上我需要能够在这个应用程序中完美地同步播放多个音频和视频文件。经过一番研究,我开始学习 android Oboe,因为这可以解决我所有的问题。确实如此……除了使用 FFI 在 Flutter 和 Oboe 之间进行通信之外,这简直是个麻烦事,最终会导致性能问题,因为必须在 Dart 主线程上进行 c->dart 调用。所以我的问题是......我应该继续使用 Flutter 并尝试让它与一堆废话连篇,还是应该放弃 Flutter 并转为原生?在我看来,除了我缺乏知识之外,目前 Flutter 存在一个限制,需要我为自己想做的事情而去本地化。
这是真的还是假的?我能否在 Flutter 应用程序中实现高性能音频?除了可能之外,为此使用 Flutter 是否真的是一个好主意,还是只会让代码维护成为一场灾难?

谢谢!达诺

0 投票
1 回答
235 浏览

android - 在 Android 中构建和使用 Oboe Resampler

我正在尝试将 Oboe Resampler 集成到我的 android 应用程序中。

https://github.com/google/oboe/tree/master/src/flowgraph/resampler

这个想法是将带有 32000 采样率的音频的 ByteBuffer 转换为具有 44100 采样率的音频。

我应该如何构建 C++ 库以及如何在我的 android 应用程序中集成和重新采样?有人可以分享一些片段或链接到这个 c++ 库的已构建版本吗?

0 投票
1 回答
117 浏览

java - 为什么 Java AudioEffect 不能与双簧管一起使用?

Android 版本:10 Android 设备:OnePlus 6

我曾尝试使用 AudioManager 中的 sessionID 应用 Java AudioEffect 以获取此LINK的帮助,但在使用AcousticEchoCanceler.create(sessionId)时我总是得到空指针异常;但是当我传递 Java AudioRecord getAudioSessionId()的 sessionId 时,它可以工作。

我的代码是:

C代码是

我已经在 OnePlus 6 和 Motorola one Macro 上尝试过此代码

0 投票
0 回答
58 浏览

android - AudioStream::getTimestamp 的线程不安全是什么?

Oboe 文档说某些函数是线程不安全的,建议使用互斥锁进行保护。https://github.com/google/oboe/blob/master/docs/FullGuide.md#thread-safety

getTimestamp 是一个吸气剂。你能澄清一下到底什么是线程不安全的吗?是否根本不能保证线程之间单调递增?在设置某些基础状态和 AAudio 读取的状态之间是否存在实际的竞争条件?getTimestamp 是否以某种不安全的方式修改底层流的状态?

我找不到 getTimestamp 的实现。似乎 AAudio 询问音频流https://android.googlesource.com/platform/frameworks/av/+/master/media/libaaudio/src/core/AAudioAudio.cpp#519。但是音频流询问AAudio?https://android.googlesource.com/platform/frameworks/av/+/master/media/libaaudio/src/core/AudioStream.h#99

--

编辑:你能澄清一下如何保证线程安全吗?我理解为共享内存锁定互斥锁的愿望,但这只是一种选择(1)如果您可以容忍锁定,并且(2)可以访问共享互斥锁。是否有保护内存的共享互斥锁或内存栅栏?通常对于音频应用程序,我们不能容忍在音频回调中锁定,那么有无锁定解决方案吗?

本文建议数据可能写入在另一个 CPU https://linux.die.net/man/3/clock_gettime上无法安全读取的寄存器中。getTimestamp 是否使用此实现?你能澄清谁写入任何保存时间戳的内存吗?有什么方法可以确保调用者在同一个 CPU 上调用并且它为时间戳提供真实值?

0 投票
0 回答
124 浏览

android - 是否可以在使用 MediaRecorder 录制视频/音频的同时使用双簧管进行音频 I/O?

我正在开发一个 Android 音乐协作应用程序,音乐家可以在其中插入他们的乐器,聆听列表中的曲目并与它一起演奏。尽管该应用程序完全使用 Java,但一切正常。音频/视频由 MediaRecorder 处理,延迟由用户在混合前手动调整。我试图解决的问题是在录音过程中“现场”演奏乐器的能力。为此,我使用 Obeo 的 LiveEffect 模块来获得低延迟音频。在我开始使用 MediaRecorder 录制视频和音频之前,这似乎可以正常工作。这是现场音频产生明显延迟的时候。有人可以向我解释为什么这是一个坏主意。如果是这样,我可以做些什么来解决这个问题。非常感谢您的参与!

0 投票
0 回答
37 浏览

android - 是否可以使用 Oboe 或其他库将 Android 手机的 DAC 设置为使用 24 位或 32 位?

我制作了一个正弦波音调发生器,并用双簧管实现了一个播放管理器。我将浮点设置为音频格式,但是当使用声音分析器读取输出信号时,我得到了 90 dB 的动态范围。理论上,Android 支持 24 位和 32 位音频(https://source.android.com/devices/audio/data_formats#androidFormats),但我不知道这是否取决于设备、dac 还是我应该尝试另一个库。

有没有人成功尝试播放动态范围大于 90 分贝的音频?

0 投票
2 回答
79 浏览

android - 双簧管 Systrace 是否被视为欠载的非完整缓冲区?

我正在使用双簧管库来制作音乐应用程序。在那里,我通过将 PCM 浮点值写入给定的指针来制作音乐。我很少听到我能听到的underruns。我还使用以下双簧管 API 验证了这一点:

文档说以下内容:

我正在尝试调试问题。我发现了 Don 的这个很棒的教程。我使用以下内容捕获了 10 秒的 systrace,请注意,在这 10 秒内,我听到了 0 个可听的欠载弹出/点击声音:

systrace.py --time=10 -o trace.html -a com.example.app 音频调度频率

调用结果如下aaRdy(蓝色框高度显示缓冲区中有多少样本,需要的样本越多高度越高): 在此处输入图像描述 这只是 aaRdy 调用的一小部分。我的缓冲区永远不会有 0 个样本。我检查了所有的。在唐写的文章中,他说:

但随后缓冲区开始为空,首先下降到 96 帧,然后……哦,天哪……到零!在零时,我们保证会出现音频故障,因为缓冲区中没有数据。

这是文章的截图: 在此处输入图像描述

我的问题是看这篇文章,我可以保证如果蓝框是空的,那么就会出现欠载。但是,在我的 systrace 中,它永远不会是空的,而且我没有听到没有运行不足的弹出点击,但managedStream->getXRunCount();实际上返回了调用12。我不确定是否存在欠载。

蓝框的减少是否意味着即使它不是 0 也存在欠载?

0 投票
1 回答
293 浏览

android - 如何使用 Android Oboe 库处理扬声器更改?

我正在尝试在我的项目中实现双簧管库,以在播放声音时执行最少的延迟。我可以执行播放操作,平移,混合,内部 Android 库等SoundPool可以提供的基本功能。

我想测试平移效果,我将耳机连接到我的设备,但随后,我注意到任何声音都没有通过我的耳机播放。设备扬声器也没有播放任何声音。因此,我断开耳机以检查是否出现问题。我按下了声音播放按钮,但即使耳机与设备完全断开连接,我也听不到任何声音。

当我第一次打开应用程序时,它可以通过设备扬声器播放声音,没有任何问题,但是一旦我连接耳机,设备扬声器和耳机都没有声音。

反之亦然,如果我用连接到设备的耳机启动应用程序,它可以通过耳机很好地播放声音。它甚至可以执行平移效果,但如果我断开耳机与设备的连接,它会停止播放任何声音。

  1. 每当更改首选音频设备时,我是否必须重新打开音频流?
  2. 如果是 1,有没有办法通知应用程序音频设备已更改,以便我可以手动关闭流并重新打开它?或者我可以让双簧管自动处理音频设备的变化吗?
0 投票
1 回答
31 浏览

android - 如何计算往返行程和运行测试是否需要 3.5mm 适配器

嗨,你能告诉双簧管的实现如何计算往返吗?

对于往返测试环境,根据https://github.com/google/oboe/blob/master/apps/OboeTester/docs/Usage.md

其中一些测试需要插入 3.5 毫米插孔的音频环回适配器。如果手机没有 3.5 毫米插孔,则可以将其与 USB 转 3.5 毫米适配器结合使用。

真的需要吗?在安静的测试环境中,我仍然可以在没有环回适配器的情况下得到延迟结果,这个结果是错误的吗?在我的安卓手机(oneplus 8,Android 10,CPU:Qualcomm 865,8GB+128GB)中,我得到了latency.msec = 35.xx。

0 投票
1 回答
63 浏览

android - 如果要渲染的数据过多,双簧管会停止渲染音频

我正在尝试在我的应用程序中实现双簧管库,这样我就可以执行低延迟音频播放。我可以执行平移、播放操作、声音缩放等。我一直在问关于这个主题的几个问题,因为我对音频世界完全陌生。

现在我可以执行内部 Android 音频类SoundPool提供的基本操作。我可以同时播放多个声音而没有明显的延迟。

但是现在我遇到了另一个问题。所以我做了一个非常简单的应用程序,例如;屏幕上有按钮,如果用户点击此屏幕,它会播放简单的钢琴声。无论用户快速点击此按钮,它都必须能够混合相同的钢琴声音,就像所做的SoundPool那样。

我的代码可以很好地做到这一点,直到我点击按钮太多次,所以有很多音频队列要混合。

OggPlayer保存解码后的 PCM 数据,defulatPitch以同步扬声器的采样率和音频文件的采样率。每个都OggPlayer拥有自己的 PCM 数据(意味着每个音频文件的数据),并且拥有自己的PlayerQueue. PlayerQueue是实际呈现音频数据的类。OggPlayerPlayerQueue类的 PCM 数据提供者。PlayerQueue有自己的自定义音高、平移和音频比例值。由于AudioStream可以在回调方法中提供有限大小的数组,我添加了offset,因此PlayerQueue可以在下一个会话中继续渲染音频而不会丢失其状态。

这就是我目前渲染音频数据的方式,我通过每个向量寻找OggPlayerPlayerQueue如果它们还没有到达 PCM 数据数组的末尾,则通过传递数组的指针使它们渲染音频数据。我在完成音频数据后平滑音频数据,以防止剪辑或其他事情。如果队列完成渲染音频(完全),则最后从向量中删除队列。

我在一个会话中渲染队列中的所有内容(平移、播放、缩放),同时考虑扬声器和音频文件的状态(单声道或立体声)

最后在 中OggPianoEngine,我放了 的向量OggPlayer,所以我的应用程序可以在内存中保存多个声音,使用户可以添加声音,也可以随时随地播放它们。

在引擎中渲染音频非常简单,正如您所料,我只是通过 vectorOggPlayer和 callrenderAudio方法来寻找。下面的代码是我如何初始化AudioStream.

由于我观看了类似thisthis的双簧管基本视频指南,因此我尝试配置 LowLatency 模式的基本设置(例如,将设置缓冲区大小设置为突发大小乘以 2)。但是当队列太多时,音频开始停止渲染。起初,声音开始结结巴巴。感觉就像它跳过了一些渲染会话,然后如果我在此之后再次点击播放按钮,它会完全停止渲染。我等了一会儿(5~10秒,有足够的时间等待队列被清空)后它再次开始渲染。所以我有几个问题

  1. 如果像上述情况那样渲染音频需要太多时间,双簧管是否会停止渲染音频?
  2. 我是否达到了渲染音频的限制,这意味着只有限制队列数量才是解决方案?或者有什么方法可以达到更好的性能?

这些代码在我的颤振插件中,所以你可以从这个github链接获得完整的代码