앱에 재생 컨트롤 추가

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

표면 유형 선택

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

따라서 가능하면 TextureView보다 SurfaceView를 사용하는 것이 좋습니다. 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)
}

Java

@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()
  // ...
}

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

드로어블 재정의

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

추가 맞춤설정

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