미디어를 재생하는 앱에는 미디어를 표시하고 재생을 제어하기 위한 사용자 인터페이스 구성요소가 필요합니다. Media3 라이브러리에는 여러 가지 UI 구성요소를 제공할 수 있습니다 UI 모듈에 종속하려면 다음을 추가합니다. 종속됩니다.
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
메서드에서 조회할 수 있습니다.
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
:
// 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
를 사용해야 합니다. TextureView
보다 SurfaceView
은(는) 더 많은 혜택이 제공됩니다
동영상 재생:
- 상당히 저전력 많이 소비 기기에서 사용할 수 있습니다.
- 프레임 타이밍이 더 정확해져 동영상 재생이 더 원활해집니다.
- 지원 기기에서 고화질 HDR 동영상 출력을 지원합니다.
- DRM으로 보호된 콘텐츠를 재생할 때 보안 출력을 지원합니다.
- UI 레이어를 업스케일하는 Android TV 기기에서 디스플레이의 전체 해상도로 동영상 콘텐츠를 렌더링하는 기능입니다.
따라서 가능하면 SurfaceView
를 TextureView
보다 선호해야 합니다.
TextureView
는 SurfaceView
가 요구사항을 충족하지 않는 경우에만 사용해야 합니다. 1개
매끄러운 애니메이션 또는 동영상 표시 영역의 스크롤이 필요한 경우입니다.
이전 버전에서만 사용할 수 있습니다. 이 경우 SDK_INT
가 24(Android 7.0) 미만인 경우에만 TextureView
를 사용하고 그 외의 경우에는 SurfaceView
를 사용하는 것이 좋습니다.
Android TV에서 D패드 탐색
Android TV 리모컨에는 D패드 컨트롤이 있어
Activity
의 dispatchKeyEvent(KeyEvent)
에 주요 이벤트로 도착합니다. 다음은 플레이어 뷰에 위임해야 합니다.
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
에서 포커스를 요청하는 것이 좋습니다.
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을 참고하세요.
추가 맞춤설정
위에서 설명한 것 이상으로 맞춤설정이 필요한 경우 앱이 개발자는 제공된 UI 구성요소를 사용하는 대신 자체 UI 구성요소를 구현합니다. 미디어3의 UI 모듈로 구현됩니다.