본문 바로가기
Android

MediaRecorder 미디어 녹음

by 루에 2015. 8. 4.
반응형

레퍼런스 : 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

반응형

댓글