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

Posted

技术标签:

【中文标题】示例 1 未准备好 - Android 2.1 中的 Soundpool【英文标题】:Sample 1 not ready - Soundpool in Android 2.1 【发布时间】:2012-03-02 17:35:57 【问题描述】:

伙计们,我有一个音频文件,我正在从 sdcard 读取它。单击按钮时,我正在从 sdcard 播放音频文件。它成功播放音频文件 6 到 7 次,但之后显示 unable to load (null) sample 1 not ready

我正在使用 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);

soundpool 说无法加载(空)样本 1 未准备好是什么意思? 我该如何解决这个问题,请帮助我,我已经挣扎了很长时间。

【问题讨论】:

【参考方案1】:

我在使用 wav 文件时也遇到过类似的问题。让我们开始丢弃一些东西:

这不是等待的问题,尽管在其他情况下可能是这样。请注意,您发布了两条不同的错误消息,就像是一条:

    无法加载(空) 样品 1 未准备好

当您尝试将样本加载到 SoundPool 时会引发第一个错误,当您尝试播放它时会引发第二个错误。但在这种情况下,第二个错误显然是第一个错误的结果:如果样本尚未加载,则无法准备好。

所以你应该把注意力集中在第一个错误之前。

它也与 MediaPlayer 无关,因为您使用的是 AFAIK 不同的 SoundPool。

所以问题的根源可能是,应该按顺序丢弃:

    文件不存在。 文件在那里,但由于某种原因无法读取。 文件在那里,并且可以读取,但它已损坏或不是音频文件。 文件在那里,可以读取,并且是未损坏的音频文件,但 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 之类的音频编辑器调整其速率和通道即可解决问题。

为什么它不只是在第一种情况下工作?谁知道呢,但如果我能这么简单地解决它……谁在乎呢?

问候,

【讨论】:

我也遇到过类似的问题,我认为问题在于 96kHz 采样率,我遇到问题的所有采样都是 96kHz。 44.1kHz 的其他采样运行良好,当我将问题采样转换为 44.1kHz 时,它们也运行良好。 96khz 无论如何对于当前的移动设备来说都是多余的。它通常用作工作室中的一种工作格式,以避免在处理过程中失去精度,或者被声称自己有特殊耳朵的发烧友使用。 谢谢!我遇到了同样的问题。对我来说,这是文件使用立体声通道的事实。【参考方案2】:

在使用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();
    

【讨论】:

【参考方案3】:

我认为that's your problem。未加载整个文件,您正在尝试播放它。您必须等待一段时间才能播放。

【讨论】:

我正在使用 api 7 如何使用 onloadcompletion 监听器? 我知道,看看该主题的其他答案。【参考方案4】:

您是否尝试过调用 mediaplayer.release() 并重新初始化?还有http://developer.android.com/reference/android/media/MediaPlayer.html

【讨论】:

以上是关于示例 1 未准备好 - Android 2.1 中的 Soundpool的主要内容,如果未能解决你的问题,请参考以下文章

视图层次结构未准备好

中国 Android 统一推送联盟新进展:一批 App 已准备好

未找到 Android API 24 平台的源 (Android Studio 2.1)

Android MediaPlayer 在 2.1 上抛出“准备失败。:状态 = 0x1”,适用于 2.2

当我在准备好的文档上附加 div 时,我的 div 文本没有改变。

样品未准备好 soundpool