2017-01-29 3 views
2

Meine App verwendet den MediaRecorder zum Aufnehmen einer Sprachnachricht. In etwa 50% der Fälle wird eine Datei erzeugt, die nicht mit dem MediaPlayer abgespielt werden kann. Wenn ich den VLC-Player verwende, ist alles Audio in Ordnung.Android - MediaRecorder - produziert oft unspielbare Ausgabe

Ich weiß, dass die Reihenfolge der MediaRecorder Staaten wichtig ist. Ich habe auch versucht, ob es wichtig ist online zu sein oder nicht. Kein Unterschied.

Kann das Ändern des Formats/Codecs helfen? Warum kann ich die Datei in VLC und nicht im MediaPlayer abspielen?

Was kann ich tun:

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(); 

Methode saveSpeech nur ein weiteres Verfahren in der gleichen Datei. Ich habe später den 'Reset' gesetzt - immer noch kein Unterschied.

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(); 
} 

Beispiel für eine valid 3GP file. Beispiel für eine invalid 3GP file.

Auf Wunsch der Stack-Trace hinzugefügt:

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

Haben Sie versucht, Ihren AudioEnconder zu wechseln? Vielleicht für AAC? –

+0

Was ist Audiofile Name? Gibt es Erweiterung .3gp? – Embydextrous

+0

Können Sie einen Link zu einer gültigen und ungültigen Datei kopieren, damit wir überprüfen können, was vor sich geht? – manishg

Antwort

2

Versuchen Sie, Ihre AudioEncoder für AAC ändern. Die meisten Media Player können diesen Dateityp abspielen.

1

Ihr Problem liegt wahrscheinlich an der Art, wie Sie die Datei speichern/abrufen. Wie verwalten Sie diesen Teil?

Ich schlage vor, Sie legen Sie Ihre Dateien auf externen Speicher (Environment.getExternalStorageDirectory()).

Denken Sie auch daran, wenn Sie mehrere Instanzen von MediaPlayer verwenden, stellen Sie sicher, dass Sie release() auf einer Ressource ausgeführt haben, bevor Sie versuchen, es in einer anderen Instanz zu verwenden.

+0

Für die App habe ich einen bestimmten Ordner. Ich erstelle einen Dateinamen in diesem Ordner. Dann benutze ich diesen Dateinamen: mRecorder.setOutputFile (audioFileName); Ich benutze nur 1 MediaRecorder. Ich lasse es nach dem Gebrauch los. – tjm1706

+0

Sie müssen den MediaPlayer auch freigeben, nachdem Sie das Video zum ersten Mal abgespielt haben, sonst können Sie keinen weiteren –

+0

aufnehmen Ja, siehe obigen Code ... den ich nach der Aufnahme freigebe. – tjm1706

Verwandte Themen