Мое приложение использует MediaRecorder для записи голосового сообщения. Примерно в 50% ситуаций создается файл, который нельзя воспроизвести с помощью MediaPlayer. Когда я использую плеер VLC, все аудио в порядке.Android - MediaRecorder - часто создает неиграбельный выход
Я знаю, что последовательность состояний MediaRecorder важна. Я также пробовал, важно ли быть онлайн или нет. Нет разницы.
Возможно изменение формата/кодека помощи? Почему я могу воспроизвести файл в VLC, а не MediaPlayer?
Что делать:
mRecorder = new MediaRecorder();
mRecorder.reset();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile(audioFileName);
try {
mRecorder.prepare();
mRecorder.start();
} catch (Exception e) {
e.printStackTrace();
}
saveSpeech();
Метод saveSpeech это просто еще один способ в том же файле. Я поместил «перезагрузку» позже - все равно никакой разницы.
void saveSpeech(final Waypoint wp) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(WaypointActivity.thisActivity);
alertDialog.setTitle("Recording ...");
alertDialog.setMessage("Recording ... ");
alertDialog.setPositiveButton("YES", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int which) {
if(mRecorder != null) {
mRecorder.stop();
mRecorder.reset();
mRecorder.release();
mRecorder = null;
}
if(audioFileName == null) {
UserFeedback.show("Lost file name ... oops, App error");
return ;
}
}
});
alertDialog.setNegativeButton("NO", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
alertDialog.show();
}
Пример valid 3GP file. Пример invalid 3GP file.
По запросу трассировки стека добавил:
Exception: message=[Prepare failed.: status=0x1], cause=[null], class=[class java.io.IOException], trace=[java.io.IOException: Prepare failed.: status=0x1
at android.media.MediaPlayer._prepare(Native Method)
at android.media.MediaPlayer.prepare(MediaPlayer.java:1158)
at nl.deholtmans.waypoints.FragmentWpDetailUpdate$4.onItemClick(FragmentWpDetailUpdate.java:262)
at android.widget.AdapterView.performItemClick(AdapterView.java:310)
at android.widget.AbsListView.performItemClick(AbsListView.java:1145)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3066)
at android.widget.AbsListView$3.run(AbsListView.java:3903)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5461)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Вы пытались изменить свой AudioEnconder? Может быть, для AAC? –
Что такое имя звукового файла? Это расширение conatin .3gp? – Embydextrous
Можете ли вы скопировать ссылку на действительный и недопустимый файл, чтобы мы могли проверить, что происходит? – manishg