레퍼런스 : http://developer.android.com/reference/android/media/MediaRecorder.html
오디오나 비디오를 녹음/녹화하는 객체. 기본적인 흐름은 위 링크를 열면 나오는 이미지를 통해 볼 수 있다.
기본적으로, 객체를 초기화하고 환경설정을 해준 뒤 시작하는 과정.
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(PATH_NAME);
recorder.prepare();
recorder.start(); // Recording is now started
...
recorder.stop();
recorder.reset(); // You can reuse the object by going back to setAudioSource() step
recorder.release(); // Now the object cannot be reused
이러한 흐름인데, 중요한 것은 release()는 써 있는 것처럼 객체를 더 이상 사용하지 않을 때 해줘야 한다. 한 번 녹음하고 릴리즈 해버리면 객체가 null이 아니어도 새로 초기화 해줘야 한다. 연속으로 사용해야 될 때는 조심하자.
OutputFile의 경로에는 경로 + 파일 이름(확장자 포함)까지 모두 들어간다. 그러면 stop()을 호출했을 때 자동으로 파일 저장까지 이루어진다.
그 뒤는 MediaPlayer 객체를 이용해 재생시켜주면 끝. 이 부분은 다음에.
ps주의할 점은 이 객체를 사용하다가 오류가 나는 경우가 있다. 그 오류 메세지가 자세하게 '어떠하다'라고 적혀있지 않기 때문에 디버깅이 힘들다.. 검색해보면 대부분 퍼미션에 대해 이야기를 하는데,
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="andoird.permission.RECORD_AUDIO" />
두 퍼미션을 주는 건 기본이나, 그래도 해결이 안될 때가 있다. 개인적인 경험에 의한 원인은 MediaRecorder객체를 따로 클래스를 분리해서 사용했기 때문이었다. 클래스를 분리하고, 그 쪽에서 초기화하고 설정하고 start()했더니 그 부분에서 에러를 냈다. 이유는... 모르겠다 -_-ㅋ
예제코드)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | private void startRecord() { FILE_NAME = System.currentTimeMillis() + ".mp3"; mVoiceRecord = new MediaRecorder(); mVoiceRecord.reset(); // mediaRecord configuration mVoiceRecord.setAudioSource(MediaRecorder.AudioSource.MIC); mVoiceRecord.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mVoiceRecord.setOutputFile(getFilesDir().getAbsolutePath() + File.separator + FILE_NAME); mVoiceRecord.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { mVoiceRecord.prepare(); } catch (IOException e) { } mVoiceRecord.start(); } private void stopRecord() { if (null != mVoiceRecord) { mVoiceRecord.stop(); mVoiceRecord.release(); } } | cs |
댓글