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

android - 使用 Android.mk 构建 Android OBOE

我浏览了 AndroidC++高性能音频库的文档:OBOE。没有关于如何将库添加到使用Android.mk构建类型的 Android 项目的文档。

我正在寻找有关如何实现这一点的想法。

0 投票
1 回答
382 浏览

android - Android 双簧管库在一些设备上是滞后的

在我的 Android 应用程序中,我使用 Oboe 库和 Vorbisfile 库来提取、处理音频样本并将其重定向到音频输出。

为了简单起见,这里是我一直在做的事情的快速概述(在这里使用 hello-oboe 示例):

这段代码在大多数设备上都非常有效(我在 10 多台设备上进行了测试,包括 Galaxy S3 mini 或诺基亚 1 等低端设备),没有任何延迟。

问题是:在某些设备上(Archos 55 Cobalt (API 23) 和 OnePlus One (API 23)),声音很迟钝,特别是如果我同时提取 2 个音频文件(这样我可以同时播放它们),而在诺基亚 1 等功能较弱的设备上,相同的代码也可以正常工作

我也尝试设置mBufferSizeSelection为 4 甚至 8,但完全没有变化。

有没有人经历过类似的事情?我错过了什么?

谢谢你的帮助。

0 投票
2 回答
831 浏览

android - 双簧管/AAudio 播放流中的欠载

我正在开发一个处理基本上是 USB 麦克风的设备的 Android 应用程序。我需要读取输入数据并进行处理。有时,我需要向设备发送数据(4 shorts * 通常为 2 的通道数),并且此数据不依赖于输入。

我正在使用Oboe,我用于测试的所有手机都在下面使用 AAudio。

读取部分有效,但是当我尝试将数据写入输出流时,我收到以下警告,logcat并且没有任何内容写入输出:

这是我的回调:

如中所示setupRecordingStreamParameters,我正在将回调注册到输入流。在所有双簧管示例中,回调都注册在输出流上,并且读取是阻塞的。这有重要性吗?如果不是,我需要向流中写入多少帧以避免欠载?

编辑 与此同时,我找到了不足的来源。输出流没有读取与输入流相同数量的帧(事后看来这似乎是合乎逻辑的),因此写入playStream->getFramesPerBurst()修复我的问题给出的帧数量。这是我的新回调:

它以这种方式工作,如果我发现任何性能问题,我将更改附加回调的流,现在我将保持这种方式。

0 投票
2 回答
1293 浏览

android - 如何使用双簧管正确播放解码的内存 PCM?

我使用双簧管在我的 ndk 库中播放声音,并使用带有 Android 扩展的 OpenSL将 wav 文件解码为 PCM。解码后的签名 16 位 PCM 存储在内存中 ( std::forward_list<int16_t>),然后通过回调将它们发送到双簧管流中。我可以从手机听到的声音在音量级别上与原始 wav 文件相似,但是,这种声音的“质量”却不是——它爆裂和噼啪作响。

我猜我以错误的顺序或格式(采样率?)在音频流中发送 PCM。如何将 OpenSL 解码与双簧管音频流一起使用?


要将文件解码为 PCM,我使用AndroidSimpleBufferQueue作为接收器,使用AndroidFDAAssetManager作为源:

然后我注册回调,将缓冲区排入队列并将 PCM 从缓冲区移动到存储,直到完成。

注意:wav 音频文件也是 2 通道签名 16 位 44.1Hz PCM

我的双簧管流配置是一样的:

音频渲染是这样工作的:

0 投票
1 回答
942 浏览

android - Android oboe c++ 有些声音在播放时失真

我正在使用 Android 双簧管库在音乐游戏中获得高性能音频。

在资产文件夹中,我有 2 个 .raw 文件(48000Hz 16 位 PCM wav 和大约 60kB)std_kit_sn.raw std_kit_ht.raw

这些作为 SoundRecordings 加载到内存中并添加到混音器中。kSampleRateHz 为 48000:

它们被适当地调用以在需要的时间使用标准代码(根据 Google 教程):

音频回调是标准的(根据谷歌教程):

std_kit_sn.raw 播放良好。但是 std_kit_ht.raw 有一个令人讨厌的失真。两者都以低延迟播放。为什么一个播放得很好,而另一个有令人讨厌的失真?

0 投票
1 回答
481 浏览

android - 增加双簧管音量后如何避免噼里啪啦的爆裂声?

我开始为 Android 实现 Oboe c++ 库。(根据使用双簧管构建音乐游戏, 我只是缩放样本以增加音量,它可以工作,但会发出噼啪声。我可以增加幅度而不会产生噼啪声吗?我试图用一点增益来保存我的样本声音,但是听起来很糟糕。谢谢。

顺便说一句,在不增加音量的情况下,与其他音乐应用程序相比,它听起来清晰但音量非常低。

编辑:

0 投票
1 回答
611 浏览

android - Android oboe c++ E/AudioALSAPlaybackHandlerBase: openPcmDriver(), pcm_start(0xeff82fc0) 由于无法启动通道而失败:管道损坏

在某些设备上,用于高性能音频的 android oboe 库运行良好。但是在其他设备上加载声音文件后它会崩溃。

这个 jni 方法执行得很好:

然而,不久之后,有一个原生崩溃 E/AudioALSAPlaybackHandlerBase: openPcmDriver(), pcm_start(0xeff82fc0) fail due to cannot start channel: Broken pipe

这是什么意思,我该如何解决?

这是错误日志:

12-12 14:55:14.995 11622-11622/com.learntomaster.dlmp D/RhythmGame: 开始流后 12-12 14:55:15.006 1462-1987/? E/AudioALSAPlaybackHandlerBase: openPcmDriver(), pcm_start(0xeff82fc0) 由于无法启动通道而失败:管道损坏

代码 1,故障地址 0x90 在 tid 11622 (rntomaster.dlmp) 12-12 14:55:15.137 10957-11660/? E/Icing:中止对语料库播放列表的索引 12-12 14:55:15.151 11895-11895/?I/AEE/AED:* * 12-12 14:55:15.152 11895-11895/? I/AEE/AED:构建指纹:'Lenovo/LenovoTB3-850F/TB3-850F:6.0/MRA58K/TB3-850F_S100031_171010_ROW:user/release-keys' 12-12 14:55:15.152 11895-11895/? I/AEE/AED:修订:'0' 12-12 14:55:15.152 11895-11895/? I/AEE/AED: ABI: 'arm64' 12-12 14:55:15.152 11895-11895/? I/AEE/AED:pid:11622,tid:11622,名称:rntomaster.dlmp

com.learntomaster.dlmp <<< 12-12 14:55:15.152 11895-11895/? I/AEE/AED:信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),故障地址 0x90 12-12 14:55:15.174 11895-11895/? I/AEE/AED: x0 0000000000000090 x1 0000007fdedc7540 x2 0000000000000000 x3 0000000000000000 12-12 14:55:15.174 11895-11895/? I/AEE/AED: x4 0000000000000000 x5 0000000000000000 x6 0000000000000000 x7 0000000000000000 12-12 14:55:15.174 11895-11895/? I/AEE/AED:x8 0000000000000001 x9 0000007f956290a0 x10 0000000000000001 x11 0000007f937c20e0 12-12 14:55:15.174 11895-11895/?I/AEE/AED:x12 0000007f96ecea40 x13 0000000000000004 x14 0000000000000005 x15 00000000000000c0 12-12 14:55:15.174 11895-11895/?I/AEE/AED:x16 0000007f9562e760 x17 0000007f96e9048c x18 0000007f937c20e0 x19 0000000000000000 12-12 14:55:15.174 11895-11895/?I/AEE/AED:x20 0000000000000090 x21 0000007f7ea3b488 x22 0000007f7ea3b380 x23 0000007f7ea3b4b0 12-12 14:55:15.174 11895-11895/?I/AEE/AED: x24 0000007fdedc7540 x25 0000000000000000 x26 0000007fdedc7a78 x27 0000279200002d66 12-12 14:55:15.174 11895-11895/? I/AEE/AED: x28 0000279200002d66 x29 0000007fdedc7490 x30 0000007f955948a4 12-12 14:55:15.174 11895-11895/? I/AEE/AED: sp 0000007fdedc7490 pc 174 11895-11895/? I/AEE/AED: x24 0000007fdedc7540 x25 0000000000000000 x26 0000007fdedc7a78 x27 0000279200002d66 12-12 14:55:15.174 11895-11895/? I/AEE/AED: x28 0000279200002d66 x29 0000007fdedc7490 x30 0000007f955948a4 12-12 14:55:15.174 11895-11895/? I/AEE/AED: sp 0000007fdedc7490 pc 174 11895-11895/? I/AEE/AED: x24 0000007fdedc7540 x25 0000000000000000 x26 0000007fdedc7a78 x27 0000279200002d66 12-12 14:55:15.174 11895-11895/? I/AEE/AED: x28 0000279200002d66 x29 0000007fdedc7490 x30 0000007f955948a4 12-12 14:55:15.174 11895-11895/? I/AEE/AED: sp 0000007fdedc7490 pc
0000007f96e90494 pstate 0000000060000000 12-12 14:55:15.195 1462-1988/? E/AudioFlinger:getNextBuffer,获取空缓冲区 12-12 14:55:15.203 11895-11895/? I/AEE/AED:回溯:12-12 14:55:15.203 11895-11895/? I/AEE/AED:#00 pc 0000000000068494 /system/lib64/libc.so (pthread_mutex_lock+8) 12-12 14:55:15.203 11895-11895/? I/AEE/AED: #01 pc 000000000002f8a0 /system/lib64/libhwui.so (_ZN7android10uirenderer12renderthread12RenderThread5queueEPNS1_10RenderTaskE+28) 12-12 14:55:15.203 11895-11895/? I/AEE/AED: #02 pc 000000000002e324 /system/lib64/libhwui.so (_ZN7android10uirenderer12renderthread11RenderProxy11postAndWaitEPNS1_22MethodInvokeRenderTaskE+132) 12-12 14:55:15.203 11895-11895/? I/AEE/AED:#03 pc 000000000002e600 /system/lib64/libhwui.so (_ZN7android10uirenderer12renderthread11RenderProxy20loadSystemPropertiesEv+92) 12-12 14:55:15.203 11895-11895/? I/AEE/AED:#04 pc 0000000002a1b990 /system/framework/arm64/boot.oat(偏移量 0x2439000)12-12 14:55:15.795 1858-1858/?E/WifiTrafficPoller: TRAFFIC_STATS_POLL true Token 14 num clients 9 12-12 14:55:15.796 1858-1858/? E/WifiTrafficPoller:数据包计数 Tx=11477 Rx=15018 12-12 14:55:15.823 11895-11895/? I/AEE/AED:墓碑写入:/data/tombstones/tombstone_04 12-12 14:55:15.824 11895-11895/? E/AEE/AED:AM 写入失败:管道损坏 12-12 14:55:15.824 11895-11895/? E/AEE/AED:request.action:0 所以(_ZN7android10uirenderer12renderthread11RenderProxy20loadSystemPropertiesEv+92)12-12 14:55:15.203 11895-11895/?I/AEE/AED:#04 pc 0000000002a1b990 /system/framework/arm64/boot.oat(偏移量 0x2439000)12-12 14:55:15.795 1858-1858/?E/WifiTrafficPoller: TRAFFIC_STATS_POLL true Token 14 num clients 9 12-12 14:55:15.796 1858-1858/? E/WifiTrafficPoller:数据包计数 Tx=11477 Rx=15018 12-12 14:55:15.823 11895-11895/? I/AEE/AED:墓碑写入:/data/tombstones/tombstone_04 12-12 14:55:15.824 11895-11895/? E/AEE/AED:AM 写入失败:管道损坏 12-12 14:55:15.824 11895-11895/? E/AEE/AED:request.action:0 所以(_ZN7android10uirenderer12renderthread11RenderProxy20loadSystemPropertiesEv+92)12-12 14:55:15.203 11895-11895/?I/AEE/AED:#04 pc 0000000002a1b990 /system/framework/arm64/boot.oat(偏移量 0x2439000)12-12 14:55:15.795 1858-1858/?E/WifiTrafficPoller: TRAFFIC_STATS_POLL true Token 14 num clients 9 12-12 14:55:15.796 1858-1858/? E/WifiTrafficPoller:数据包计数 Tx=11477 Rx=15018 12-12 14:55:15.823 11895-11895/? I/AEE/AED:墓碑写入:/data/tombstones/tombstone_04 12-12 14:55:15.824 11895-11895/? E/AEE/AED:AM 写入失败:管道损坏 12-12 14:55:15.824 11895-11895/? E/AEE/AED:request.action:0 燕麦(偏移量 0x2439000)12-12 14:55:15.795 1858-1858/?E/WifiTrafficPoller: TRAFFIC_STATS_POLL true Token 14 num clients 9 12-12 14:55:15.796 1858-1858/? E/WifiTrafficPoller:数据包计数 Tx=11477 Rx=15018 12-12 14:55:15.823 11895-11895/? I/AEE/AED:墓碑写入:/data/tombstones/tombstone_04 12-12 14:55:15.824 11895-11895/? E/AEE/AED:AM 写入失败:管道损坏 12-12 14:55:15.824 11895-11895/? E/AEE/AED:request.action:0 燕麦(偏移量 0x2439000)12-12 14:55:15.795 1858-1858/?E/WifiTrafficPoller: TRAFFIC_STATS_POLL true Token 14 num clients 9 12-12 14:55:15.796 1858-1858/? E/WifiTrafficPoller:数据包计数 Tx=11477 Rx=15018 12-12 14:55:15.823 11895-11895/? I/AEE/AED:墓碑写入:/data/tombstones/tombstone_04 12-12 14:55:15.824 11895-11895/? E/AEE/AED:AM 写入失败:管道损坏 12-12 14:55:15.824 11895-11895/? E/AEE/AED:request.action:0 AM 写入失败:管道损坏 12-12 14:55:15.824 11895-11895/? E/AEE/AED:request.action:0 AM 写入失败:管道损坏 12-12 14:55:15.824 11895-11895/? E/AEE/AED:request.action:0

0 投票
2 回答
1079 浏览

oboe - Android 双簧管库:可以从 2 个录音设备录制 2 个流吗?

  • 设备:HUAWEI P smart

  • 安卓版本:8.0.0

  • 通用应用程序:
    RecDev1 -> PlayDev1
    RecDev2 -> PlayDev2
    “同步流”
    ,其中
    RecDev 可以是内置麦克风、USB 麦克风或耳机麦克风
    ,而
    PlayDev 可以是内置扬声器、USB 扬声器或耳机扬声器
    任何输入和输出设备应以如上所示的任何组合“同时”流式传输。

  • 示例应用程序(具有“1”通道的所有设备):
    吉他 -> 有线麦克风 -> [(处理)] -> 内置扬声器
    语音 -> 内置麦克风 -> [(处理)] -> 有线 -扬声器
    “同时流媒体”

  • 代码:
    只是双簧管提供的样本“ LiveEffect ”的扩展版本。
    到目前为止,我尝试过:
    . 直接延伸
    。LiveEffectEngine 不再是单例(2 个具有自己的长 mEngineHandle 的实例)
    。使用 2 个单独的线程
    。为录制流设置回调

  • 注意:
    我收到所有 4 个流的警告Stream is NOT low latency,但所有参数都匹配:
    SharingMode::Exclusive PerformanceMode::LowLatency (not accepted) mSampleRate 48000 (default of PlaybackDevice) AudioFormat::I16

使用 OpenSL-ES API:我无法启动第二个录制流,stream->requestStart()返回“ErrorInternal”

使用 AAudio API:我无法打开第二个录音流,builder.openStream()返回“ErrorInvalidState”

在这两种情况下,我都打电话builder->setCallback(nullptr),所以我认为使用单独的线程可能会有所帮助,但这并没有解决问题。

有任何想法吗?

0 投票
1 回答
288 浏览

android - Android双簧管库在声音的开始/结束处点击

我在我的应用程序中使用双簧管库来生成声音。他们的示例SineGenerator几乎正是我所需要的,只是一个简单的正弦波,可以产生我需要的频率。这个生成的正弦波是稍后在PlayAudioEngine中的用户。

问题是,我播放的音频的开头或结尾通常会发出咔哒声。我以连续的短脉冲播放声音,长度通常在 50 到 150 毫秒之间。

我真的没有产生音频波的经验,所以也许这只是我没有看到非常明显的东西。我已尝试按照本文中的建议优化性能(编译器标志 + 代码),但没有产生任何结果。我也尝试降低幅度,但没有明显的结果。

任何建议表示赞赏。谢谢!

0 投票
1 回答
297 浏览

android - 不触摸屏幕时的 Android (JUCE) 性能问题

我正在将 JUCE 制作的 iOS 应用程序移植到 Android(目前处于 Beta 版)。我有一些奇怪的行为,我得到音频故障和 GUI 帧丢失,只有在不触摸屏幕时才会出现。

该应用程序使用带有 JUCE 5.4.0 的 OBOE,并且仅针对 Android 8.0 及更高版本进行编译。奇怪的是,这个问题只发生在 Galaxy S9 上(在 Note 8、Note 9、小米 mi A1 和其他一些设备上测试正常)。我已经尝试在 Galaxy S9 上进行全新的出厂重置。

我是 Android 开发的新手。