【问题标题】:File that I recorded with MediaRecorder can't be played我用 MediaRecorder 录制的文件无法播放
【发布时间】:2013-07-31 16:12:45
【问题描述】:

我正在使用 MediaRecoder 录制声音,但录制完成后无法播放。我尝试使用 Google Play 音乐、ES 媒体播放器,甚至将其上传到电脑并尝试使用 Winamp 打开它。什么都没有!

//AUDIO RECORDER
    recorder = new MediaRecorder();
    recorder.reset();       
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
    {
        externalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath();
        externalOutputPath = externalStoragePath + File.separator + "/Android/data/com.whizzappseasyvoicenotepad/test.mp3";
        recorder.setOutputFile(externalOutputPath);
    }
    else
    {
        storagePath = Environment.getDataDirectory().getAbsolutePath();
        recorder.setOutputFile(storagePath + "/Android/data/com.whizzappseasyvoicenotepad/test.mp3");
    }

甚至尝试通过单击按钮在应用程序中打开它:

public void testPlay (View v) throws IllegalArgumentException, SecurityException, IllegalStateException, IOException{
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setDataSource(externalOutputPath);
    mediaPlayer.prepare();
    mediaPlayer.start();
}

但这会使应用程序崩溃。但这不是主要问题,主要问题是我无法播放文件。是不是编码有问题之类的?

我也尝试将其从 .mp3 更改为 .3gp,但没有成功。然后我还尝试删除 .mp3 和 .3gp,只留下 'test' 作为名称,然后它甚至没有将其识别为音频文件。

哦,如果有人在应用程序崩溃时想要 logcat:

07-31 16:51:43.953: E/AndroidRuntime(26918): java.lang.IllegalStateException: Could not execute method of the activity
07-31 16:51:43.953: E/AndroidRuntime(26918): Caused by: java.lang.reflect.InvocationTargetException
07-31 16:51:43.953: E/AndroidRuntime(26918): Caused by: java.io.IOException: setDataSourceFD failed.: status=0x80000000

但是,应用程序崩溃目前不是问题。首先我想解决音频文件无法播放的问题。但是,如果您知道它为什么会崩溃,我也将不胜感激!

【问题讨论】:

    标签: java android eclipse android-mediaplayer android-mediarecorder


    【解决方案1】:

    我仍然不确定问题出在哪里,但我认为我停止录制的方式有问题(整个 try, catch 事情)。我只是重写了整个代码并将 MediaRecorder 放在了两种不同的方法中。 startRecording() 和 stopRecording() 方法。现在它完美运行了!

    startRecording()

    public void startRecording (){
         recorder = new MediaRecorder();
         recorder.reset();      
         recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
         recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
         recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
         if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
         {
             externalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath();
             externalOutputPath = externalStoragePath + File.separator + "/Android/data/com.whizzappseasyvoicenotepad/test.mp3";
             recorder.setOutputFile(externalOutputPath);
         }
         else
         {
            storagePath = Environment.getDataDirectory().getAbsolutePath();
            recorder.setOutputFile(storagePath + "/Android/data/com.whizzappseasyvoicenotepad/test.mp3");
         }
         recorder.setOnErrorListener(errorListener);
         recorder.setOnInfoListener(infoListener);
    
         try {
            recorder.prepare();
            recorder.start();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    

    停止录制()

    public void stopRecording() {
        if (null != recorder) {
            recorder.stop();
            recorder.reset();
            recorder.release();
    
            recorder = null;
        }
    }
    

    【讨论】:

    • 这是为我做的。我意识到我错过了对 MediaRecorder 实例的 release() 调用。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 2023-03-30
    • 2014-02-01
    • 1970-01-01
    相关资源
    最近更新 更多