Android 에서 음성을 녹음할 때 사용할 수 있는 API 는 여러가지가 있지만, 지난 포스팅에서 가장 대표적으로 사용되는 AudioRecord API 를 이용한 예제를 다루어 보았습니다.
이번 포스팅에서는 MediaRecorder API 를 이용한 음성 녹음 예제를 다루어 보겠습니다.
AudioRecord 를 이용한 예제처럼 간단하게 완성할 수 있습니다.
1. main layout 구성하기
layout 은 간단히 버튼을 두개 놓고, 하나는 녹음 시작/정지, 다른 하나는 녹음된 컨텐츠를 재생/정지 하도록 구현해 보겠습니다.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.codetravel.mediarecorder.MainActivity">
<Button
android:id="@+id/bt_record"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start Recording"/>
<Button
android:id="@+id/bt_play"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start Playing"/>
</LinearLayout>
이를 위해 bt_record 와 bt_play 를 각각 layout 에 추가 하고, MainActivity 에서 각각의 버튼에 대한 OnClickListener() 를 구현 해 줍니다.
OnClickListener() 에서는 현재 레코딩 상태에 따라서 recorder 를 Start 하거나 Stop 하는 부분이 구현될 것입니다.
2. MediaRecorder 생성 후 레코딩 준비하기
recorder 를 start 하기에 앞서, MediaRecorder 객체를 하나 생성 하고 레코딩 할 파일의 포맷, 인코더 등등을 설정 해 줍니다.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRecorder = new MediaRecorder(); } // 레코더 기본 설정 void initAudioRecorder() { mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/record.aac"; Log.d(TAG, "file path is " + mPath); mRecorder.setOutputFile(mPath); try { mRecorder.prepare(); } catch (Exception e) { e.printStackTrace(); } }
initAudioRecorder() 함수 안에다가 MediaRecorder prepare 단계 까지 모든 설정들을 구현 합니다.
MediaRecorder 의 State Diagram 을 참고하면, 한번 MediaRecorder 를 Stop 할 시에, 각종 설정들을 다시 해 주어야 하기 때문에 함수로 분리하여 구현하는 것이 추후 더 편리합니다.
3. 녹음 시작/ 정지
isRecording 이라는 flag 를 두어 현재 녹음 중인지 아닌지를 구분 할 수 있습니다.
현재 녹음중이 아니면 initAudioRecorder(), start() 를 수행 하여 녹음을 시작하고, 녹음중 일 경우에는 stop() 을 호출하여 녹음을 정지합니다.
isRecording flag 와 button 의 text 는 현재 상태에 맞게 update 합니다.
boolean isRecording = false; Button mBtRecord = null; @Override protected void onCreate(Bundle savedInstanceState) { .. mBtRecord = (Button) findViewById(R.id.bt_record); mBtRecord.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isRecording == false) { initAudioRecorder(); mRecorder.start(); isRecording = true; mBtRecord.setText("Stop Recording"); } else { mRecorder.stop(); isRecording = false; mBtRecord.setText("Start Recording"); } } });
4. 재생 시작하기
재생 버튼에 대한 onClickListener 를 생성하고 재생을 위한 MediaPlayer 객체를 하나 생성합니다.
버튼이 한번 클릭 되었을 때, setDataSource/prepare/start 과정을 진행 해줍니다.
'MediaPlayer' 도 MediaRecorder 와 같이 State Diagram 을 참고하여 각 State 에 맞는 함수를 호출해 주어야 합니다.
한번 Stop 을 호출 하게 되면 stopped 상태가 되어 다시 started 상태로 가기 위해서는 prepare/start 함수를 순차적으로 호출해야 합니다.
=> 만약 현재 상태에서 부를 수 없는 함수를 호출하는 경우 ( 예를들어 stopped 상태에서 prepare를 호출하지 않고 start 부터 호출하는 경우)에는 IllegalStateException 이 발생하니 주의 해야 합니다.
MediaPlayer mPlayer = null; boolean isPlaying = false; Button mBtPlay = null; @Override protected void onCreate(Bundle savedInstanceState) { .. mBtPlay = (Button) findViewById(R.id.bt_play); mBtPlay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isPlaying == false) { try { mPlayer.setDataSource(mPath); mPlayer.prepare(); }catch (Exception e) { e.printStackTrace(); } mPlayer.start(); isPlaying = true; mBtPlay.setText("Stop Playing"); } else { mPlayer.stop(); isPlaying = false; mBtPlay.setText("Start Playing"); } } }); mPlayer = new MediaPlayer(); mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { isPlaying = false; mBtPlay.setText("Start Playing"); } }); }
MediaPlayer는 onCompletion callback method 를 제공해 주고 있어서, 파일 재생이 끝날 경우에 대한 처리를 편리하게 해 줄 수 있습니다.
파일 재생이 완료되면 isPlaying flag 를 false 로 설정 하고, 버튼의 Text 를 변경해 주는 일을 수행하도록 구현 하였습니다.
여기까지 진행하면 음성을 녹음하고 재생하는 코드가 완성 됩니다. 상세 코드는 'github 코드' 를 참고하세요.
현재는 음성 녹음 뿐이지만 다음 포스팅에서는 카메라로 들어오는 Video 컨텐츠도 함께 레코딩 하여 비디오 파일을 만들어 보도록 하겠습니다.
'Android > 기본 개념' 카테고리의 다른 글
getMainLooper 사용하기 (0) | 2018.01.06 |
---|---|
View.post() 사용하기 (0) | 2017.12.30 |
MediaRecorder API 를 사용한 레코딩 방법 (0) | 2017.12.20 |
runOnUiThread 사용하기 (0) | 2017.12.19 |
안드로이드 메인 스레드(Android Main Thread 또는 UI Thread) (1) | 2017.12.08 |