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

android - 如何为双簧管库提供空白数据以播放声音?

有时我希望双簧管中的音频输出不播放任何内容,但我不希望它停止,我只希望它在没有数据到达时保持静音。我试过了:

但我在音频输出上听到嗡嗡声而不是静音。s数组不0应该保持沉默吗?我也试过-1.0f了,它给出了不同的嗡嗡声。

0 投票
0 回答
1002 浏览

android - Android,C++:如何使用双簧管的重采样器转换音频采样率

我正在使用双簧管在 Android 上播放声音文件。我有 44.1kHz 和 48kHz 文件,我希望能够在同一音频流上播放它们,因此我需要重新采样。

解码和播放文件工作正常,但由于我有两种不同的采样率,我需要重新采样(44.1 到 48 是我目前正在尝试的,因为我的音频流是 48kHz。)

所以我正在尝试使用双簧管的重采样器进行重采样,但我无法完全理解如何去做。按照用于转换固定数量的输入帧的自述指南(我认为这是我必须做的事情?),我尝试按如下方式实现。代码的第一部分获取解码并在采样率相等时返回(这部分按预期工作),第二部分是我在必要时尝试重新采样的地方:

重采样崩溃SIGSEV

以下是我的主要问题:首先,如何正确获取输入的帧数?帧究竟如何处理音频数据?我对此进行了研究,但我仍然不确定我得到了这个?这是一个常数吗?如何计算帧数。它与样本、采样率和比特率有何关联?

其次,我是否使用了正确的输入数据?我使用我的decodedData价值,因为那是我从解码器得到的,只是reinterpret_castfloat*

由于我对 C++ 相当缺乏经验,因此我不确定我所做的是否正确,并且我可能会在这段代码中引入多个错误。

编辑:由于我试图重新采样我的解码输出,我假设这里关于 PCM 的一些信息解释了这里的帧的含义

这对我来说是正确的吗?这意味着我可以从样本数、音频位的长度和通道数中减去帧数?

0 投票
1 回答
1755 浏览

android - 将音频(麦克风)输入共享到 Android 中的多个应用程序

根据官方文档

Android 10(API 级别 29)及更高版本实施了一种优先方案,可以在应用运行时在应用之间切换输入音频流。在大多数情况下,如果新应用获取音频输入,之前捕获的应用会继续运行,但会收到静音。在某些情况下,系统可以继续向两个应用程序传送音频。下面解释各种共享场景。

除某些特殊情况外,应用程序之间不共享音频。

但我见过许多应用程序共享音频输入,而不是上述特殊情况。例如。Zoom,当我在 Zoom 通话并启动录音机时,虽然缩放音频强度降低,但两个应用程序都在获取音频。

同样,即使其他应用程序可以访问麦克风, Omlet 街机也能够录制麦克风音频。

这怎么可能?根据文档,这是不允许的。

更新: 能够通过使用Oboe来实现它。但并非在所有设备上都一致。这也会导致我的直播应用程序出现同步问题。音频延迟可听

0 投票
0 回答
206 浏览

android - 双簧管(AAudio)流在物理设备上返回 ErrorUnavailable - 音频设备问题?

有问题的错误:

更新:我已将此问题缩小到物理设备,并且似乎有其原因的条件,但我还没有发现。它很少发生,所以很难确定。到目前为止,我注意到它发生在 Pixel 3a 和 Galaxy S9+ 上。

我偶尔会遇到这个错误,然后它会消失,我仍然没有找到解决它的方法或它发生的原因。我有几个怀疑,但后来我证明它们都是错误的,我又回到了原点。

我尝试通过以下方式重现此内容:

  • 打开/关闭蓝牙(工作一次,但无法重现)
  • 连接蓝牙耳机
  • 连接插入式耳机
  • 以上所有内容均以应用程序为焦点,并且在加载另一个应用程序时

要解决这个问题,我所要做的就是重新启动物理设备。

我的 Android Gradle Plugin 是4.0.1, Gradle 是6.1.1NDK 版本:21.0.6113669

我的使用和设置我的音频流:

调试信息:

我的怀疑是,由于我没有以编程方式定义播放方法(耳机、扬声器、蓝牙等),这种情况偶尔会发生,但我目前无法确认或知道这是否真的是问题所在。

0 投票
0 回答
158 浏览

android - 如何使用双簧管库实现混响算法?

嘿聪明的人 :) 我有一个音乐应用程序,我想为样本音频添加一些实时音效。如何通过代码创建“混响”或“延迟”效果?

我正在使用“双簧管库进行音频流传输。

我试图学习如何去做,但我不知道我做错了什么?

这是我的渲染代码:

谢谢!

0 投票
1 回答
386 浏览

android - C++,Android NDK:如何将我的原始音频数据正确保存到文件并再次加载

我正在开发一个播放音频的 Android 应用程序。为了最大限度地减少延迟,我通过 JNI 使用 C++ 来使用 C++ 库双簧管播放应用程序。

目前,在播放之前,应用程序必须解码给定的文件(例如 mp3),然后播放解码后的原始音频流。如果文件较大,这会导致播放开始前的等待时间。所以我想事先进行解码,保存它,当请求播放时,只需播放保存文件中的解码数据。我几乎不知道如何在 C++ 中进行正确的文件 i/o,并且很难理解它。有可能我的问题可以通过正确的库来解决,我不确定。

所以目前我正在像这样保存我的文件:

所以我相信我拿了我的浮点数组,将它转换为一个字符数组并保存它。我不确定这是否正确,但这是我对它的最佳理解。反正后面有个文件。 编辑:正如我在分析我保存的文件时发现的那样,我只存储了 8 个字节。

现在我如何再次加载这个文件并恢复我的 outputBuffer 的内容?

目前我有这一点,这显然是不完整的:

如果这是正确的,我该怎么做才能将数据恢复为原始类型?如果我做错了,它如何以正确的方式工作?

0 投票
1 回答
218 浏览

c++ - 双簧管 C++ 线程 - 如何在不阻塞的情况下读取和写入队列

我正在尝试使用双簧管为音频系统编写缓冲区,注意事项是

回调注意事项和注意事项您永远不应该执行可能在内部阻塞的操作onAudioReady。阻塞操作的例子包括:

例如,使用malloc()或 new 分配内存;

文件操作,例如打开、关闭、读取或写入;

流媒体等网络操作;

使用互斥锁或其他同步原语 sleep

停止或关闭流

调用read()write()在调用它的流上

音频线程从我的缓冲区读取,解码器线程写入它,你可以想象它在线程问题出现之前一切都很好。我的主要问题是我可以使用互斥锁来解决这个问题,但如果我这样做,我会阻止一个线程,如果音频线程被阻塞,那么声音基本上不会播放,导致“爆米花”声音。(一种听着很烦人的声音)

我通过一个回调来播放声音,我将数据提供给它。

所以我的主要问题是如何解决从音频线程读取数据也不阻塞音频线程以便它仍然可以播放音频的问题?

这对我来说听起来是不可能的。如果没有互斥锁,如何确保线程安全?双簧管如何期望您不使用互斥锁进行动态音频解码?

0 投票
1 回答
253 浏览

android - 如何使用 Oboe(用于 Android 低延迟音频的 C++ 库)从 DatagramPacket 接收 byte[] 缓冲区?

我想在 2 个 Android 设备之间通过 WiFi 进行音频直播。

为了减少音频延迟,应用 Oboe C++ 库似乎是一个正确的方向。

我目前的结构是使用 DatagramPacket 来传输和接收音频数据。保存传入数据报的缓冲区的数据类型是 byte[]。根据我的研究,我需要通过JNI(Java Native Interface)将数据从byte []缓冲区传递,然后将数据读入非阻塞队列?(例如:https ://github.com/google/oboe/blob/master/samples/RhythmGame/src/main/cpp/utils/LockFreeQueue.h )

如果我理解正确,C++ 中没有 byte[] 数据类型,所以我必须将 byte[](JNI 中的 jbyteArray)转换为数据类型(例如:int16_t)?

但是,我不太清楚如何实现这样的转换?还是我走错了方向?

任何建议或示例代码将不胜感激!

非常感谢!

0 投票
2 回答
68 浏览

android - 在 OBOE 中打开音频流时字段被覆盖

我正在使用 OBOE 构建一个声音应用程序。我在我的 AudioEngine.cpp 中定义了几个字段(audiosample - float,起始位置字段 - int 字段,样本长度字段 - int 字段等)但是当我打开时,其中一个字段(sample lengts - int 字段)被覆盖带有播放构建器的音频流。查看代码

logcat 的输出是:

注意:第 46 个元素的值 2393 正是我所期望的。它不是一个随机数。它使用下面的行进行初始化。但是,在打开流时它会被覆盖(实际上是整个字段)。

这是此特定字段的初始化代码 - sampleLengths_ 被覆盖:

任何提示为什么会发生这种情况?内存管理不好?非常感谢。j

0 投票
0 回答
388 浏览

android - 在 Cmdline-tools 中找不到预制双簧管 REQUIRED CONFIG(版本 6858069)

我在我的 CMakeLists.txt 文件中使用带有 find_package(oboe REQUIRED CONFIG) 行的预制件在我的 android 项目中实现了双簧管

在 Android Studio 4.1.1 中,我可以无缝地使用双簧管。

但是,在我检查拉取请求并执行一系列测试的 Jenkins 实例中,我目前在其最新版本(版本 6858069)上使用独立的 cmdline-tools,而不是 android studio 提供的 sdk,它看起来像预制件不工作或不存在。我收到以下错误。

构建命令失败。使用参数 {-C /var/jenkins_home/workspace/PR-Checker/audioLib/.cxx/cmake/release/armeabi-v7a clean} ninja 执行进程 /opt/android_sdk/cmake/3.10.2.4988404/bin/ninja 时出错:进入目录`/var/jenkins_home/workspace/PR-Checker/audioLib/.cxx/cmake/release/armeabi-v7a' [0/1] Re-running CMake... -- 配置不完整,出现错误!另请参阅“/var/jenkins_home/workspace/PR-Checker/audioLib/.cxx/cmake/release/armeabi-v7a/CMakeFiles/CMakeOutput.log”。失败:build.ninja /opt/android_sdk/cmake/3.10.2.4988404/bin/cmake -H/var/jenkins_home/workspace/PR-Checker/audioLib -B/var/jenkins_home/workspace/PR-Checker/audioLib/.cxx /cmake/release/armeabi-v7a

我的 CMakeLists.txt 文件包含:

我怎样才能让它工作?

我试图避免将双簧管添加为本地子模块,因为我的项目有其他开发人员,我也想让他们变得简单。我可以选择在编译之前使用 Jenkins 中的脚本更改 CMakeLists.txt 文件,但这意味着每次在我的 gradle 文件中更改时,我都必须更新 Jenkins 中的双簧管版本,所以如果有办法避免这种情况那会很好。

更新: 我已经设法通过下载双簧管库并使用替换文本的脚本将其包含在 CMakeLists.txt 中来使其工作。但是,这种方法打算在以后每次更新库时进行双重维护。所以我仍然需要使用gradle实现方式来解决这个问题。