앱에 재생 컨트롤 추가

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

Kotlin

implementation("androidx.media3:media3-ui:1.4.1")

Groovy

implementation "androidx.media3:media3-ui:1.4.1"

가장 중요한 구성요소는 미디어 재생 뷰인 PlayerView입니다. PlayerView는 재생되는 동안 동영상, 이미지, 자막, 앨범 아트를 표시합니다. 확인할 수 있습니다.

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

플레이어 뷰

PlayerView는 동영상, 이미지, 오디오 재생에 모두 사용할 수 있습니다. 렌더링 동영상 재생의 경우 동영상 및 자막, 이미지 재생용 비트맵 오디오 파일에 메타데이터로 포함된 아트워크를 표시할 수 있습니다. 포함할 수 있습니다. 를 사용할 수 있습니다. 예: 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이(가) 더 작을 때만 TextureView를 사용하는 것이 좋습니다. 24 (Android 7.0)보다 높고 그렇지 않으면 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);
}

재생 탐색 시 플레이어 뷰에 포커스를 요청하는 것이 중요함 관리할 수 있습니다. onCreate에서 포커스를 요청해 보세요. Activity:

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 모듈로 구현됩니다.