Jetpack Media3은 기본 기능을 설명하는 Player
인터페이스를 정의합니다.
동영상 및 오디오 파일 재생에 사용됩니다. ExoPlayer
가 기본 구현입니다.
인터페이스입니다. ExoPlayer를 사용하는 것이 좋습니다. 왜냐하면 ExoPlayer는
포괄적인 기능을 갖추었고 이는 대부분의 재생 사용 사례를 포괄하며
추가로 사용 사례를 처리할 수 있도록
맞춤설정할 수 있습니다 ExoPlayer도
기기 및 OS 단편화를 추상화하여 코드가 일관되게 작동합니다.
살펴봤습니다 ExoPlayer에 포함되는 항목:
이 페이지에서는 재생 환경을 구축하는 주요 단계를 안내합니다. 자세히 알아보려면 Media3 ExoPlayer:
시작하기
시작하려면 Jetpack Media3:
implementation "androidx.media3:media3-exoplayer:1.4.0" implementation "androidx.media3:media3-ui:1.4.0" implementation "androidx.media3:media3-common:1.4.0"
사용 사례에 따라 Media3의 추가 모듈이 필요할 수도 있습니다.
예를 들어 exoplayer-dash
는 DASH 형식의 스트림을 재생합니다.
1.4.0
을 원하는 버전의
있습니다. 출시 노트를 참고하세요.
최신 버전을 확인하세요.
미디어 플레이어 만들기
Media3을 사용하면 포함된 Player
구현을 사용하거나
인터페이스 ExoPlayer
를 직접 구현하거나 자체 맞춤 구현을 빌드할 수 있습니다.
ExoPlayer 만들기
ExoPlayer
인스턴스를 만드는 가장 간단한 방법은 다음과 같습니다.
Kotlin
val player = ExoPlayer.Builder(context).build()
자바
ExoPlayer player = new ExoPlayer.Builder(context).build();
다음 인스턴스의 onCreate()
수명 주기 메서드에서 미디어 플레이어를 만들 수 있습니다.
Activity
, Fragment
또는 Service
입니다.
Builder
에는 다음이 포함됩니다.
다음과 같이 다양한 맞춤설정 옵션을 확인해 보세요.
setAudioAttributes()
드림 오디오 포커스 처리 구성setHandleAudioBecomingNoisy()
드림 오디오 출력 장치가 연결 해제 될 때 재생 동작을 구성합니다.setTrackSelector()
드림 트랙 선택 설정
Media3은 앱의 PlayerView
UI 구성요소를
레이아웃 파일을 만듭니다. 이 구성요소는 재생을 위한 PlayerControlView
를 캡슐화합니다.
컨트롤, SubtitleView
(자막 표시), Surface
(렌더링)
있습니다.
플레이어 준비
다음 동영상의 재생목록에 미디어 항목 추가
다음과 같은 메서드로 재생
setMediaItem()
및 addMediaItem()
입니다.
그런 다음 prepare()
를 호출하여 다음을 수행합니다.
필요한 리소스를 확보할 수 있습니다.
앱이 포그라운드로 전환되기 전에 이 단계를 실행해서는 안 됩니다. 만약
플레이어가 Activity
또는 Fragment
에 있는 경우, 이는 플레이어를
API 수준 24 이상 또는 onResume()
의 onStart()
수명 주기 메서드
수명 주기 메서드를 지원합니다. Service
에 있는 플레이어의 경우
onCreate()
에서 준비할 수 있습니다.
플레이어 제어
플레이어가 준비되면 메서드를 호출하여 재생을 제어할 수 있습니다. 예:
play()
및pause()
재생을 시작하고 일시중지합니다.seekTo()
을(를) 사용하여 현재 미디어 항목 내 위치seekToNextMediaItem()
드림 및seekToPreviousMediaItem()
재생목록 탐색
PlayerView
또는 PlayerControlView
와 같은 UI 구성요소가 업데이트됩니다.
알 수 있습니다.
플레이어 해제
재생 시 동영상과 같이 공급이 제한적인 리소스가 필요할 수 있습니다.
디코더이므로 release()
를 호출하여
플레이어가 더 이상 필요하지 않을 때 리소스를 확보할 수 있습니다.
플레이어가 Activity
또는 Fragment
에 있는 경우
API 수준 24 이상 또는 onPause()
의 onStop()
수명 주기 메서드
API 수준 23 이하에서 지원됩니다. Service
에 있는 플레이어의 경우 다음 작업을 할 수 있습니다.
onDestroy()
에서 해제합니다.
미디어 세션으로 재생 관리
Android에서 미디어 세션은 미디어와 상호작용하는 표준화된 방법을 제공합니다. 할 수 있습니다. 플레이어에 미디어 세션 연결 을(를) 사용하면 미디어 재생을 외부에 광고하고 재생을 수신할 수 있습니다. 예를 들어, 외부 소스로부터의 명령어(예: 모바일 및 대형의 시스템 미디어 컨트롤 화면 기기
미디어 세션을 사용하려면 Media3 세션 모듈에 대한 종속 항목을 추가합니다.
implementation "androidx.media3:media3-session:1.4.0"
미디어 세션 만들기
플레이어를 초기화한 후 다음과 같이 MediaSession
를 만들 수 있습니다.
Kotlin
val player = ExoPlayer.Builder(context).build() val mediaSession = MediaSession.Builder(context, player).build()
자바
ExoPlayer player = new ExoPlayer.Builder(context).build(); MediaSession mediaSession = new MediaSession.Builder(context, player).build();
Media3은 Player
의 상태를 자동으로
MediaSession
입니다. 이 기능은 다음을 포함한 모든 Player
구현에서 작동합니다.
ExoPlayer
, CastPlayer
또는 a
구현할 수 있습니다.
다른 클라이언트에 제어 권한 부여
클라이언트 앱이 미디어 컨트롤러를 구현할 수 있음
미디어 세션의 재생을 제어합니다. 이러한 요청을 수신하려면
callback 객체
MediaSession
빌드 중
컨트롤러가 미디어 세션에 연결하려고 하면
onConnect()
드림
메서드가 호출됩니다. 제공된 ControllerInfo
동의 여부를
또는 거부
요청을 처리합니다 Media3 세션 데모 앱에서 예를 참고하세요.
연결되면 컨트롤러가 세션으로 재생 명령어를 전송할 수 있습니다. 이
세션에서 이러한 명령을 플레이어에게 위임합니다. 재생 및 재생목록
Player
인터페이스에 정의된 명령어는
세션입니다.
다른 콜백 메서드를 사용하면 예를 들어
맞춤 재생 명령
재생목록 수정 등이 포함됩니다. 이러한 콜백은 마찬가지로 ControllerInfo
객체를 포함하므로
요청별로 액세스 제어를 결정할 수 있습니다.
백그라운드에서 미디어 재생 중
앱이 포그라운드에 있지 않을 때 미디어를 계속 재생하려는 경우(예:
앱이 없어도 음악, 오디오북, 팟캐스트 재생
열려 있으면 Player
및 MediaSession
가
포그라운드 서비스에 Cloud Storage를
사용하는 것이 좋습니다 Media3은
MediaSessionService
인터페이스를 사용해야 합니다.
MediaSessionService
구현
MediaSessionService
를 확장하고
onCreate()
수명 주기 메서드의 MediaSession
Kotlin
class PlaybackService : MediaSessionService() { private var mediaSession: MediaSession? = null // Create your Player and MediaSession in the onCreate lifecycle event override fun onCreate() { super.onCreate() val player = ExoPlayer.Builder(this).build() mediaSession = MediaSession.Builder(this, player).build() } // Remember to release the player and media session in onDestroy override fun onDestroy() { mediaSession?.run { player.release() release() mediaSession = null } super.onDestroy() } }
자바
public class PlaybackService extends MediaSessionService { private MediaSession mediaSession = null; @Override public void onCreate() { super.onCreate(); ExoPlayer player = new ExoPlayer.Builder(this).build(); mediaSession = new MediaSession.Builder(this, player).build(); } @Override public void onDestroy() { mediaSession.getPlayer().release(); mediaSession.release(); mediaSession = null; super.onDestroy(); } }
매니페스트에서 MediaSessionService
인텐트가 있는 Service
클래스
필터링 및 포그라운드 실행을 위한 FOREGROUND_SERVICE
권한 요청
서비스:
<service
android:name=".PlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="true">
<intent-filter>
<action android:name="androidx.media3.session.MediaSessionService"/>
</intent-filter>
</service>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
마지막으로 만든 클래스에서 onGetSession()
메서드를 재정의하여
클라이언트 액세스가 있어야 합니다. MediaSession
를 반환하여
연결 요청을 거부하거나 null
를 반환하여 요청을 거부합니다.
Kotlin
// This example always accepts the connection request override fun onGetSession( controllerInfo: MediaSession.ControllerInfo ): MediaSession? = mediaSession
자바
@Override public MediaSession onGetSession(MediaSession.ControllerInfo controllerInfo) { // This example always accepts the connection request return mediaSession; }
UI에 연결
이제 미디어 세션이 Activity
와는 다른 Service
에 있습니다. 또는
플레이어 UI가 있는 Fragment
의 경우 MediaController
를 사용하여
통합하지 않아도 됩니다 Activity
또는 Fragment
의 onStart()
메서드에서 다음을 실행합니다.
MediaSession
용 SessionToken
를 만들고 SessionToken
를 사용합니다.
를 사용하여 MediaController
를 빌드합니다. MediaController
빌드
있습니다.
Kotlin
override fun onStart() { val sessionToken = SessionToken(this, ComponentName(this, PlaybackService::class.java)) val controllerFuture = MediaController.Builder(this, sessionToken).buildAsync() controllerFuture.addListener( { // Call controllerFuture.get() to retrieve the MediaController. // MediaController implements the Player interface, so it can be // attached to the PlayerView UI component. playerView.setPlayer(controllerFuture.get()) }, MoreExecutors.directExecutor() ) }
자바
@Override public void onStart() { SessionToken sessionToken = new SessionToken(this, new ComponentName(this, PlaybackService.class)); ListenableFuture<MediaController> controllerFuture = new MediaController.Builder(this, sessionToken).buildAsync(); controllerFuture.addListener(() -> { // Call controllerFuture.get() to retrieve the MediaController. // MediaController implements the Player interface, so it can be // attached to the PlayerView UI component. playerView.setPlayer(controllerFuture.get()); }, MoreExecutors.directExecutor()) }
MediaController
는 Player
인터페이스를 구현하므로 동일한 메서드를 사용할 수 있습니다.
재생을 제어하는 play()
및 pause()
와 같은 메서드. 기타 유사 채널
구성요소가 더 이상 필요하지 않으면 MediaController
를 해제해야 합니다.
필요한 경우(예: Activity
의 onStop()
수명 주기 메서드)
MediaController.releaseFuture()
알림 게시
활성 상태에서 알림을 게시하려면 포그라운드 서비스가 필요합니다. 가
MediaSessionService
이(가) 자동으로
다음에 대한 알림 MediaStyle
개
MediaNotification
의 형식으로 제공됩니다.
맞춤 알림을 제공하려면
MediaNotification.Provider
드림
대상: DefaultMediaNotificationProvider.Builder
또는 제공자 인터페이스의 맞춤형 구현을 생성하여 제공할 수 있습니다.
제공업체를 MediaSession
에 제공합니다.
setMediaNotificationProvider
콘텐츠 라이브러리 광고
MediaLibraryService
는 클라이언트를 허용하여 MediaSessionService
를 기반으로 빌드됩니다.
앱이 제공하는 미디어 콘텐츠를 탐색할 수 있습니다. 클라이언트 앱은
상호작용하려면 MediaBrowser
MediaLibraryService
과(와) 연결하시기 바랍니다.
MediaLibraryService
구현은
MediaSessionService
. 단, onGetSession()
에서는
MediaSession
대신 MediaLibrarySession
를 사용합니다. 기존
MediaSession.Callback
, MediaLibrarySession.Callback
에는
웹 브라우저에서 제공하는 콘텐츠를 브라우저 클라이언트가 탐색할 수 있도록 하는
제공합니다.
MediaSessionService
과 마찬가지로 MediaLibraryService
매니페스트를 실행하고 포그라운드 실행을 위한 FOREGROUND_SERVICE
권한 요청
서비스:
<service
android:name=".PlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="true">
<intent-filter>
<action android:name="androidx.media3.session.MediaLibraryService"/>
<action android:name="android.media.browse.MediaBrowserService"/>
</intent-filter>
</service>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
위의 예에는 두 MediaLibraryService
의 인텐트 필터가 모두 포함되어 있습니다.
이전 버전과의 호환성을 위해 기존 MediaBrowserService
를 사용합니다. 이
추가 인텐트 필터를 사용하면 MediaBrowserCompat
API를 사용하는 클라이언트 앱을 사용할 수 있습니다.
Service
기기를 인식하세요.
MediaLibrarySession
를 사용하면 콘텐츠 라이브러리를 트리에 제공할 수 있습니다.
단일 루트 MediaItem
로 구성됩니다. 트리의 각 MediaItem
에는
하위 MediaItem
노드 수에 제한이 없습니다. 다른 루트를 제공하거나
다른 트리를 생성합니다. 예를 들어 사용자가
추천 미디어 항목 목록을 찾는 클라이언트로 돌아가면
루트 MediaItem
와 단일 수준의 하위 MediaItem
노드를 포함합니다.
반면에 다른 클라이언트 앱으로 돌아가는 트리는
전체 콘텐츠 라이브러리에 추가할 수 있습니다.
MediaLibrarySession
만들기
MediaLibrarySession
MediaSession
API를 확장하여 콘텐츠 탐색 API를 추가합니다. 비교 대상
MediaSession
콜백,
MediaLibrarySession
콜백
다음과 같은 메서드를 추가합니다.
onGetLibraryRoot()
드림 클라이언트가 콘텐츠 트리의 루트MediaItem
를 요청할 때onGetChildren()
드림 클라이언트가 콘텐츠 트리에서MediaItem
의 하위 요소를 요청하는 경우onGetSearchResult()
드림 클라이언트가 콘텐츠 트리에서 검색결과를 요청할 때 쿼리
관련 콜백 메서드에는 LibraryParams
가 포함됩니다.
클라이언트 앱이 보내는 콘텐츠 트리 유형에 대한 추가 신호가 있는 객체
파악할 수 있습니다