gpt4 book ai didi

c++ - 在 Android NDK 应用程序上使用蓝牙扬声器的性能问题

转载 作者:行者123 更新时间:2023-11-28 04:27:49 28 4
gpt4 key购买 nike

在我的 Android 应用中,我使用 Android NDK 通过执行以下操作来播放音乐:

  • 使用 Vorbis library 从 OGG 文件中提取音频样本
  • 处理音频样本
  • 使用 Oboe library 将处理过的样本重定向到音频输出

为了避免欠载,我在一个单独的线程中执行前 2 个步骤,提前一点提取和处理声音(它增加了一点延迟,但这对我的应用程序来说不是问题)。该解决方案在我目前测试过的每台设备上都运行良好。

但出于某种原因,当我将我的设备与蓝牙扬声器配对并播放音乐时,在某些设备(如三星 S7 或诺基亚 1)上(但并非在所有设备上),我的声音似乎不足。

这个错误对我来说太随机了,我不知道从哪里开始。它的行为就像蓝牙连接正在使用大量 CPU,因此我的应用程序没有足够的资源来正常运行。

有没有人遇到过类似的事情?我是否应该在我的代码中做任何事情来处理蓝牙连接,以便它不使用 CPU(例如避免音频重采样)?

感谢您的帮助。

最佳答案

Android + 蓝牙音频是一个痛苦的世界。关于蓝牙的主要优点是音频接收器以独立于其他音频设备的速率运行,这就是为什么 native 媒体播放器会根据所连接的音频设备消耗样本的任何速率来执行诸如显示视频之类的操作,本质上是使自己受制于BT 音频设备的时钟。如果您想提高 Android 的速度(即 SystemClock 时基),您需要使用时间拉伸(stretch) AudioTrack。 (这是可以做到的,但驱动程序支持不稳定,并且整个系统稳定性很差)。

首先,您想消除设备本身的问题。您可以将媒体播放器中的 ogg 文件从 S7 或 Nokia 1 毫无问题地播放到蓝牙扬声器吗?如果是这样,那就是您的代码!

在我看来,无论出于何种原因,扬声器消耗样本的速度都快于设备生成样本的速度。基本上检查您的回调以确保每当音频子系统请求更多数据时您实际提供了它。请务必根据正在进行的回调驱动解码管道,而不是系统时钟或任何其他关于计时的假设。

最后,蓝牙音频,至少是 A2DP,与直接流式传输 MP3 不同,在发送音频时需要进行一些处理以重新压缩音频,但这些设备应该有足够的余量,甚至可能是特殊的 DSP .我以前用 1080P 视频同时播放过,然后同时播放两个视频就开始崩溃了!

关于c++ - 在 Android NDK 应用程序上使用蓝牙扬声器的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53871191/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com