이 문서에서는 Media Player를 사용하기 전에 숙지해야 하는 기본 개념을 소개합니다.
사운드 및 동영상 수업
다음 클래스는 Android 프레임워크에서 사운드 및 동영상을 재생합니다.
MediaPlayer
: 이 클래스는 사운드 및 동영상을 재생하는 기본 API입니다.AudioManager
: 이 클래스는 기기에서 오디오 소스와 오디오 출력을 관리합니다.
매니페스트 선언
MediaPlayer를 사용하여 애플리케이션 개발을 시작하기 전에 매니페스트에 관련 기능을 사용할 수 있는 적절한 선언이 있는지 확인하세요.
인터넷 권한: MediaPlayer를 사용하여 네트워크 기반 콘텐츠를 스트리밍하는 경우 애플리케이션에서 네트워크 액세스를 요청해야 합니다.
<uses-permission android:name="android.permission.INTERNET" />
Wake Lock 권한: 플레이어 애플리케이션에서 화면이 어두워지는 것이나 프로세서의 절전 모드를 방지해야 한다면 또는
MediaPlayer.setScreenOnWhilePlaying(boolean)
또는MediaPlayer.setWakeMode(android.content.Context, int)
메서드를 사용한다면 이 권한을 요청해야 합니다.<uses-permission android:name="android.permission.WAKE_LOCK" />
MediaPlayer 클래스 사용
MediaPlayer
클래스는 미디어 프레임워크의 필수 구성요소입니다.
이 클래스의 객체는 최소한의 설정으로 오디오와 동영상을 모두 가져오고 디코딩하며 재생할 수 있습니다. MediaPlayer
는 다음과 같은 여러 미디어 소스를 지원합니다.
- 로컬 리소스
- 콘텐츠 리졸버에서 가져올 수 있는 것과 같은 내부 URI
- 외부 URL(스트리밍)
Android에서 지원하는 미디어 형식 목록은 지원되는 미디어 형식 페이지를 참고하세요.
오디오 소스 작업 예시
다음 예는 애플리케이션의 res/raw/
디렉터리에 저장된 로컬 원시 리소스로 사용 가능한 오디오를 재생하는 방법을 보여줍니다.
Kotlin
var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1)
mediaPlayer.start() // no need to call prepare(); create() does that for you
자바
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you
이 경우 '원시' 리소스는 시스템에서 특정 방법으로 파싱을 시도하지 않는 파일입니다. 그러나 이 리소스의 콘텐츠는 원시 오디오가 아니어야 합니다. 지원되는 형식 중 하나로 올바르게 인코딩되고 형식이 지정된 미디어 파일이어야 합니다.
다음은 시스템에서 로컬로 사용 가능한 URI에서 재생할 수 있는 방법 (예: 콘텐츠 리졸버를 통해 획득)입니다.
Kotlin
val myUri: Uri = .... // initialize Uri here
val mediaPlayer = MediaPlayer().apply {
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
)
setDataSource(applicationContext, myUri)
prepare()
start()
}
자바
Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();
HTTP 스트리밍을 사용하여 원격 URL에서 재생하는 방법은 다음과 같습니다.
Kotlin
val url = "http://........" // your URL here
val mediaPlayer = MediaPlayer().apply {
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
)
setDataSource(url)
prepare() // might take long! (for buffering, etc)
start()
}
자바
String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();
비동기 준비를 사용하여 성능 개선
MediaPlayer
를 사용할 때는 성능에 유의하세요. 예를 들어 prepare()
호출은 실행하는 데 오랜 시간이 걸릴 수 있습니다. 미디어 데이터를 가져오고 디코딩해야 할 수 있기 때문입니다. 따라서 실행에 오랜 시간이 걸릴 수 있는 다른 메서드와 마찬가지로 애플리케이션의 UI 스레드에서 호출해서는 안 됩니다. 이렇게 하면 메서드가 반환될 때까지 UI가 응답을 중지하므로 사용자 환경이 나빠지고 ANR (애플리케이션 응답 없음) 오류가 발생할 수 있습니다.
UI 스레드가 중단되는 것을 방지하려면 다른 스레드를 생성하여 MediaPlayer
를 준비하고 완료되면 기본 스레드에 알립니다. 프레임워크는 이 작업을 실행하는 prepareAsync()
메서드를 실행하는 편리한 방법을 제공합니다. 이 메서드는 백그라운드에서 미디어 준비를 시작하고 즉시 반환합니다. 미디어 준비가 완료되면 setOnPreparedListener()
를 통해 구성된 MediaPlayer.OnPreparedListener
의 onPrepared()
메서드가 호출됩니다.
자세히 알아보기
Jetpack Media3는 앱에서 미디어를 재생하는 데 권장되는 솔루션입니다. 자세한 내용은 자세히 알아보세요.
이 페이지에서는 오디오와 동영상 녹음/녹화, 저장 및 재생과 관련된 주제를 다룹니다.