앱에 재생 컨트롤 추가

미디어를 재생하는 앱에는 미디어를 표시하고 재생을 제어하기 위한 사용자 인터페이스 구성요소가 필요합니다. 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();

노출 영역 유형 선택

PlayerViewsurface_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 기기에서 디스플레이의 전체 해상도로 동영상 콘텐츠를 렌더링하는 기능

따라서 가능하면 SurfaceViewTextureView보다 선호해야 합니다. TextureViewSurfaceView가 요구사항을 충족하지 않는 경우에만 사용해야 합니다. 한 가지 예는 다음 메모에 설명된 대로 Android 7.0 (API 수준 24) 이전에 동영상 노출 영역의 부드러운 애니메이션이나 스크롤이 필요한 경우입니다. 이 경우 SDK_INT가 24 (Android 7.0) 미만인 경우에만 TextureView를 사용하고 그 외의 경우에는 SurfaceView를 사용하는 것이 좋습니다.

Android TV의 D패드 탐색

Android TV의 리모컨에는 ActivitydispatchKeyEvent(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);
}

재생 컨트롤을 탐색하고 광고를 건너뛰는 데는 플레이어 뷰의 포커스를 요청하는 것이 중요합니다. ActivityonCreate에서 포커스를 요청하는 것이 좋습니다.

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 }
)

드로어블 재정의

PlayerViewPlayerControlView를 사용하여 재생 컨트롤과 진행률 표시줄을 표시합니다. PlayerControlView에서 사용하는 드로어블은 애플리케이션에 정의된 동일한 이름의 드로어블로 재정의할 수 있습니다. 재정의할 수 있는 컨트롤 드로어블 목록은 PlayerControlView Javadoc을 참고하세요.

추가 맞춤설정

위에 설명한 것 이상의 맞춤설정이 필요한 경우 앱 개발자는 Media3의 UI 모듈에서 제공하는 UI 구성요소를 사용하는 대신 자체 UI 구성요소를 구현할 것으로 예상됩니다.