Преобразование 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);