미디어를 재생하는 앱에는 미디어를 표시하고 재생을 제어하기 위한 사용자 인터페이스 구성요소가 필요합니다. Media3 라이브러리에는 여러 UI 구성요소가 포함된 UI 모듈이 포함되어 있습니다. UI 모듈에 종속하려면 다음 종속 항목을 추가합니다.
Kotlin
implementation("androidx.media3:media3-ui:1.3.1")
Groovy
implementation "androidx.media3:media3-ui:1.3.1"
가장 중요한 구성요소는 미디어 재생 뷰인 PlayerView
입니다.
PlayerView
는 재생되는 동안 동영상, 자막, 앨범 아트와 재생 컨트롤을 표시합니다.
PlayerView
에는 null
를 전달하여 플레이어 인스턴스를 연결 및 분리하는 setPlayer
메서드가 있습니다.
플레이어 뷰
PlayerView
는 동영상 및 오디오 재생에 모두 사용할 수 있습니다. 동영상 재생 시 동영상 및 자막을 렌더링하고 오디오 파일에 메타데이터로 포함된 아트워크를 표시할 수 있습니다. 다른 UI 구성요소와 마찬가지로 레이아웃 파일에 포함할 수 있습니다. 예를 들어 PlayerView
가 다음 XML에 포함될 수 있습니다.
<androidx.media3.ui.PlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:show_buffering="when_playing"
app:show_shuffle_button="true"/>
위의 스니펫은 PlayerView
가 여러 속성을 제공함을 보여줍니다. 이러한 속성을 사용하여 뷰의 동작과 디자인과 분위기를 맞춤설정할 수 있습니다. 이러한 속성 대부분에는 런타임 시 뷰를 맞춤설정하는 데 사용할 수 있는 상응하는 setter 메서드가 있습니다. PlayerView
Javadoc에는 이러한 속성과 setter 메서드가 자세히 나와 있습니다.
뷰가 레이아웃 파일에서 선언되면 활동의 onCreate
메서드에서 조회할 수 있습니다.
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... playerView = findViewById(R.id.player_view) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... playerView = findViewById(R.id.player_view); }
플레이어가 초기화되면 setPlayer
를 호출하여 뷰에 연결할 수 있습니다.
Kotlin
// Instantiate the player. val player = ExoPlayer.Builder(context).build() // Attach player to the view. playerView.player = player // Set the media item to be played. player.setMediaItem(mediaItem) // Prepare the player. player.prepare()
Java
// Instantiate the player. player = new ExoPlayer.Builder(context).build(); // Attach player to the view. playerView.setPlayer(player); // Set the media item to be played. player.setMediaItem(mediaItem); // Prepare the player. player.prepare();
표면 유형 선택
PlayerView
의 surface_type
속성을 사용하면 동영상 재생에 사용되는 노출 영역의 유형을 설정할 수 있습니다. spherical_gl_surface_view
(구형 동영상 재생의 특수 값) 및 video_decoder_gl_surface_view
(확장 프로그램 렌더기를 사용하는 동영상 렌더링용) 값 외에 허용되는 값은 surface_view
, texture_view
, none
입니다. 뷰가 오디오 재생 전용인 경우 많은 비용이 들 수 있으므로 노출 영역을 만들지 않으려면 none
를 사용해야 합니다.
일반 동영상 재생용 뷰인 경우 surface_view
또는 texture_view
를 사용해야 합니다. SurfaceView
에는 TextureView
에 비해 동영상 재생 시 여러 가지 이점이 있습니다.
- 여러 기기에서 전력 소모량이 크게 감소합니다.
- 프레임 타이밍이 더 정확하므로 동영상 재생이 더 원활해집니다.
- 지원 기기에서 고화질 HDR 동영상 출력을 지원합니다.
- DRM으로 보호된 콘텐츠를 재생할 때 보안 출력을 지원합니다.
- UI 레이어를 확장하는 Android TV 기기에서 디스플레이의 전체 해상도로 동영상 콘텐츠를 렌더링하는 기능.
따라서 가능하면 TextureView
보다 SurfaceView
를 사용하는 것이 좋습니다.
TextureView
는 SurfaceView
가 요구사항을 충족하지 않는 경우에만 사용해야 합니다. 한 가지 예는 다음 참고사항에 설명된 것처럼 Android 7.0 (API 수준 24) 이전에는 부드러운 애니메이션 또는 동영상 노출 영역의 스크롤이 필요한 경우입니다. 이 경우 SDK_INT
이 24 (Android 7.0) 미만일 때만 TextureView
를 사용하고 그렇지 않은 경우 SurfaceView
를 사용하는 것이 좋습니다.
Android TV의 D패드 탐색
Android TV의 리모컨에는 Activity
의 dispatchKeyEvent(KeyEvent)
에 키 이벤트로 도착하는 명령어를 전송하는 D패드 컨트롤이 있습니다. 다음은 플레이어 뷰에 위임되어야 합니다.
Kotlin
override fun dispatchKeyEvent(event: KeyEvent?): Boolean{ return playerView.dispatchKeyEvent(event!!) || super.dispatchKeyEvent(event) }
Java
@Override public boolean dispatchKeyEvent(KeyEvent event) { return playerView.dispatchKeyEvent(event) || super.dispatchKeyEvent(event); }
재생 컨트롤을 탐색하고 광고를 건너뛰려면 플레이어 뷰의 포커스 요청이 중요합니다. Activity
의 onCreate
에서 포커스를 요청하는 것이 좋습니다.
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... playerView.requestFocus() // ... }
Java
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... playerView.requestFocus(); // ... }
Android TV에서 Compose를 사용하는 경우 이에 따라 수정자 매개변수를 AndroidView
에 전달하여 AndroidView
를 포커스 가능하게 만들고 이벤트를 위임해야 합니다.
AndroidView(
modifier = modifier
.focusable()
.onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
factory = { playerView }
)
드로어블 재정의
PlayerView
는 PlayerControlView
를 사용하여 재생 컨트롤과 진행률 표시줄을 표시합니다. PlayerControlView
에서 사용하는 드로어블은 애플리케이션에서 정의된 것과 이름이 동일한 드로어블로 재정의할 수 있습니다. 재정의할 수 있는 컨트롤 드로어블 목록은 PlayerControlView
Javadoc을 참고하세요.
추가 맞춤설정
위에서 설명한 것 이외의 맞춤설정이 필요한 경우 앱 개발자는 Media3의 UI 모듈에서 제공하는 구성요소를 사용하는 대신 자체 UI 구성요소를 구현해야 합니다.