2017-01-29 3 views
2

Мое приложение использует 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) 
+0

Вы пытались изменить свой AudioEnconder? Может быть, для AAC? –

+0

Что такое имя звукового файла? Это расширение conatin .3gp? – Embydextrous

+0

Можете ли вы скопировать ссылку на действительный и недопустимый файл, чтобы мы могли проверить, что происходит? – manishg

ответ

2

Попробуйте изменить AudioEncoder для AAC. Поскольку большинство медиаплееров могут воспроизводить этот тип файлов.

1

Возможно, ваша проблема связана с тем, как вы сохраняете/извлекаете файл. Как вы управляете этой частью?

Предлагаю разместить файлы на внешнем хранилище (Environment.getExternalStorageDirectory()).

Также помните, если вы используете несколько экземпляров MediaPlayer, убедитесь, что вы выполнили release() на ресурсе, прежде чем пытаться использовать его в другом экземпляре.

+0

Для приложения у меня есть определенная папка. Я создаю имя файла в этой папке. Затем я использую это имя файла: mRecorder.setOutputFile (audioFileName); Я использую только 1 MediaRecorder. Я освобождаю его после использования. – tjm1706

+0

Вам необходимо выпустить MediaPlayer, после того как вы сыграете видео в первый раз, иначе вы не сможете записать еще один –

+0

Да, см. Выше код ..., который я выпустил после записи. – tjm1706