앱에 재생 컨트롤 추가

미디어를 재생하는 앱에는 미디어를 표시하고 재생을 제어하기 위한 사용자 인터페이스 구성요소가 필요합니다. Media3 라이브러리에는 여러 가지 UI 구성요소를 제공할 수 있습니다 UI 모듈에 종속하려면 다음을 추가합니다. 종속됩니다.

KotlinGroovy
implementation("androidx.media3:media3-ui:1.5.1")
implementation "androidx.media3:media3-ui:1.5.1"

가장 중요한 구성요소는 미디어 재생을 위한 뷰인 PlayerView입니다. PlayerView는 재생 중 동영상, 이미지, 자막, 앨범 아트 및 재생 컨트롤을 표시합니다.

PlayerView에는 연결 및 분리를 위한 setPlayer 메서드가 있습니다( null) 플레이어 인스턴스를 전달합니다.

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 를 사용해야 합니다. TextureView보다 SurfaceView은(는) 더 많은 혜택이 제공됩니다 동영상 재생:

  • 상당히 저전력 많이 소비 기기에서 사용할 수 있습니다.
  • 프레임 타이밍이 더 정확해져 동영상 재생이 더 원활해집니다.
  • 지원 기기에서 고화질 HDR 동영상 출력을 지원합니다.
  • DRM으로 보호된 콘텐츠를 재생할 때 보안 출력을 지원합니다.
  • UI 레이어를 업스케일하는 Android TV 기기에서 디스플레이의 전체 해상도로 동영상 콘텐츠를 렌더링하는 기능입니다.

따라서 가능하면 SurfaceViewTextureView보다 선호해야 합니다. TextureViewSurfaceView가 요구사항을 충족하지 않는 경우에만 사용해야 합니다. 1개 매끄러운 애니메이션 또는 동영상 표시 영역의 스크롤이 필요한 경우입니다. 이전 버전에서만 사용할 수 있습니다. 이 경우 SDK_INT가 24(Android 7.0) 미만인 경우에만 TextureView를 사용하고 그 외의 경우에는 SurfaceView를 사용하는 것이 좋습니다.

Android TV에서 D패드 탐색

Android TV 리모컨에는 D패드 컨트롤이 있어 ActivitydispatchKeyEvent(KeyEvent)에 주요 이벤트로 도착합니다. 다음은 플레이어 뷰에 위임해야 합니다.

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을 참고하세요.

추가 맞춤설정

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