미디어 플레이어 시작하기

이 문서에서는 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.OnPreparedListeneronPrepared() 메서드가 호출됩니다.

자세히 알아보기

Jetpack Media3는 앱에서 미디어를 재생하는 데 권장되는 솔루션입니다. 자세한 내용은 자세히 알아보세요.

이 페이지에서는 오디오와 동영상 녹음/녹화, 저장 및 재생과 관련된 주제를 다룹니다.