Media3 1.9.0이 출시되었습니다. 이번 최신 출시에는 일반적인 버그 수정 및 성능 개선 외에도 4개 의 새로운 모듈 또는 대폭 재작성된 모듈이 포함되어 있습니다.
media3-inspector- 재생 외부에서 메타데이터 및 프레임 추출media3-ui-compose-material3- 몇 단계만으로 기본 Material3 Compose 미디어 UI 빌드media3-cast- Cast와 로컬 재생 간 전환 자동 처리media3-decoder-av1- dav1d 라이브러리를 기반으로 재작성된 확장 프로그램 디코더를 사용한 일관된 AV1 재생
또한 PreloadManager에 캐싱 및 메모리 관리 개선사항을 추가하고 여러 가지 새로운 ExoPlayer, Transformer, MediaSession 간소화를 제공했습니다.
이번 출시에서는 CompositionPlayer에 대한 첫 번째 실험용 액세스 권한을 제공하여 미디어 수정을 미리 볼 수 있습니다.
자세한 내용은 계속 읽어보세요. 언제나처럼 이번 출시의 변경사항에 관한 포괄적인 개요는 전체 출시 노트를 확인하세요.
재생 외부에서 메타데이터 및 프레임 추출
재생을 시작하지 않고 미디어를 검사하려는 경우가 많습니다. 예를 들어 포함된 형식을 감지하거나 재생 시간을 확인하거나 썸네일을 가져오려고 할 수 있습니다.
새로운 media3-inspector 모듈은 재생 없이 미디어를 검사하는 모든 유틸리티를 한곳에 결합합니다.
MediaItem에서 재생 시간, 형식, 정적 메타데이터를 읽는MetadataRetriever- 항목에서 프레임 또는 썸네일을 가져오는
FrameExtractor - 파일의 샘플에 관한 자세한 정보를 가져오는 Android 플랫폼 MediaExtractor 클래스를 직접 대체하는
MediaExtractorCompat
MetadataRetriever 및 FrameExtractor는 간단한 AutoCloseable 패턴을 따릅니다. 자세한 내용은 새로운 가이드 페이지를 참고하세요.
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}몇 단계만으로 기본 Material3 Compose 미디어 UI 빌드
이전 출시에서는 Compose UI 요소와 Player 인스턴스 간의 커넥터 코드를 제공하기 시작했습니다. Media3 1.9.0에서는 완전히 스타일이 지정된 Material3 버튼과 콘텐츠 요소가 포함된 새로운 모듈 media3-ui-compose-material3을 추가했습니다. 이를 통해 몇 단계만으로 미디어 UI를 빌드할 수 있으며 스타일을 맞춤설정할 수 있는 모든 유연성을 제공합니다. 자체 UI 스타일을 빌드하려는 경우 모든 업데이트 및 연결 로직을 처리하는 빌딩 블록을 사용할 수 있으므로 UI 요소 디자인에만 집중하면 됩니다. Compose UI 모듈의 확장된 가이드 페이지를 확인하세요.
또한 사전 빌드된 탐색 표시줄, PlayerView를 완전히 대체하는 즉시 사용 가능한 기능, 자막 및 광고 통합과 같은 더 많은 Compose 구성요소를 계속 개발하고 있습니다.
@Composable fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) { Column(modifier) { ContentFrame(player) // Video surface and shutter logic Row (Modifier.align(Alignment.CenterHorizontally)) { SeekBackButton(player) // Simple controls PlayPauseButton(player) SeekForwardButton(player) } } }
즉시 사용 가능한 요소가 포함된 간단한 Compose 플레이어 UI
Cast와 로컬 재생 간 전환 자동 처리
CastPlayer가 media3-cast 모듈에서 재작성되어 로컬 재생 (ExoPlayer 사용)과 원격 Cast 재생 간의 전환을 자동으로 처리합니다.
MediaSession을 설정할 때 ExoPlayer를 중심으로 CastPlayer를 빌드하고 UI에 MediaRouteButton을 추가하면 완료됩니다.
// MediaSession setup with CastPlayer val exoPlayer = ExoPlayer.Builder(context).build() val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build() val session = MediaSession.Builder(context, castPlayer).build() // MediaRouteButton in UI @Composable fun UIWithMediaRouteButton() { MediaRouteButton() }
Media3 세션 데모 앱의 새로운 CastPlayer 통합
dav1d를 기반으로 재작성된 확장 프로그램을 사용한 일관된 AV1 재생
1.9.0 출시에는 인기 있는 dav1d 라이브러리를 기반으로 완전히 재작성된 AV1 확장 프로그램 모듈이 포함되어 있습니다.
모든 확장 프로그램 디코더 모듈과 마찬가지로 관련 네이티브 코드를 올바르게 번들링하려면 소스에서 빌드해야 합니다 . 디코더를 번들링하면 모든 기기에서 일관성과 형식 지원이 제공되지만 프로세스에서 디코딩을 실행하므로 신뢰할 수 있는 콘텐츠에 가장 적합합니다.
캐싱 및 메모리 관리를 PreloadManager에 통합
PreloadManager도 개선했습니다. 이미 재생 외부에서 미디어를 메모리에 미리 로드한 다음 필요할 때 플레이어에 원활하게 전달할 수 있습니다. 성능은 꽤 좋지만 실수로 너무 많이 미리 로드하여 메모리 한도를 초과하지 않도록 주의해야 했습니다. 따라서 Media3 1.9.0에서는 이 작업을 훨씬 쉽고 안정적으로 만들어 주는 두 가지 기능을 추가했습니다.
- 캐싱 지원 – 미리 로드할 범위를 정의할 때 이제 미리 로드된 항목의 타겟 상태로
PreloadStatus.specifiedRangeCached(0, 5000)을 선택할 수 있습니다. 이렇게 하면 데이터를 메모리에 로드하는 대신 지정된 범위가 디스크의 캐시에 추가됩니다. 이를 통해 현재 항목에서 더 멀리 떨어진 항목은 더 이상 메모리를 차지할 필요가 없으므로 훨씬 더 넓은 범위의 항목을 미리 로드할 수 있습니다. 이렇게 하려면DefaultPreloadManager.Builder에서Cache를 설정해야 합니다. - 자동 메모리 관리 – 미리 로드 사례를 더 잘 처리할 수 있도록
LoadControl인터페이스를 업데이트했습니다. 이제 메모리에 있는 모든 미리 로드된 항목에 명시적인 상한 메모리 한도를 설정할 수 있습니다. 기본값은 144MB이며DefaultLoadControl.Builder에서 한도를 구성할 수 있습니다.DefaultPreloadManager는 한도에 도달하면 미리 로드를 자동으로 중지하고 필요한 경우 우선순위가 낮은 항목의 메모리를 자동으로 해제합니다.
ExoPlayer의 새로운 간소화된 기본 동작 사용
언제나처럼 ExoPlayer에도 많은 점진적인 개선사항을 추가했습니다. 몇 가지 예를 들면 다음과 같습니다.
- 음소거 및 음소거 해제 – 이미
setVolume메서드가 있었지만 이제 편의를 위해mute및unmute메서드를 추가하여 직접 추적하지 않고도 이전 볼륨을 쉽게 복원할 수 있습니다. - 플레이어 멈춤 감지 – 드물게 코덱 문제 또는 잘못된 구성으로 인해 플레이어가 진행되지 않고 버퍼링 또는 재생 상태에서 멈출 수 있습니다. 사용자는 짜증을 내지만 분석에서는 이러한 문제가 표시되지 않습니다. 이를 더 명확하게 하기 위해 이제 플레이어가 멈춤 상태를 감지하면
StuckPlayerException을 보고합니다. - 기본적으로 Wakelock – 이전에는 절전 모드 해제 잠금 관리가 선택사항이었으므로 백그라운드에서 실행할 때 재생 진행이 크게 지연될 수 있는 찾기 어려운 엣지 케이스가 발생했습니다. 이제 이 기능은 선택 해제되어 있으므로 걱정할 필요가 없으며 재생과 관련된 모든 수동 절전 모드 해제 잠금 처리를 삭제할 수도 있습니다.
- CC 버튼 로직의 간소화된 설정 – '자막 켜기/끄기'로
TrackSelectionParameters를 변경하는 것은 놀라울 정도로 어려웠으므로 이 사용 사례를 위해 간단한 불리언selectTextByDefault옵션을 추가했습니다.
MediaSession에서 미디어 버튼 환경설정 간소화
지금까지 Android Auto 또는 WearOS의 미디어 알림 드로어에 표시할 버튼의 환경설정을 정의하려면 표준 플레이어 메서드를 트리거하려는 경우에도 맞춤 명령어와 버튼을 정의해야 했습니다.
Media3 1.9.0에는 이 작업을 훨씬 간단하게 만들어 주는 새로운 기능이 있습니다. 이제 표준 플레이어 명령어로 미디어 버튼 환경설정을 정의할 수 있으므로 맞춤 명령어 처리가 전혀 필요하지 않습니다.
session.setMediaButtonPreferences(listOf(
CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
.setDisplayName(R.string.skip_forward)
.setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action
.build()
))
빨리 감기 버튼이 있는 미디어 버튼 환경설정
실시간 미리보기를 위한 CompositionPlayer
1.9.0 출시에서는 새로운 @ExperimentalApi 주석 아래에 CompositionPlayer를 도입합니다. 주석은 실험에 사용할 수 있지만 아직 개발 중임을 나타냅니다.
CompositionPlayer는 미디어 수정의 실시간 미리보기를 위해 설계된 Media3 편집 API의 새로운 구성요소입니다. 익숙한 Media3 Player 인터페이스를 기반으로 빌드된 CompositionPlayer를 사용하면 사용자가 내보내기 프로세스를 커밋하기 전에 변경사항을 실제로 확인할 수 있습니다. 내보내기를 위해 Transformer에 전달하는 것과 동일한 Composition 객체를 사용하여 미리보기 및 내보내기의 데이터 모델을 통합하여 편집 워크플로를 간소화합니다.
CompositionPlayer를 사용해 보고 의견을 공유해 주시기 바랍니다. 자세한 내용은 향후 게시물과 문서 업데이트를 확인하세요.
Transformer의 기본 muxer로 InAppMuxer
이제 Transformer는 InAppMp4Muxer를 미디어 컨테이너 파일을 작성하는 기본 muxer로 사용합니다. 내부적으로 InAppMp4Muxer는 Media3 Muxer 모듈에 종속되어 모든 API 버전에서 일관된 동작을 제공합니다.
Transformer는 더 이상 기본적으로 Android 플랫폼의 MediaMuxer를 사용하지 않지만 사용 사례에 필요한 경우 setMuxerFactory를 통해 FrameworkMuxer.Factory를 제공할 수 있습니다.
새로운 속도 조정 API
1.9.0 출시에서는 미디어 편집을 위한 속도 조정 API를 간소화합니다. 속도를 제어하기 위해 EditedMediaItem.Builder에 직접 새로운 메서드를 도입하여 API를 더 직관적으로 만들었습니다. 이제 EditedMediaItem.Builder에서 setSpeed(SpeedProvider provider)를 호출하여 클립의 속도를 변경할 수 있습니다.
val speedProvider = object : SpeedProvider {
override fun getSpeed(presentationTimeUs: Long): Float {
return speed
}
override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
return C.TIME_UNSET
}
}
EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
.setSpeed(speedProvider)
.build()이 새로운 접근 방식은 이전에 사용했던 Effects#createExperimentalSpeedChangingEffects() 메서드를 대체합니다. 이 메서드는 지원 중단되었으며 향후 출시에서 삭제될 예정입니다.
EditedMediaItemSequence의 트랙 유형 도입
1.9.0 출시에서는 EditedMediaItemSequence를 사용하려면 시퀀스 생성 중에 원하는 출력 트랙 유형을 지정해야 합니다. 이 변경사항은 전체 Composition에서 트랙 처리가 더 명시적이고 강력하도록 합니다.
이는 트랙 유형 집합 (C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO 등)을 허용하는 새로운 EditedMediaItemSequence.Builder 생성자를 통해 이루어집니다.
생성을 간소화하기 위해 새로운 정적 편의 메서드를 추가했습니다.
- EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)
더 명확하고 안정적인 시퀀스 정의를 위해 새로운 생성자 또는 편의 메서드로 이전하는 것이 좋습니다.
동영상 전용 시퀀스 생성 예:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()버그가 발생하거나 질문 또는 기능 요청이 있는 경우 Media3 문제 추적기를 통해 문의해 주세요. 여러분의 소중한 의견을 기다리겠습니다.
계속 읽기
-
제품 소식
이제 Android Emulator를 사용하면 그 어느 때보다 쉽게 다중 기기 상호작용을 테스트할 수 있습니다.
Steven Jenkins • 전문 길이: 2분
-
제품 소식
모든 개발자의 AI 워크플로와 요구사항은 고유하며 AI가 개발에 어떻게 도움이 되는지 선택할 수 있는 것이 중요합니다. 1월에는 Android 스튜디오에서 AI 기능을 구동하기 위해 로컬 또는 원격 AI 모델을 선택할 수 있는 기능을 도입했습니다.
Matthew Warner • 전문 길이: 2분
-
제품 소식
이제 Android 스튜디오 Panda 3이 안정화되어 프로덕션에서 사용할 수 있습니다. 이번 출시에서는 AI 기반 워크플로를 더욱 세부적으로 제어하고 맞춤설정할 수 있으므로 그 어느 때보다 쉽게 고품질 Android 앱을 빌드할 수 있습니다.
Matt Dyor • 전문 길이: 3분
소식 받아 보기
Android 개발 관련 최신 정보를 이메일로 받아 보세요. 매주