안드로이드에서는 오디오와 비디오를 재생하고 녹음하기 위한 다양한 API를 제공합니다. 여기서는 주로 MediaPlayer와 MediaRecorder를 사용하는 방법을 설명하고, 간단한 예제를 포함합니다.
오디오 재생
오디오를 재생하기 위해 안드로이드의 MediaPlayer 클래스를 사용할 수 있습니다. MediaPlayer는 로컬 파일, 스트리밍 오디오 등 다양한 소스에서 오디오를 재생할 수 있습니다.
MediaPlayer를 사용한 오디오 재생 예제
import android.media.MediaPlayer;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 로컬 오디오 파일 재생
mediaPlayer = MediaPlayer.create(this, R.raw.sample_audio); // res/raw/sample_audio.mp3 파일
mediaPlayer.start(); // 재생 시작
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.release(); // MediaPlayer 리소스 해제
mediaPlayer = null;
}
}
}
오디오 녹음
오디오를 녹음하기 위해 안드로이드의 MediaRecorder 클래스를 사용할 수 있습니다. MediaRecorder는 오디오 입력을 받아 파일로 저장할 수 있습니다.
MediaRecorder를 사용한 오디오 녹음 예제
import android.Manifest;
import android.content.pm.PackageManager;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_RECORD_AUDIO_PERMISSION = 200;
private MediaRecorder recorder = null;
private boolean isRecording = false;
private String fileName = null;
private Button recordButton;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.activity_main);
// 퍼미션 요청
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_RECORD_AUDIO_PERMISSION);
fileName = getExternalFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath();
fileName += "/audiorecordtest.3gp";
recordButton = findViewById(R.id.recordButton);
recordButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isRecording) {
stopRecording();
} else {
startRecording();
}
isRecording = !isRecording;
recordButton.setText(isRecording ? "Stop Recording" : "Start Recording");
}
});
}
private void startRecording() {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setOutputFile(fileName);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
recorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
recorder.start();
}
private void stopRecording() {
recorder.stop();
recorder.release();
recorder = null;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_RECORD_AUDIO_PERMISSION) {
if (grantResults.length == 0 || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
// 권한 거부 시 앱 종료
finish();
}
}
}
}
비디오 재생
비디오를 재생하기 위해 안드로이드의 VideoView 위젯을 사용할 수 있습니다. VideoView는 비디오 파일을 쉽게 재생할 수 있는 UI 컴포넌트입니다.
VideoView를 사용한 비디오 재생 예제
XML 레이아웃 파일 (res/layout/activity_main.xml):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<VideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"/>
</RelativeLayout>
Java 코드 (MainActivity.java):
import android.net.Uri;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.VideoView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private VideoView videoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
videoView = findViewById(R.id.videoView);
// 로컬 비디오 파일 재생
Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.sample_video); // res/raw/sample_video.mp4 파일
videoView.setVideoURI(uri);
// 미디어 컨트롤러 추가 (재생, 일시 정지 등)
MediaController mediaController = new MediaController(this);
videoView.setMediaController(mediaController);
mediaController.setAnchorView(videoView);
videoView.start(); // 비디오 재생 시작
}
}
비디오 녹음
비디오를 녹음하기 위해 MediaRecorder를 사용할 수 있습니다. 비디오 녹음은 오디오와 비디오 모두를 캡처합니다.
MediaRecorder를 사용한 비디오 녹음 예제
XML 레이아웃 파일 (res/layout/activity_main.xml):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/camera_preview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:id="@+id/recordButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start Recording"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
Java 코드 (MainActivity.java):
import android.Manifest;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.File;
import java.io.IOException;
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
private static final int REQUEST_RECORD_AUDIO_PERMISSION = 200;
private MediaRecorder mediaRecorder;
private Camera camera;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private boolean isRecording = false;
private Button recordButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 퍼미션 요청
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_RECORD_AUDIO_PERMISSION);
surfaceView = findViewById(R.id.camera_preview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
recordButton = findViewById(R.id.recordButton);
recordButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isRecording) {
stopRecording();
} else {
startRecording();
}
isRecording = !isRecording;
recordButton.setText(isRecording ? "Stop Recording" : "Start Recording");
}
});
}
private void startRecording() {
camera = Camera.open();
camera.unlock();
mediaRecorder = new MediaRecorder();
mediaRecorder.setCamera(camera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setOutputFile(getOutputMediaFile().toString());
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
try {
mediaRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mediaRecorder.start();
}
private void stopRecording() {
mediaRecorder.stop();
mediaRecorder.release();
camera.release();
}
private static File getOutputMediaFile() {
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), "MyCameraApp");
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
return null;
}
}
String timeStamp = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss").format(new java.util.Date());
return new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".mp4");
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_RECORD_AUDIO_PERMISSION) {
if (grantResults.length == 0 || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
// 권한 거부 시 앱 종료
finish();
}
}
}
}
이 예제에서는 카메라와 마이크를 사용하여 비디오를 녹화하고 저장합니다.
위의 예제들을 통해 안드로이드에서 오디오 및 비디오를 재생하고 녹음하는 기본적인 방법을 알 수 있습니다. 이를 통해 다양한 멀티미디어 기능을 앱에 구현할 수 있습니다.
