방법

Media3 1.11 - 새로운 기능

3분 읽음
토니 하이덴라이히의 프로필 보기
Toni Heidenreich 소프트웨어 엔지니어, Android

Media3 1.11이 출시되었습니다. 대부분의 인기 Android 미디어 앱을 지원하는 이 출시에는 재생, 수정, UI 구성요소 전반에 걸쳐 새로운 기능, 버그 수정, 개선사항이 포함되어 있습니다. 맞춤설정 가능한 Player 슬롯과 사용하기 쉬운 기본값, 대화형 동작, 상태 관찰자, PlayerPool을 사용한 짧은 형식 동영상 미리 로드를 통해 Jetpack Compose UI 모듈을 확장하고 있습니다. 또한 SystemUI 출력 전환기 지원으로 Media3 Cast 통합을 현대화하고, 새로운 Ktor HTTP 클라이언트 네트워크 확장 프로그램을 도입하고, Ogg 및 WAV 파일용 새로운 멀티플렉싱 유틸리티를 추가했습니다.

주요 내용을 읽어보고 변경사항의 전체 목록은 전체 출시 노트를 확인하세요.

재생 UI 및 Compose

Android가 Compose 우선이 됨에 따라 media3-ui-composemedia3-ui-compose-material3 모듈을 계속 확장하고 있습니다. 이 업데이트에서는 플레이어 레이아웃을 더 세부적으로 제어하고, 더 다양한 상호작용 패턴을 제공하며, Material3와 더 깊이 통합합니다.

맞춤설정 가능한 플레이어 레이아웃

이제 Material 3 Player 컴포저블은 topControlscenterControlsbottomControls, errorOverlay의 전용 콘텐츠 슬롯을 지원합니다. 자체 컴포저블을 드롭하거나 PlayerDefaults에 게시된 기본값을 바로 사용할 수 있습니다.

Player(
  player = player,
  topControls = { PlayerDefaults.TopControls(player) },
  centerControls = { PlayerDefaults.CenterControls(player) },
  bottomControls = { PlayerDefaults.BottomControls(player) },
)

Player 컴포저블은 FocusRequester 지원도 통합하여 Android TV, 폴더블, 데스크톱 환경에서 원활한 D패드 및 키보드 탐색을 지원합니다. 

player_video.png
맞춤설정된 컨트롤이 있는 컴포저블 플레이어의 예

동작 및 재생 속도 제어

이제 PlaybackSpeedState는 빨리 감기/슬로 모션 API를 제공합니다. demo-compose app은 길게 누르기 동작으로 재생을 빨리 감고 두 번 탭으로 탐색하는 기능을 보여줍니다. 1.10에서 도입된 ProgressSlider와 결합된 Compose 플레이어 UI는 이제 기본적으로 다양한 터치 및 동작 상호작용을 제공합니다.

PlayerPool을 사용한 짧은 형식 동영상 미리 로드

슬라이딩 창 미디어 피드가 있는 앱 (예: 짧은 형식 세로 동영상)의 경우 여러 ExoPlayer 인스턴스를 효율적으로 관리하는 것이 일반적인 문제입니다. Media3 1.11에서는 플레이어 재활용 및 미리 로드를 자동으로 처리하기 위해 PlayerPool (common-ktx에 있음) 및 rememberPooledPlayer (ui-compose에 있음)를 도입합니다.

demo-compose의 새로운 ShortFormPlayerScreen은 사용자가 스크롤할 때 플레이어가 풀링되고 미리 로드되며 원활하게 재활용되는 세로 페이징 피드에서 이 기능을 보여줍니다.

MiniController

media3-ui-compose-material3의 새로운 MiniController 컴포저블은 재생/일시중지 컨트롤과 함께 현재 항목의 제목, 아티스트, 아트워크, 진행률을 표시하는 컴팩트한 재생 막대를 제공합니다. media3-ui-compose-material3의 모든 기본 컴포저블과 마찬가지로 MiniController는 Material3 동적 색상 통합을 지원하므로 사용자의 배경화면 테마에 자동으로 맞출 수 있습니다.이는 사용자가 콘텐츠를 탐색하거나 활성 Cast 세션 중에 지속적인 하단 시트 또는 미니 플레이어 어포던스에 적합합니다.

mini_player.png
앨범 아트, 미디어 메타데이터, 기본 컨트롤을 보여주는 Media3 MiniController

메타데이터 및 오류를 위한 확장된 상태 홀더

media3-ui-compose에 여러 새로운 반응형 상태 홀더를 추가했습니다.

  • rememberCurrentMediaItemState – 현재 재생 중인 항목에 관한 메타데이터 관찰
  • rememberPlaylistState – 전체 재생목록 및 활성 색인 관찰
  • rememberErrorState – Material3의 일치하는 ErrorText 컴포저블 및 기본 ErrorOverlay를 사용하여 재생 오류 추적

향후 출시에서 새로운 추가사항과 더 많은 맞춤설정 옵션을 계속 작업할 예정입니다. 프로젝트 Issue Tracker에 의견을 공유해 주세요.

현대화된 Cast 통합

Media3 1.11은 프로그래매틱 구성 옵션과 OS 수준 라우팅 지원으로 Cast 확장 프로그램을 업데이트합니다.

CastParams 및 SystemUI 출력 전환기

이제 CastParams를 사용하여 Cast 확장 프로그램을 구성할 수 있습니다.

val castParams = CastParams.Builder()
  .setShowSystemOutputSwitcherOnCastButtonClick(true)
  .build()


Cast.getSingletonInstance(context).initialize(castParams)

setShowSystemOutputSwitcherOnCastIconClick(true)를 설정하면 지원되는 플랫폼 버전에서 Android의 기본 SystemUI 출력 전환기 를 열도록 MediaRouteButton이 구성되어 통합된 출력 선택기 환경을 제공합니다.

Compose의 반응형 MediaRouteButton 상태

이제 Jetpack Compose를 사용하는 앱에서 대화상자 상태를 자동으로 관찰하고 그에 따라 업데이트하는 미디어 라우팅 버튼 (Cast 버튼이라고도 함)을 쉽게 추가할 수 있습니다. Media3의 CastPlayer와 함께 사용하면 추가 로직이 필요하지 않습니다.

@Composable
fun TopAppBarWithCast() {
  Row {
    Text(text = "App Title")
    MediaRouteButton()
  }
}
cast_button_2.png
기본 출력 전환기 대화상자를 실행하는 앱의 Media3 미디어 경로 버튼

핵심 재생 및 세션 개선사항

Eclipsa Video - HAGC 동적 HDR 메타데이터 (API 37 이상)

_Eclipsa Video_는 일관된 기준 HDR 흰색, 화면 및 주변 환경에 따라 적응형 헤드룸을 제공하여 모든 기기에서 크리에이티브 의도가 유지되도록 함으로써 기기 전반에서 더 일관된 HDR 환경을 제공합니다.

이제 ExoPlayer는 프로그레시브 미디어 (MP4, Matroska)에 필요한 HAGC (ST 2094-50) 시간 메타데이터의 재생을 지원합니다. 플레이어는 HAGC 메타데이터 트랙을 연결된 동영상 트랙과 자동으로 병합하고 API 37 이상 기기의 디코더에 대역 외 메타데이터를 제공합니다. 이전 기기에서 ExoPlayer는 조정 없이 표준 HDR 재생 환경을 제공하도록 원활하게 대체합니다.  

eclipsa.png
더 일관된 색상 계약과 같은 Eclipsa Video HDR의 이점을 보여주는 그림

새로운 Ktor HTTP 클라이언트 확장 프로그램

새로운 media3-datasource-ktor 확장 프로그램 모듈은 KtorDataSource을 제공하며, Ktor HTTP 스택으로 지원됩니다. 이는 기존 Cronet 및 OkHttp 데이터 소스 모듈에 대한 Kotlin 우선, 코루틴 친화적인 대안을 제공합니다.

비동기 MediaSession 연결

이제 MediaSession.Callback에는 컨트롤러 연결 시도를 비동기적으로 처리할 수 있는 onConnectAsync()가 포함됩니다(예: 연결을 수락하기 전에 승인을 확인). 기존 onConnect와 동일한 동작을 위해 Futures.immediateFuture(ConnectionResult)를 사용하여 즉시 Future를 반환할 수 있습니다. 

override fun onConnectAsync(
  session: MediaSession,
  controller: MediaSession.ControllerInfo
): ListenableFuture<MediaSession.ConnectionResult> {
  return authenticateControllerAsync(controller)
}

더 안전한 MediaSession 기본값

`MediaSession.Callback`에서 `onConnect` 또는 `onConnectAsync`를 재정의하지 않는 앱의 경우 이제 라이브러리가 기본적으로 더 안전한 구성으로 설정됩니다. 특히 세션 데이터는 더 이상 기본적으로 신뢰할 수 없는 컨트롤러와 공유되지 않습니다. 즉, 연결을 승인하기 위해 이러한 콜백 메서드를 명시적으로 구현하지 않는 한 알림 액세스 권한이 없는 서드 파티 또는 비시스템 앱은 세션 데이터에 액세스할 수 없습니다.

새로운 멀티플렉서 구현 및 컨테이너 파싱

OggMuxer 및 WavMuxer

표준 .ogg 파일로 OPUSVORBIS 스트림을 멀티플렉싱하기 위한 OggMuxer와 압축되지 않은 부동 소수점 PCM .wav 오디오 파일을 생성하기 위한 WavMuxer라는 두 개의 새로운 전용 멀티플렉서를 추가했습니다.

컨테이너 파싱 및 트랙 참조

  • MP4 트랙 참조 (tref): Mp4Muxer.addTrackReference를 사용하면 종속 메타데이터 또는 보조 트랙을 기본 동영상 스트림에 연결할 수 있습니다.
  • 챕터 추출: 이제 MP4 파일 (.m4a, .m4b)의 QuickTime 및 Nero 챕터와 Matroska 챕터가 오디오북 및 팟캐스트 탐색을 위한 Chapter 메타데이터 항목으로 추출됩니다.

버그를 신고하거나 질문 또는 기능 요청이 있는 경우 Issue Tracker를 사용하세요. 연락을 기다리겠습니다.

작성자:
계속 읽기