Side Projects - Recorder
소리를 녹음하고 재생하는 기본적인 녹음기 앱을 구현한 프로젝트
- GitHub -> https://github.com/hwayeon351/Recorder
학습 회고
오늘은 MediaRecorder와 MediaPlayer 클래스를 사용해서 녹음 기능과 재생 기능을 구현해보았다.
또한, 녹음기의 State에 따라 그에 맞게 버튼 UI가 바뀌도록 설정해주었다.
오늘 공부한 내용
Android 멀티미디어 프레임워크는 다양한 미디어 유형의 재생을 지원하여 오디오, 동영상, 이미지를 앱에 쉽게 적용할 수 있도록 한다.
멀티미디어 프레임워크의 MediaRecorder와 MediaPlayer API를 사용해서 오디오를 녹음하고 재생할 수 있다.
- MediaRecorder
MediaRecorder를 사용해서 안드로이드에서 지원하는 오디오나 동영상 포맷을 캡처하고 인코딩하는 기능을 사용할 수 있다.
레코딩 제어를 위한 State Diagram은 다음과 같다.
MediaRecorder를 사용하기 위해서는 Initial, Initialized, DataSourceConfigured를 거쳐 prepare() 함수를 호출해서 Prepared 상태로 만들어야 한다.
그래야 start() 함수를 호출해서 레코딩을 실행할 수 있다.
이를 위해서 MediaRecorder의 인스턴스를 생성하고 setAudioSource(), setOutputFormat(), setAudioEncoder(), setOutputFile() 메서드를 통해 초기화를 해줘야 한다.
- setAudioSource(): 오디오 소스를 설정한다. 녹음기 앱에서는 마이크를 사용할 것이므로 MIC로 설정
- setOutputFormat(): 출력 파일 포맷을 설정한다. setAudioSource()를 호출한 이후에 설정해줘야 한다.
- setAudioEncoder(): 오디오 인코더를 설정한다. setOutputFormat()을 호출한 이후에 설정해줘야 한다.
- setOutputFile(): 출력 파일이 생성될 path를 설정한다. setOutputFormat()을 호출한 이후에 설정해줘야 한다.
이렇게 초기화를 해주고 prepare() 함수를 호출하면 Prepared 상태가 된다.
이후, start() 함수를 호출해서 Recording 상태로 바꾸어 녹음을 실행할 수 있다.
작업이 완료되면 stop() 함수를 호출한 후 relase() 함수를 호출해서 MediaRecoder 자원을 방출하면 된다.
https://developer.android.com/guide/topics/media/mediarecorder?hl=ko
- MediaPlayer
MediaPlayer를 사용해서 애플리케이션 리소스에 저장된 미디어 파일이나 파일 시스템의 파일, 네트워크 연결을 통해 들어오는 데이터 스트림 등의 오디오나 동영상을 재생할 수 있다.
다음은 MediaPlayer의 State Diagram이다.
처음에 MediaPlayer의 새로운 인스턴스를 생성하면 Idle 상태이다.
setDataSource()를 호출해서 재생할 파일의 Path를 넣어주면 Initialized 상태가 되며, 이후 prepare() 함수를 호출해서 Prepared 상태가 된다.
그리고 start() 함수 호출을 통해 플레이어를 시작시킬 수 있다.
MediaPlayer는 시스템 리소스를 소비하기 때문에 필요 이상으로 오랫동안 MediaPlayer 인스턴스를 유지하지 않아야한다.
즉, 작업이 끝나면 항상 release()를 호출해서 할당된 시스템 리소스가 올바르게 해제되도록 해야한다.
이 녹음기 앱에서는 간단한 녹음만 지원하기 때문에 비동기 처리는 하지 않았다.
하지만 MediaPlayer의 prepare() 호출이 오래걸리는 경우가 있다. 미디어 데이터를 가져오고 디코딩해야 할 수도 있기 때문이다.
따라서 오래 걸리는 작업의 경우 UI thread에서 호출하면 ANR 오류가 발생할 수 있다.
이는 사용자에게 앱이 느리다는 인상을 줄 수 있다.
ANR 오류를 방지하기 위해 다른 작업 스레드를 생성해서 MediaPlayer의 prepare()을 호출하고 완료되면 UI thread에 알리는 방식을 사용해야 한다. 이를 더 편리하게 하도록 제공되는 prepareAsync() 메서드르 활용할 수 있다.
prepare() 로직이 완료되면 setOnPreparedListener()를 통해 구성된 MediaPlayer.OnpreparedListner의 onPrepare() 메서드가 호출된다.
https://developer.android.com/guide/topics/media/mediaplayer?hl=ko
'Android > Side Projects' 카테고리의 다른 글
Simple Web Browser 앱 개발하기 (0) | 2022.02.03 |
---|---|
녹음기 앱 개발하기 (0) | 2022.02.02 |
녹음기 앱 개발하기 (0) | 2022.01.31 |
Pomodoro Timer 앱 개발하기 (0) | 2022.01.30 |
Pomodoro Timer 앱 개발하기 (0) | 2022.01.29 |