미디어를 재생하는 앱에는 미디어를 표시하고 재생을 제어하기 위한 사용자 인터페이스 구성요소가 필요합니다. Media3 라이브러리에는 여러 UI 구성요소가 포함된 UI 모듈이 있습니다. UI 모듈에 종속하려면 다음 종속 항목을 추가합니다.
Kotlin
implementation("androidx.media3:media3-ui:1.5.0")
Groovy
implementation "androidx.media3:media3-ui:1.5.0"
가장 중요한 구성요소는 미디어 재생을 위한 뷰인 PlayerView
입니다.
PlayerView
는 재생 중 동영상, 이미지, 자막, 앨범 아트 및 재생 컨트롤을 표시합니다.
PlayerView
에는 플레이어 인스턴스를 연결하고 분리하는 (null
전달) setPlayer
메서드가 있습니다.
PlayerView
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) }
자바
@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()
자바
// 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 기기에서 디스플레이의 전체 해상도로 동영상 콘텐츠를 렌더링하는 기능
따라서 가능하면 SurfaceView
를 TextureView
보다 선호해야 합니다.
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) }
자바
@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() // ... }
자바
@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 구성요소를 사용하는 대신 자체 UI 구성요소를 구현할 것으로 예상됩니다.