Преобразование MediaRecorder .3gpp в байт, а затем получение обратно в.3gp не работает

У меня очень странная проблема с преобразованием файла 3gpp(origin) в байты и получением байтов обратно в файл 3gpp(2nd).

2-й файл 3gpp - я не могу воспроизвести с помощью MediaPlayer, и ни один из них не может воспроизводиться на моем компьютере при передаче в. Кроме того, 2-й размер файла 3gpp немного меньше исходного 3gpp.

1. Вот как я инициализирую MediaRecorder

String voiceStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + getPackageName() + File.separator  + "media" + File.separator + "voices" + File.separator + "temp.3gpp";
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setOutputFile(voiceStoragePath);

2. После завершения записи вот как я конвертирую его в байтовый массив

File file = new File(voiceStoragePath);
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];

for (int readNum; (readNum = fis.read(b)) != -1;) {
    bos.write(b, 0, readNum);
}

byte[] bytes = bos.toByteArray();

3. Теперь сохраняем байты в файл.3gpp.

String voiceStoragePath2 = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + getPackageName() + File.separator  + "media" + File.separator + "voices" + File.separator + "temp2.3gpp";
File path = new File(voiceStoragePath2);
FileOutputStream fos = new FileOutputStream(path);
fos.write(bytes);
fos.close();

4. Устройство File Explorer

5. Воспроизведение с помощью MediaPlayer

mediaPlayer.setDataSource(outputFile);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(this);

Журнал:E/MediaPlayerNative: ошибка (1, -2147483648)

1 ответ

Ну, это случилось. Это было настолько очевидно, что я должен сначала остановить MediaRecorder, прежде чем конвертировать 3gpp в байтовый массив. До сих пор не могу поверить, как я скучал по этому.

mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;

byte[] bytes = convert(voiceStoragePath);
Другие вопросы по тегам