【问题标题】:Performance issue using a bluetooth loudspeaker on Android NDK app在 Android NDK 应用上使用蓝牙扬声器的性能问题
【发布时间】:2018-12-21 06:00:29
【问题描述】:

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

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

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

但由于某种原因,当我将设备与蓝牙扬声器配对并播放音乐时,在三星 S7 或诺基亚 1 等设备上(但并非在每台设备上)似乎都有一些问题。

这个错误在我看来是如此随机,以至于我不知道从哪里开始。它就像蓝牙连接使用了很多 CPU,所以我的应用程序没有足够的资源来正常运行。

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

感谢您的帮助。

【问题讨论】:

    标签: c++ android-ndk android-bluetooth


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回答。我尝试使用 BT 扬声器在诺基亚 1 上使用普通播放器播放 ogg 文件,它可以正常工作。所以,我想我的代码中有一些事情要做,但是什么?因为在没有 BT 设备的情况下,我的播放器可以正常工作(没有欠载),而且令人惊讶的是,它还可以完美地与华硕 Zenfone 2 上的 BT 设备配合使用......
    • 另外,当设备连接到BT音箱时,应用程序同时提取和处理2首歌曲并没有变得更糟。这对我来说没有任何意义......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多