4

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

该问题可能是由在后台完成的某些事情引起的,并且在我尝试运行音频之前未完成,但我并不完全确定。

任何帮助将不胜感激。

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

创建音池

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

从音池播放

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;
}
4

3 回答 3

4

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

在执行活动/片段之前,我通过在菜单活动中加载声音解决了这个问题,我将在其中播放一些具有SoundPool.play(...)功能的音乐。

在调试模式下,应用程序有很多时间来执行SoundPool.load(...)功能,所以它可以工作。

于 2012-11-29T14:14:59.117 回答
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();
于 2011-07-06T18:11:55.317 回答
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();
        }
于 2017-12-12T07:36:23.213 回答