wanna be dev 🧑‍💻

Cool 하고 Sick한 개발자가 되고 싶은 uzun입니다

A.K.A. Kick-snare, hyjhyj0901, h_uz99 solvedac-logo

Android/Challenge

패스트캠퍼스 챌린지 42일차

Kick_snare 2022. 3. 6. 03:32
728x90

42일차

30개 프로젝트로 배우는 Android 앱 개발 with Kotlin 초격차 패키지 Online

강의 목표


  • 프로젝트를 따라해보며 앱개발에 필요한 기술을 학습할 수 있습니다.
  • 프로젝트를 따라해보며 앱개발에 필요한 기술을 학습할 수 있습니다.
  • 앱 개발시 원하는 기능을 구현하기 위해 어떤 기술이 필요한 지 알 수 있습니다.
  • 디자인 아키텍처 패턴, 비동기 처리 등 효율적인 앱 개발 방법을 익힐 수 있습니다.

목차 02 Basic - Ch07. 녹음기


  • 기본 UI 구성
  • 권한 요청하기
  • 녹음 기능 구현하기 - 1
  • 녹음 기능 구현하기 - 2
  • 오디오 시각화
  • 마무리

녹음 기능 구현하기 - 1

MediaRecorder 알아보기

녹음을 위한 MediaRecorder 객체는 일정한 상태를 가진다.

출처 : 안드로이드 레퍼런스

뭐 복잡해 보이지만, 생성하고 바로 녹음 가능한 것이 아니라 Intial 상태에서 여러 과정을 거치는 준비가 필요하다
간략하게 알아보자면

  1. 오디오 소스 파일을 라이트하게 압축시키는 인코딩 과정이 일어난 후
  2. 컨테이너에 잘 정리한 뒤
  3. 디코더가 꺼내서 쓴다

각자의 코덱과 지원하는 코덱이 있기 때문에 이에 유의해야 한다.

  • 코덱(MP3, FLAC 등)
  • 컨테이너(3GPP, MPEG-4 등)

녹음 시작과 중지

가장 대중적인? (잘 모름 사실 ㅋ) 3pg와 AMR 을 사용하도록 하겠다.
그럼 인스턴스를 선언하고 녹음을 시작하는 startRecord() 함수를 짜보도록 하자

private var recorder: MediaRecorder? = null

private val recordingFilePath: String by lazy {
    "${externalCacheDir?.absolutePath}/recording.3gp"
}

private fun stateRecord() {
    recorder = MediaRecorder().apply {
        setAudioSource(MediaRecorder.AudioSource.MIC)
        setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP) // 컨테이너
        setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB) // 코덱 지정
        setOutputFile(recordingFilePath)
        prepare()
    }
    recorder?.start()
}

MediaRecorder 인스턴스를 선언할 때 null로 두는 이유는 메모리 리소스를 위해 녹음이 끝나면 메모리 해제해주는 것이 좋기 때문이다.

output file을 저장하는 경로를 보면 externalCacheDir에 저장하는 모습을 볼 수 있는데, 이는 Internal로 하기엔 녹음 파일의 크기를 감당하기 힘들 수 있기 때문에 임시 저장소인 앱의 외부 캐시 루트에 저장하는 것이다.

private fun stopRecording() {
    recorder?.run {
        stop()
        release()
    }
    recorder = null
}

종료하는 함수는 간단하다. 정지시키고 메모리 해제 후 null 할당!


본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

수강인증샷

링크

https://bit.ly/37BpXiC

 

 

 

728x90