2013년 7월 15일 월요일

[Android] Audio 재생 과 녹음

1. 오디오 재생 주요순서

1.1 MediaPlayer 객체 생성
- MediaPlayer player = new MediaPlayer ();

1.2 데이터 소스 (URL || 단말sd카드 || 프로젝트 파일에 포함(res,assets)) 지정
- player.setDataSource(filename);

1.3 준비
- player.prepare();

1.4 시작
- player.start();

2. 오디오 재생중지 주요순서

2.1 재생 중지
- player.stop();

2.2 재생에 사용됐던 메모리 해제
- player.release();
- player = null;

3. 오디오 녹음 주요순서

3.1 MediaRecorder 객체 생성
- MediaRecorder  recorder = new MediaRecorder();

3.2 오디오 입력 및 출력 형식 설정
- recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
- recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

3.3 오디오 인코더와 파일 지정
- recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

3.4 녹음준비,시작
- recorder.prepare();
- recorder.start();

3.5 메니페스트에 권한 설정
<uses-permission android:name="android.permission.RECORD_AUDIO" />

4. 오디오 녹음중지 주요순서

4.1 녹음 중지
- recorder.stop();

4.2 녹음에 사용됐던 메모리 해제
- recorder.release();
- recorder = null;

5. 예제
android version = jelly bean
import java.io.File;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
 // URL 오디오 파일 위치
 // 웹 상에 있는 오디오 파일을 재생할때는 permission.WRITE_EXTERNAL_STORAGE 를 추가해야한다.
 public static final String Audio_Url = "http://sites.google.com/site/ubiaccessmobile/dample_audio.amr";
 
 // 녹음된 오디오 저장할 위치
 // 내장 메모리를 사용하려면 permission.WRITE_EXTERNAL_STORAGE 를 추가해야한다.
 // Environment.getExternalStorageDirectory()로 각기 다른 핸드폰의 내장메모리의 디렉토리를 알수있다.
 final private static File RECORDED_FILE = Environment.getExternalStorageDirectory();
 
 String filename;
    // MediaPlayer 클래스에 재생에 관련된 메서드와 멤버변수가 저장어되있다.
    MediaPlayer player;
    // MediaRecorder 클래스에  녹음에 관련된 메서드와 멤버 변수가 저장되어있다.
    MediaRecorder recorder;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button recordBtn = (Button) findViewById(R.id.recordBtn);
        Button recordStopBtn = (Button) findViewById(R.id.recordStopBtn);
        Button playBtn = (Button) findViewById(R.id.playBtn);
        Button playStopBtn = (Button) findViewById(R.id.playStopBtn);
        
        // 저장할 파일 위치를 String 으로 처리했다.
        // RECORDED_FILE.getAbsolutePath() == /mnt/sdcard 뒤에 저장할 파일엔 '/' 가 필요하다.
        filename =RECORDED_FILE.getAbsolutePath()+"/test.mp4";;
        
        // 녹음 시작 버튼
        recordBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (recorder != null) {
                 recorder.stop();
                    recorder.release();
                    recorder = null;
                }
                
                // 실험 결과 왠만하면 아래 recorder 객체의 속성을 지정하는 순서는 이대로 하는게 좋다 위치를 바꿨을때 에러가 났었음
                // 녹음 시작을 위해  MediaRecorder 객체  recorder를 생성한다.
                recorder = new MediaRecorder();
                
                // 오디오 입력 형식 설정
                recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                
                // 음향을 저장할 방식을 설정
                recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                
                // 오디오 인코더 설정
                recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
                
                // 저장될 파일 지정
                recorder.setOutputFile(filename);
                

                try {
                 Toast.makeText(getApplicationContext(), "녹음이 시작되었습니다.", Toast.LENGTH_LONG).show();
                 
                 // 녹음 준비,시작
                 recorder.prepare();
                 recorder.start();
                } catch (Exception ex) {
                    Log.e("SampleAudioRecorder", "Exception : ", ex);
                }
            }
        });

        // 녹음 중지 버튼
        recordStopBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (recorder == null)
                    return;
                
                // 녹음을 중지
                recorder.stop();
                
                // 오디오 녹음에 필요한  메모리를 해제한다
                recorder.release();
                recorder = null;

                Toast.makeText(getApplicationContext(), "녹음이 중지되었습니다.", Toast.LENGTH_LONG).show();
            }
        });

        
        // 오디오 플레이 버튼
        playBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (player != null) {
                 player.stop();
                    player.release();
                    player = null;
                }

                Toast.makeText(getApplicationContext(), "녹음된 파일을 재생합니다.", Toast.LENGTH_LONG).show();
                try {
                 
                 // 오디오를 플레이 하기위해 MediaPlayer 객체 player를 생성한다.
                 player = new MediaPlayer ();
                 
                    // 재생할 오디오 파일 저장위치를 설정
                    player.setDataSource(filename);
                    // 웹상에 있는 오디오 파일을 재생할때
                    // player.setDataSource(Audio_Url);
                    
                    // 오디오 재생준비,시작
                    player.prepare();
                    player.start();
                } catch (Exception e) {
                    Log.e("SampleAudioRecorder", "Audio play failed.", e);
                }
            }
        });


        // 오디오 재생 중지 버튼
        playStopBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (player == null)
                 return;

                Toast.makeText(getApplicationContext(), "재생이 중지되었습니다.", Toast.LENGTH_LONG).show();

                
                // 오디오 재생 중지
                player.stop();
                
                // 오디오 재생에 필요한 메모리들을 해제한다
                player.release();
                player = null;
            }
        });
    }


    protected void onPause() {
        if (recorder != null) {
         recorder.release();
         recorder = null;
        }

        if (player != null) {
            player.release();
            player = null;
        }

        super.onPause();
    }

    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

댓글 없음:

댓글 쓰기