ABOUT ME

-

  • Android) 음성 녹음을 위한 MediaRecorder 알아보기
    Android 2021. 4. 12. 21:17


    진행하는 프로젝트에서 음성 녹음 기능이 필요로 해서 Media Recorder에 대해 알아보려 합니다.

     

    Android에서 제공하는 기본 Recording API에는 Audio RecorderMedia 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에서 recorderprepared 상태가 되어 start() 혹은 reset()을 호출할 수 있습니다.

    start()

    • start() 함수를 호출하면 레코딩을 시작하게 되고, state machinestateRecording 상태가 됩니다.
    • start 이후에 원하는 시점에 stop을 호출하면, 그 시점까지 리코딩이 진행됩니다.

    stop(), reset(), release()

    • stop() 함수는 리코딩을 멈추고 저장합니다. 다시 사용하려면 다시 설정해줘야 합니다.
    • reset() 함수는 리코딩을 리셋 시킵니다. 다시 사용하려면 다시 설정해줘야 합니다.
    • release() 함수는 완전히 자원을 해제시키고 반환합니다. 작업이 완료되면 해당 함수를 호출하여 리소스를 확보해야 합니다.

    Preference

    MediaRecorder API를 사용한 레코딩

     

    반응형

    댓글

Designed by Me.