Android MediaRecorder Class: метод setOutputFile () добавляет данные к существующему файлу? - PullRequest
2 голосов
/ 28 марта 2012

Я использую MediaRecorder в своем приложении для Android. Я обратился к онлайн-документации для public void setOutputFile (String path) класса MediaRecorder, но не смог найти информацию о том, перезаписывает ли он существующий файл по тому же пути или добавляет к существующему файлу, если он существует.

Итак, два вопроса:

  1. Перезаписывает ли public void setOutputFile (String path) файл в path, если он существует, или он добавляется в файл в path?
  2. Есть ли способ возобновить уже приостановленную запись, сохраненную по определенному пути?

Заранее спасибо.

1 Ответ

6 голосов
/ 29 марта 2012

Так что, исходя из моих выводов, я пришел к выводу, что в настоящее время Android API не предоставляет возможность возобновить запись с использованием MediaRecorder.

Так что, управляя своей целью объединения двух записанных звуков, я пошел на прямое объединениедвух файлов, пропуская заголовки из второго файла.

Ниже приведен мой код для справки:

    mRecorder = new MediaRecorder();
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);

    /* If the voiceMessage in consideration is a PAUSED one, then we should 
     * record at a new alternate path so that earlier recording does not get overwritten, and can be used later for merging */
    Log.d(LOG_TAG, "VoiceMessageManager:recordVoiceMessage() - state of voice message - " + voiceMessage.getVoiceMessageState());

    mRecorder.setOutputFile(filePath);

    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    mRecorder.prepare();
    mRecorder.start();

И мой код для объединения двух аудиофайлов выглядит следующим образом:

protected Void doInBackground(String... filePaths) {
         try {
                String originalVoiceMessageRecording = filePaths[0];
                String newVoiceMessageRecording = filePaths[1];

                File outputFile = new File(originalVoiceMessageRecording);
                FileOutputStream fos = new FileOutputStream(outputFile, true); // Second parameter to indicate appending of data

                File inputFile = new File(newVoiceMessageRecording);
                FileInputStream fis = new FileInputStream(inputFile);

                Log.d(LOG_TAG, "Length of outputFile: " + outputFile.length() + " and Length of inputFile: " + inputFile.length() );

                byte fileContent[]= new byte[(int)inputFile.length()];
                fis.read(fileContent);// Reads the file content as byte from the list.

                /* copy the entire file, but not the first 6 bytes */
                byte[] headerlessFileContent = new byte[fileContent.length-6];
                for(int j=6; j<fileContent.length;j++){
                    headerlessFileContent[j-6] = fileContent[j];
                }
                fileContent = headerlessFileContent;

                /* Write the byte into the combine file. */
                fos.write(fileContent);

                /* Delete the new recording as it is no longer required (Save memory!!!) :-) */
                File file = new File(newVoiceMessageRecording); 
                boolean deleted = file.delete();

                Log.d(LOG_TAG, "New recording deleted after merging: " + deleted);
                Log.d(LOG_TAG, "Successfully merged the two Voice Message Recordings");
                Log.d(LOG_TAG, "Length of outputFile after merging: " + outputFile.length());
            } catch (Exception ex) {
                Log.e(LOG_TAG, "Error while merging audio file: " + ex.getMessage());
            }
        return null;
     }

Короче, что я делаюis - пропустить заголовки второго файла (длина заголовка в файле AMR составляет 6 байт).

Это сработало для меня, и я протестировал его на Android версии 2.3

Надеюсь, это поможет другим!

...