-
Android) 음성 녹음을 위한 MediaRecorder 알아보기Android 2021. 4. 12. 21:17
진행하는 프로젝트에서 음성 녹음 기능이 필요로 해서 Media Recorder에 대해 알아보려 합니다.
Android에서 제공하는 기본 Recording API에는 Audio Recorder와 Media Recorder가 있는데,
Audio Recorder의 경우 오디오만 녹음 가능하지만, Media Recorder는 오디오 및 비디오 녹음이 가능하다고 합니다.
하지만 Media Recorder의 경우 인코딩 된 파일을 받기 때문에 Audio Recorder처럼 PCM Data를 바로 받아올 수 없는 단점이 있습니다.
Media Recorder
- Media Recorder는 아래와 같은 state machine을 가지고 있습니다.
- 그렇기 때문에 해당 state를 잘 이해하고 코드를 짜야 state가 꼬이지 않습니다.
리코딩 시에 각 단계별 동작에 대해 알아보겠습니다.
/** AndroidManifest **/ <uses-permission android:name="android.permission.RECORD_AUDIO" /> // 녹음 권한 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> // sd카드 읽음 file = "${requireActivity().externalCacheDir?.absolutePath}/recording.3gp" // 녹음 파일 저장할 위치 지정 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC) // 오디오 입력 지정 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS) // 출력 형식 지정 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC) // 음성데이터는 용량이 크기 때문에 압축을 위해 인코딩 mediaRecorder.setOutputFile(file) // 음성 데이터를 저장할 파일 지정 mediaRecorder.prepare() // 레코딩 준비 mediaRecorder.start() // 레코딩 시작 mediaRecorder.stop() // 레코딩 중지 mediaRecorder.reset() // setAudioSource () 단계로 돌아가서 객체를 재사용 할 수 있습니다. meidaRecorder.release() // 이제 object를 재사용 할 수 없습니다.
AudioSource의 종류에 관한 표입니다.
- 마이크로 들어오는 음성을 녹음하기 위해서 MIC 값을 많이 사용합니다.
- setAudioSource 함수가 호출되지 않을 경우 output file에 audio track이 포함되지 않습니다. 즉 리코딩하기 위해서 prepare() 함수 전에 꼭 setAudioSource 함수를 호출해줘야 합니다.
OutputFormat 설정에 관한 표입니다.
- 리코딩 후 파일로 저장할 때, 파일의 format을 설정해 줄 수 있습니다.
- 비디오 포맷은 THREE_GPP, MPEG_4가 많이 사용되고, 오디오만 녹음 할 경우 AMR, AAC가 많이 사용됩니다.
- 이 함수는 prepare() 함수 이전에 호출되어야 합니다.
AudioEncoder 설정에 관한 표입니다.
- 이 함수를 호출하지 않을 경우에 녹음된 파일에 audio track은 포함되지 않습니다.
- 즉 리코딩을 위해 이 함수 역시 prepare() 함수 이전에 호출되어야 합니다.
prepare()
- prepare() 함수는 앞서 설정한 값들로 리코딩을 준비하는 단계입니다.
- 이 함수가 호출되면 위의 state machine에서 recorder는 prepared 상태가 되어 start() 혹은 reset()을 호출할 수 있습니다.
start()
- start() 함수를 호출하면 레코딩을 시작하게 되고, state machine의 state는 Recording 상태가 됩니다.
- start 이후에 원하는 시점에 stop을 호출하면, 그 시점까지 리코딩이 진행됩니다.
stop(), reset(), release()
- stop() 함수는 리코딩을 멈추고 저장합니다. 다시 사용하려면 다시 설정해줘야 합니다.
- reset() 함수는 리코딩을 리셋 시킵니다. 다시 사용하려면 다시 설정해줘야 합니다.
- release() 함수는 완전히 자원을 해제시키고 반환합니다. 작업이 완료되면 해당 함수를 호출하여 리소스를 확보해야 합니다.
Preference
반응형'Android' 카테고리의 다른 글
Android) Dagger Hilt - @ViewModelInject, @Assited, @ApplicationComponent is Deprecated(2.33-beta) (0) 2021.04.18 Android) MediaPlayer 재생 지연 오류 (0) 2021.04.13 Android) Retrofit2 작동 원리 알아보기 (0) 2021.04.09 Android) Device 실제 사이즈 구하기 (feat - display, getRealMetrics) (0) 2021.04.08 Android) State 패턴을 통해서 UI 상태 관리하기 (0) 2021.02.26