【问题标题】:recording audio in android with media recorder使用媒体录音机在android中录制音频
【发布时间】:2016-03-26 12:40:58
【问题描述】:

我使用媒体记录器类录制语音并将其上传到网络服务器,但我不知道录制语音的文件何时完全写入SD卡。

你知道一个界面可以帮助我找出文件是否完整地保存在SD卡上。

【问题讨论】:

    标签: java android android-mediarecorder voice-recording


    【解决方案1】:

    你不是自己停止录制吗?好吧,如果我遇到像你这样的情况,我会这样做。

    1. 创建一个MediaRecorder 对象并设置以下属性:

      private MediaRecorder myAudioRecorder; 
      String outputFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/recording.3gp";
      myAudioRecorder=new MediaRecorder();
      myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
      myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
      myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
      myAudioRecorder.setOutputFile(outputFile);
      
    2. 通过单击录制按钮调用这些方法开始录制:

      record.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              try {
                  myAudioRecorder.prepare();
                  myAudioRecorder.start();
              } catch (IllegalStateException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              } catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
              Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show();
          }
      });
      
    3. 点击停止按钮停止录制,然后上传文件:

      stop.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              myAudioRecorder.stop();
              myAudioRecorder.release();
              myAudioRecorder  = null;
      
              Toast.makeText(getApplicationContext(), "Audio recorded successfully",Toast.LENGTH_LONG).show();
      
              doUpload(outputFile); //call the method to upload your file and perform upload.
          }
      });
      

    一旦您停止 mediaRecorder 并释放它,录制的文件就会保存在您的存储卡中,因此您不必担心。之后立即上传您的文件。

    【讨论】:

    • 感谢您的回答,但问题是媒体记录器类在后台保存文件,我需要知道 SD 卡上的写入何时完成。
    【解决方案2】:

    请看下面的录音代码

    public class AudioRecorder {
    
        private boolean singleFile = true;
    
        public MediaRecorder recorder;
    
        private ArrayList<String> files = new ArrayList<String>();
    
        private String fileDirectory;
    
        private String finalAudioPath;
    
        private boolean isRecording;
    
        public boolean isStarted;
    
        public boolean isRecording() {
            return isRecording;
        }
    
        public String getAudioFilePath() {
            return finalAudioPath;
        }
    
        public AudioRecorder(String audioFileDirectory) {
            this.fileDirectory = audioFileDirectory;
    
            if (!this.fileDirectory.endsWith("/")) {
                this.fileDirectory += "/";
            }
    
            newRecorder();
        }
    
        public boolean start() {
            prepareRecorder();
    
            try {
                recorder.prepare();
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
    
            if (recorder != null) {
                recorder.start();
                isRecording = true;
                isStarted = true;
                return true;
            }
    
            return false;
        }
    
        public boolean pause() {
            if (recorder == null || !isRecording) {
                throw new IllegalStateException("[AudioRecorder] recorder is not recording!");
            }
    
            recorder.stop();
            recorder.release();
            recorder = null;
    
            isRecording = false;
    
            return merge();
        }
    
        public boolean resume() {
            if (isRecording) {
                throw new IllegalStateException("[AudioRecorder] recorder is recording!");
            }
    
            singleFile = false;
            newRecorder();
            return start();
        }
    
        public boolean stop() {
            if (!isRecording) {
                return merge();
            }
    
            if (recorder == null) {
                return false;
            }
    
            recorder.stop();
            recorder.release();
            recorder = null;
            isRecording = false;
            isStarted = false;
            return merge();
        }
    
        public void clear() {
            if (recorder != null || isRecording) {
                recorder.stop();
                recorder.release();
                recorder = null;
                isRecording = false;
            }
            for (int i = 0, len = files.size(); i < len; i++) {
                File file = new File(this.files.get(i));
                file.delete();
            }
            finalAudioPath = "";
        }
    
        private boolean merge() {
    
            // If never paused, just return the file
            if (singleFile) {
                this.finalAudioPath = this.files.get(0);
                return true;
            }
    
            // Merge files
            String mergedFilePath = this.fileDirectory + System.currentTimeMillis() + ".amr";
            try {
                FileOutputStream fos = new FileOutputStream(mergedFilePath);
    
                for (int i = 0, len = files.size(); i < len; i++) {
    
                    try {
                        File file = new File(this.files.get(i));
                        FileInputStream fis = new FileInputStream(file);
    
                        // Skip file header bytes,
                        // amr file header's length is 6 bytes
                        if (i > 0) {
                            for (int j = 0; j < 6; j++) {
                                fis.read();
                            }
                        }
    
                        byte[] buffer = new byte[512];
                        int count = 0;
                        while ((count = fis.read(buffer)) != -1) {
                            fos.write(buffer, 0, count);
                        }
    
                        fis.close();
    //                    fos.flush();
    //                    file.delete();
    
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                fos.flush();
                fos.close();
    //            files.clear();
                this.finalAudioPath = mergedFilePath;
    //            files.add(this.finalAudioPath)
                return true;
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return false;
        }
    
        private void newRecorder() {
            recorder = new MediaRecorder();
        }
    
        private void prepareRecorder() {
            File directory = new File(this.fileDirectory);
            if (!directory.exists() || !directory.isDirectory()) {
                throw new IllegalArgumentException("[AudioRecorder] audioFileDirectory is a not valid directory!");
            }
    
            String filePath = directory.getAbsolutePath() + "/" + System.currentTimeMillis() + ".amr";
            this.files.add(filePath);
    
            recorder.setOutputFile(filePath);
            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      相关资源
      最近更新 更多