Android 에서 제공하는 Recording API 중, 지난번에 보았던 AudioRecorder 말고 더 편리한 MediaRecorder 가 있습니다.
AudioRecorder 는 오디오만 레코딩 가능 하지만, MediaRecorder 의 경우 Audio 및 Video 컨텐츠의 레코딩이 가능 합니다.
다만 인코딩 된 파일을 받기 때문에 AudioRecorder 처럼 PCM Data 를 바로 받아올 수는 없는 단점이 있습니다.
본인이 구현하려는 레코더의 사용 용도에 맞게 AudioRecorder/MediaRecorder 를 선택하여 사용하시면 되겠습니다.
Android Developer 의 MediaRecorder API Guide 를 참고하면, MediaRecorder 는 아래와 같은 state machine 을 갖습니다.
따라서 MediaRecorder API 를 사용할 때는 아래의 State 를 잘 따라서 코딩해야 합니다. 예를들어 Initail 상태에서는 바로 Prepared 상태로 갈 수 없고, Initailized 와 DataConfigured 상태를 거쳐야지 Prepared 상태가 될 수 있습니다.
이를 어기게 되면 StateIllegalException 이 발생하고, 원하는 동작을 얻을 수 없으니 조심해야 합니다.
Android Developer 사이트에서 설명하는 일반적인 Recording Flow 는 아래 코드와 같습니다.
각 단계별로 실제 레코딩시 일어나는 동작들에 대해 살펴보도록 하겠습니다.
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC); //----------- (1)
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); // -- (2)
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // ------(3)
recorder.setOutputFile(PATH_NAME);
recorder.prepare(); // -----------------------------------------------(4)
recorder.start(); // Recording is now started ----------------------(5)
...
recorder.stop();
recorder.reset(); // You can reuse the object by going back to setAudioSource() step
recorder.release(); // Now the object cannot be reused
(1) AudioSource 설정
AudioSource 의 종류는 아래 표에 정리되어 있습니다.
DEFAULT |
0 |
Default audio source |
MIC |
1 |
Microphone audio source |
VOICE_UPLINK | 2 | Voice call uplink (TX) audio source |
VOICE_DOWNLINK |
3 |
Voice call downlink (RX) audio source |
VOICE_CALL |
4 |
Voice call uplink + downlink audio source |
CAMCORDER | 5 |
Microphone audio source tuned for video recording. wit the same orientation as the camera if available |
VOICE_RECOGNITION |
6 | Microphone audio source tuned for voice recognition |
VOICE_COMMUNICATION |
7 |
Microphone audio source tuned for voice communications such as VoIP |
REMOTE_SUBMIX |
8 |
Audio source for a submix for audio streams to be presented remotely. An application can use this audio source to capture a mix of audio streams that should be transmitted to a remote receiver such as a Wifi display |
UNPROCESSED |
9 |
Microphone audio source tuned for unprocessed sound if available. |
RADIO_TUNER |
1998 |
Audio source for capturing broadcast radio tuner output |
HOTWORD |
1999 |
Audio source for preemptible, low-priority software hotword detection |
보통은 마이크로 들어오는 음성을 많이 녹음하기 때문에 MIC 값을 많이 사용하고, 용도에 맞게 그 외의 값들을 설정할 수 있습니다.
제일 아래 RADIO_TUNER 와 HOTWORD 는 System API 로 일반 Application 에서는 사용 불가 합니다.
setAudioSource 함수가 호출되지 않을 경우에는 output file 에 audio track 이 포함되지 않습니다. 즉, 오디오가 녹음되지 않는다는 이야기입니다.
오디오를 녹음하고 싶으면 setAudioSource 함수를 prepare 전에 꼭 호출해 주어야 합니다.
(2) Output Format 설정
레코딩 후 실제 파일로 저장할 때, 저장할 파일의 format 을 설정해 줄 수 있습니다.
DEFAULT |
0 |
THREE_GPP |
1 |
MPEG_4 |
2 |
AMR_NB |
3 |
AMR_WB |
4 |
AAC_ADIF |
5 |
AAC_ADTS |
6 |
OUTPUT_FORMAT_RTP_AVP |
7 |
MPEG_2_TS |
8 |
WEBM |
9 |
비디오 포맷으로 가장 많이 사용되는 THREE_GPP 혹은 MPEG_4 가 있고, 오디오만 녹음 할 경우에는 오디오 전용 파일포맷인 AMR 이나 AAC 가 많이 사용 됩니다.
setOutputFormat() 함수는 setAudioSource()/setVideoSource() 호출 이후 / prepare() 이전에 호출되어야 합니다.
(3) AudioEncoder 설정
Audio Recording 시 Audio Encoder 를 설정해 주는 함수 입니다. 이 함수를 호출하지 않을 경우에 녹음된 파일에 audido track 은 포함되지 않습니다.
즉, 이 함수도 setAudioSource 와 동일하게 오디오를 녹음하고 싶다면 setOutputFormat() 이후 / prepare() 이전에 꼭 호출해 주어야 합니다.
DEFAULT |
0 |
AMR_NB |
1 |
AMR_WB |
2 |
AAC |
3 |
HE_AAC |
4 |
AAC_ELD |
5 |
VORBIS |
6 |
(4) prepare
prepare 단계는 앞서 설정한 설정값들로 recording 을 준비하는 단계 입니다.
때문에 이 함수는 audio/video source와 audio/video encoder 를 모두 설정하고 file format 을 확정 지은 후에 불려야 합니다.
이 함수가 불리면 위의 State Machine 에서 recorder 는 prepared 상태가 되어 start 나 reset 을 호출할 수 있습니다.
(5) start
start 함수를 호출하면 정해놓은 audio/video source 에서 실제 레코딩을 시작하게 되고, state 는 Recording 상태가 됩니다.
start 이후 원하는 시점에 stop 을 호출하면, 그 시점까지 레코딩이 진행 됩니다.
이 외에도 API Level 24 부터 제공되는 pause() / resume() 함수를 이용해 레코딩을 잠시 멈추는 것이 가능합니다.
stop() 과 다르게 pause() 함수로 레코딩을 멈추면 기존의 configuration 은 유지된 채로 MediaRecorder 가 잠시 멈추게 됩니다.
이 상태에서 resume() 함수로 레코딩을 다시 시작할 수 있습니다. 당연한 이야기지만 paused 상태에서 레코딩 되는 내용은 버려지게 됩니다.
developer 사이트를 참고하면 위의 간단한 API 이외에도 MediaRecorder 에서 제공하는 다양한 API 들을 볼 수 있으니 참고하시면 되겠습니다.
https://developer.android.com/reference/android/media/MediaRecorder.html
다음 포스팅에서는 MediaRecorder 를 이용한 실제 레코딩 예제를 살펴보도록 하겠습니다.
'Android > 기본 개념' 카테고리의 다른 글
View.post() 사용하기 (0) | 2017.12.30 |
---|---|
MediaRecorder API 를 사용한 레코딩 예제 (0) | 2017.12.27 |
runOnUiThread 사용하기 (0) | 2017.12.19 |
안드로이드 메인 스레드(Android Main Thread 또는 UI Thread) (1) | 2017.12.08 |
AudioRecorder와 AudioTrack 을 사용한 녹음, 재생 방법 및 예제 (4) | 2017.11.28 |