2017-01-29 3 views
2

私のアプリケーションは、音声メッセージの録音にMediaRecorderを使用します。状況の約50%で、MediaPlayerで再生できないファイルが生成されます。 VLCプレーヤーを使用すると、すべてのオーディオはOKです。Android - MediaRecorder - 再生できない出力を生成することが多い

私は、MediaRecorder状態のシーケンスが重要であることを知っています。私はまたオンラインであることが重要かどうかを試しました。変わりはない。

フォーマット/コーデックのヘルプを変更できますか? MediaPlayerではなくVLCでファイルを再生できるのはなぜですか?

私は何をしますか:

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 extension .3gpですか? – Embydextrous

+0

有効なファイルと無効なファイルにリンクをコピーして、何が起きているのかを確認できますか? – manishg

答えて

2

はAACのためのあなたのAudioEncoderを変更してみてください。ほとんどのメディアプレイヤーはこのタイプのファイルを再生できるため、

1

あなたの問題はおそらくファイルを保存/取得する方法によるものです。 この部分はどのように管理していますか?

ファイルを外部ストレージ(Environment.getExternalStorageDirectory())に置くことをお勧めします。

MediaPlayerの複数のインスタンスを使用している場合は、別のインスタンスで使用する前に、リソース上でrelease()を実行したことを確認してください。

+0

私は特定のフォルダを持っています。このフォルダにファイル名を作成します。次に、私はこのファイル名を使用します:mRecorder.setOutputFile(audioFileName); 私は1つだけMediaRecorderを使用します。私は使用後にリリースします。 – tjm1706

+0

初めてビデオを再生した後もMediaPlayerを解放する必要があります。そうしないと別のメディアを録音できません –

+0

上記のコードを参照してください。 – tjm1706

関連する問題