样例1尚未准备好 - Android 2.1中的Soundpool

4

大家好,我有一个音频文件存储在SD卡中,我正从SD卡中读取它。当我点击按钮时,会从SD卡中播放音频文件。它可以成功地播放6到7次,但之后就会显示 无法加载(null)样本1尚未准备好

我正在使用Android 2.1即API 7进行开发。

String path="/sdcard/var/audio.mp3"

sound1 = mSoundPool.load(path,1);
mSoundPool.play(sound1, 1, 1, 1, time - 1, 1);

声音池通过“无法加载(null)样本1未准备好”的提示告诉我什么?我该如何修复这个问题,请帮助我,我已经苦苦挣扎了很长时间。
4个回答

9
我曾经遇到过一个wav文件的类似问题。让我们先排除一些可能性:
这不是等待的问题,尽管在其他情况下可能是。请注意,您已经发布了两个不同的错误消息,就好像它们是一个错误一样:
1. 无法加载(null) 2. 样本1未准备好
第一个错误是在您尝试将样本加载到SoundPool时引发的,第二个错误是在您尝试播放它时引发的。但在这种情况下,第二个错误显然是第一个错误的结果:如果样本没有被加载,那么它肯定没有准备好。
因此,您应该先关注第一个错误。
这与MediaPlayer无关,因为您正在使用SoundPool,这是我所知道的另一件事。
因此,问题的来源可能是,并且应该按顺序进行排除:
1. 文件不存在。 2. 文件存在,但由于某种原因无法读取。 3. 文件存在,可读取,但损坏或不是音频文件。 4. 文件存在,可读取,是非损坏的音频文件,但SoundPool不喜欢它。
最后一个是我的情况。由于某种原因,SoundPool无法加载一个wav样本,而实际上在我使用的每个其他播放器中都可以正常工作。因此,我只需使用具有不同格式的另一个文件即可。这是有问题的文件格式,由我的GNU / LiNUX框上的mplayer告诉我:
Opening audio decoder: [pcm] Uncompressed PCM audio decoder
AUDIO: 96000 Hz, 1 ch, s16le, 1536.0 kbit/100.00% (ratio: 192000->192000)
Selected audio codec: [pcm] afm: pcm (Uncompressed PCM)

这里是另一个文件的代码,它可以正常工作:

Opening audio decoder: [pcm] Uncompressed PCM audio decoder
AUDIO: 22050 Hz, 2 ch, s16le, 705.6 kbit/100.00% (ratio: 88200->88200)
Selected audio codec: [pcm] afm: pcm (Uncompressed PCM)

有很多不同之处,但关键是第二个有效,所以我只是放弃了第一个并转向了第二个。如果我需要第一个声音样本,我只需使用像Audacity这样的音频编辑器调整其速率和通道即可解决问题。
为什么第一种情况下它不起作用呢?谁知道呢,但如果我可以这么容易地解决它...谁在乎呢?
问候,

1
我遇到了类似的问题,我认为问题出在96kHz采样率上,我遇到问题的所有样本都是96kHz。其他44.1kHz的样本工作正常,当我将有问题的样本转换为44.1kHz时,它们也可以正常工作。 - mal
1
96khz 对于当前的移动设备来说是过度的。通常在工作室中,它被用作工作格式以避免在处理过程中失去精度,或者被声音发烧友使用,他们声称自己有特殊的听力。 - Mr. Developerdude
谢谢!我也遇到了同样的问题。对我来说,问题在于文件使用了立体声通道。 - Movieboy

1

在使用SoundPool.setOnLoadCompleteListener播放音频之前,您需要检查文件是否成功加载。

public void loadSound (String strSound, int stream) {
     boolean loaded = false;
     mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId,
                    int status) {
                mSoundPool.play(stream, streamVolume, streamVolume, 1, LOOP_1_TIME, 1f);
            }
        });
    try {
          stream= mSoundPool.load(aMan.openFd(strSound), 1);
        } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

0

0

我认为这就是你的问题。整个文件还没有加载完毕,而你却试图播放它。你需要等待一段时间才能播放。


我正在使用API 7,如何使用onloadcompletion监听器? - Goofy
我知道,在那个话题下看看其他答案。 - skywall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接