Преобразование MediaRecorder .3gpp в байт, а затем получение обратно в .3gp не работает - PullRequest
0 голосов
/ 09 октября 2018

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

Второй файл 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.Обозреватель файлов устройства

enter image description here

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

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

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

1 Ответ

0 голосов
/ 09 октября 2018

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

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

byte[] bytes = convert(voiceStoragePath);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...