【问题标题】:Android SoundPool heap limitsAndroid SoundPool 堆限制
【发布时间】:2011-09-11 21:17:29
【问题描述】:

我正在使用 SoundPool 将多个声音片段加载到其中并进行播放。

据我所知,它 100% 正常运行。但是在 .load() 调用期间,我的日志被垃圾邮件发送:

06-09 11:30:26.110: ERROR/AudioCache(23363): Heap size overflow! req size: 1050624, max size: 1048576

我正在加载 11 个声音文件,其中 2 个非常小 ~3kb,其余的在 10kb - 15kb 之间。 Windows 正在报告

大小:114kb

磁盘大小:128kb

我是否正在突破 SoundPool 能够容纳的极限?是否有一些设置我应该改变以避免这种溢出?任何关于我应该如何设置我的音频控件的指导将不胜感激。

【问题讨论】:

  • SoundPool 漏洞百出。即使您使用的是相对较小的声音文件,最好还是使用 MediaPlayer。
  • 您可以使用多个 SoundPool 实例来防止堆大小错误。您可以从stackoverflow.com/a/15331311/1124084找到更多详细信息

标签: android audio overflow heap-memory soundpool


【解决方案1】:

SoundPool 会将加载的音频解压缩为 PCM 数据,以便立即播放,无需解码延迟。如果您正在加载的音频被大量压缩,例如 MP3,那么它可能会被放大很多。如果不需要立体声,请尝试将音频编码为单声道(通常不用于短音效)。

【讨论】:

    【解决方案2】:

    SoundPool 每个轨道有 1Mb 的缓冲区大小限制。但此限制不适用于文件大小,而是适用于解压缩的原始 PCM 数据。

    我建议使用 3d 派对库中的SoundPoolCompat。它具有与SoundPool 相似的api,但具有自定义缓冲区大小,该缓冲区中的所有数据都将加载到内存中并像SoundPool 那样以小延迟播放。所有超过该缓冲区大小的数据都将按需加载(这会增加延迟,类似于MediaPlayer)。但它不会崩溃,也不会播放仅适合 SoundPool 等缓冲区大小的数据。 缓冲区大小也以文件大小而不是解压缩数据大小表示。 api用户哪个更方便。

    implementation 'com.olekdia:sound-pool:3.2.0'
    

    https://gitlab.com/olekdia/common/libraries/sound-pool

    【讨论】:

    • 由于依赖关系混乱,该库在运行时崩溃。
    猜你喜欢
    • 2013-08-12
    • 2011-03-17
    • 2014-04-29
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多