2017-01-29 1 views
2

내 앱은 음성 녹음 용으로 MediaRecorder를 사용합니다. 약 50 %의 상황에서 MediaPlayer로 재생할 수없는 파일이 생성됩니다. VLC 플레이어를 사용하면 모든 오디오가 정상입니다.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 연장 .3gp입니까? – Embydextrous

+0

유효하고 잘못된 파일에 대한 링크를 복사하여 진행 상황을 확인할 수 있습니까? – manishg

답변

2

시도는 AAC에 대한 귀하의 AudioEncoder을 변경. 대부분의 미디어 플레이어는 이러한 형식의 파일을 재생할 수 있습니다.

1

아마도 파일 저장/검색 방법 때문일 수 있습니다. 이 부분은 어떻게 관리하고 있습니까?

외부 저장소 (Environment.getExternalStorageDirectory())에 파일을 배치하는 것이 좋습니다.

MediaPlayer의 인스턴스를 여러 개 사용하는 경우 다른 인스턴스에서 리소스를 사용하기 전에 리소스에 release()을 실행했는지 확인하십시오.

+0

응용 프로그램의 경우 특정 폴더가 있습니다. 이 폴더에 파일 이름을 만듭니다. 그런 다음이 파일 이름을 사용합니다. mRecorder.setOutputFile (audioFileName); 1 개의 MediaRecorder 만 사용합니다. 사용 후 풀어 놓는다. – tjm1706

+0

처음으로 비디오를 재생 한 후에도 MediaPlayer를 릴리스해야합니다. 그렇지 않으면 다시 녹음 할 수 없습니다. –

+0

예, 위의 코드를 참조하십시오. 녹음 후 릴리스합니다. – tjm1706

관련 문제