SoundPool 正在加载声音,但每次我播放它时都会显示“样本___ 未准备好”?

Posted

技术标签:

【中文标题】SoundPool 正在加载声音,但每次我播放它时都会显示“样本___ 未准备好”?【英文标题】:SoundPool is loading sounds but every time I play it it says "sample ___ is not ready"? 【发布时间】:2015-03-10 00:15:59 【问题描述】:

我的 SoundPool 有点困难。我的 ArrayList<Integer> 的 soundID 位于我的 res/raw 文件夹中。我在我的 ViewHolder 类中为我的 RecyclerView 创建 SoundPool:

//create the SoundPool
sp = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
//create the AudioManager for managing volume
audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
//store the streamVolume in an int
streamVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

//set the load listener for my soundfiles
sp.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() 
    @Override
        public void onLoadComplete(SoundPool soundPool, int sampleId, int status) 
            loaded = true;
        
);

我在单击 ImageView 时播放声音,如下所示:

@Override
public void onClick(View v) 
    if (v.equals(cardImg)) 
        sp.load(context, cardData.getSoundId(), 1);
        if (loaded) 
            sp.play(cardData.getSoundId(), streamVolume, streamVolume, 1, 0, 1f);
        
    

每次我点击cardImg时都会出现这个错误:

W/SoundPool﹕ sample 2130968609 not READY

示例 int 的变化取决于我点击的卡片,就像它应该的那样。

所以我知道它正在从我的 ArrayList(存储在 CardData 类中)获取正确的 soundID,并且它肯定会看到它已加载,因为它不会尝试播放,因为 loaded 永远不会是真的。我的问题是:为什么我的声音还没有准备好?

我的声音是.m4a 格式,android 说文档中支持这种格式。我在 Android 5.0 设备和 Android 4.4 设备上进行了尝试,但没有任何变化。

我曾尝试使用MediaPlayer,但我遇到了内存错误,因为我有许多短片需要被发送垃圾邮件,而且我读到 SoundPool 是一种更好的管理方式(?)。

任何帮助将不胜感激!我在这里超级烦恼。

【问题讨论】:

【参考方案1】:

您使用了错误的 ID。 SoundPool.load 返回一个 id,该 id 应该被传递给 SoundPool.play

【讨论】:

完美。非常感谢!我知道我错过了一些超级简单的东西。我刚刚为我的 sp.load 设置了一个 int 并将该 int 传递给 sp.play :-) 再次感谢!我会尽可能接受你的回答。

以上是关于SoundPool 正在加载声音,但每次我播放它时都会显示“样本___ 未准备好”?的主要内容,如果未能解决你的问题,请参考以下文章

SoundPool 加载失败

有效地为 SoundPool 加载声音(全局 SoundPool?)

从资产加载和播放 soundpool

SoundPool 和 MediaPlayer 的并发性?

SoundPool 仅在第一次播放声音

MediaPlayer vs SoundPool 仅用于 1 个同时流