Android Soundpool.play()无法在发布版本中运行

时间:2011-07-06 17:22:40

标签: android debugging release soundpool

我正在尝试构建一个记录声音的应用程序然后播放它们。 录音部分工作得很好但是当我尝试重放声音时它什么也没做。 当我在调试器中运行它并通过步骤播放音频时,它可以工作。 当我删除所有断点并在调试中运行程序时,它不会。

问题可能是由于某些事情在后台完成而在我尝试运行音频之前没有完成,但我不完全确定。

非常感谢任何帮助。

以下是源代码的相关部分。

创建Soundpool

mSoundPool = new SoundPool(16, AudioManager.STREAM_MUSIC, 0);

从soundpool播放

int soundId = mSoundPool.load(mAudioRecorder.stop(), 0);
if(soundId > 0){
    mSoundPool.play(soundId, 0.99f, 0.99f, 0, -1, 1.0f);
}

Audiorecorder.java输出文件是.mp4

mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);


public String stop() throws IOException {
    mRecorder.stop();
    return mPath;
}

3 个答案:

答案 0 :(得分:3)

昨天我遇到了同样的问题 - 在RELEASE模式下无法正常工作的原因是你必须等待SoundPool.load(...)功能执行。

我在执行活动/片段之前在菜单活动中加载声音解决了这个问题,我将用SoundPool.play(...)函数播放一些音乐。

在DEBUG模式下,app有很多时间来执行SoundPool.load(...)功能,所以它可以正常工作。

答案 1 :(得分:2)

为什么不尝试通过MediaPlayer播放录制的音频。

mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
        mFileName += "audiorecordtest.MPEG_4";
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);


public String stop() throws IOException {
    mRecorder.stop();
    return mPath;
}

要播放录制的文件,请使用以下代码:

mPlayer = new MediaPlayer();
             try {
                mPlayer.setDataSource(mFileName);
            } catch (IllegalArgumentException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IllegalStateException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
              try {
                mPlayer.prepare();
            } catch (IllegalStateException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            mPlayer.start();

答案 2 :(得分:0)

这可能被视为黑客攻击。但为我工作。基本上在加载和播放之间等待几毫秒

    try {
            soundPlayer_m.load(clipToPlay);
            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    soundPlayer_m.play(clipToPlay);
                }
            }, 300);

            setInitialVolume();
        } catch (Exception e) {
            Log.d("Exception", "E: " + e.toString());
            Toast.makeText(this, R.string.no_file, Toast.LENGTH_SHORT).show();
        }