Media3
| 최근 업데이트 | 안정화 버전 | 출시 후보 버전 | 베타 버전 | 알파 버전 |
|---|---|---|---|---|
| 2025년 10월 22일 | 1.8.0 | - | - | 1.9.0-alpha01 |
종속 항목 선언
Media3의 종속 항목을 추가하려면 프로젝트에 Google Maven 저장소를 추가해야 합니다. 자세한 내용은 Google Maven 저장소를 읽어보세요.
다음과 같이 앱 또는 모듈의 build.gradle 파일에 필요한 아티팩트의 종속 항목을 추가합니다.
Groovy
dependencies { def media3_version = "1.8.0" // For media playback using ExoPlayer implementation "androidx.media3:media3-exoplayer:$media3_version" // For DASH playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-dash:$media3_version" // For HLS playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-hls:$media3_version" // For SmoothStreaming playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version" // For RTSP playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version" // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation "androidx.media3:media3-exoplayer-midi:$media3_version" // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation "androidx.media3:media3-exoplayer-ima:$media3_version" // For loading data using the Cronet network stack implementation "androidx.media3:media3-datasource-cronet:$media3_version" // For loading data using the OkHttp network stack implementation "androidx.media3:media3-datasource-okhttp:$media3_version" // For loading data using librtmp implementation "androidx.media3:media3-datasource-rtmp:$media3_version" // For building media playback UIs using Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs using Views implementation "androidx.media3:media3-ui:$media3_version" // For building media playback UIs using Jetpack Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs for Android TV using the Jetpack Leanback library implementation "androidx.media3:media3-ui-leanback:$media3_version" // For exposing and controlling media sessions implementation "androidx.media3:media3-session:$media3_version" // For extracting data from media containers implementation "androidx.media3:media3-extractor:$media3_version" // For integrating with Cast implementation "androidx.media3:media3-cast:$media3_version" // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version" // For transforming media files implementation "androidx.media3:media3-transformer:$media3_version" // For applying effects on video frames implementation "androidx.media3:media3-effect:$media3_version" // For muxing media files implementation "androidx.media3:media3-muxer:$media3_version" // Utilities for testing media components (including ExoPlayer components) implementation "androidx.media3:media3-test-utils:$media3_version" // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation "androidx.media3:media3-test-utils-robolectric:$media3_version" // Common functionality for reading and writing media containers implementation "androidx.media3:media3-container:$media3_version" // Common functionality for media database components implementation "androidx.media3:media3-database:$media3_version" // Common functionality for media decoders implementation "androidx.media3:media3-decoder:$media3_version" // Common functionality for loading data implementation "androidx.media3:media3-datasource:$media3_version" // Common functionality used across multiple media libraries implementation "androidx.media3:media3-common:$media3_version" // Common Kotlin-specific functionality implementation "androidx.media3:media3-common-ktx:$media3_version" }
Kotlin
dependencies { val media3_version = "1.8.0" // For media playback using ExoPlayer implementation("androidx.media3:media3-exoplayer:$media3_version") // For DASH playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-dash:$media3_version") // For HLS playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-hls:$media3_version") // For SmoothStreaming playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version") // For RTSP playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version") // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation("androidx.media3:media3-exoplayer-midi:$media3_version") // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation("androidx.media3:media3-exoplayer-ima:$media3_version") // For loading data using the Cronet network stack implementation("androidx.media3:media3-datasource-cronet:$media3_version") // For loading data using the OkHttp network stack implementation("androidx.media3:media3-datasource-okhttp:$media3_version") // For loading data using librtmp implementation("androidx.media3:media3-datasource-rtmp:$media3_version") // For building media playback UIs using Compose implementation("androidx.media3:media3-ui-compose:$media3_version") // For building media playback UIs using Views implementation("androidx.media3:media3-ui:$media3_version") // For building media playback UIs using Jetpack Compose implementation("androidx.media3:media3-ui-compose:$media3_version") // For building media playback UIs for Android TV using the Jetpack Leanback library implementation("androidx.media3:media3-ui-leanback:$media3_version") // For exposing and controlling media sessions implementation("androidx.media3:media3-session:$media3_version") // For extracting data from media containers implementation("androidx.media3:media3-extractor:$media3_version") // For integrating with Cast implementation("androidx.media3:media3-cast:$media3_version") // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version") // For transforming media files implementation("androidx.media3:media3-transformer:$media3_version") // For applying effects on video frames implementation("androidx.media3:media3-effect:$media3_version") // For muxing media files implementation("androidx.media3:media3-muxer:$media3_version") // Utilities for testing media components (including ExoPlayer components) implementation("androidx.media3:media3-test-utils:$media3_version") // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation("androidx.media3:media3-test-utils-robolectric:$media3_version") // Common functionality for reading and writing media containers implementation("androidx.media3:media3-container:$media3_version") // Common functionality for media database components implementation("androidx.media3:media3-database:$media3_version") // Common functionality for media decoders implementation("androidx.media3:media3-decoder:$media3_version") // Common functionality for loading data implementation("androidx.media3:media3-datasource:$media3_version") // Common functionality used across multiple media libraries implementation("androidx.media3:media3-common:$media3_version") // Common Kotlin-specific functionality implementation("androidx.media3:media3-common-ktx:$media3_version") }
종속 항목에 관한 자세한 내용은 빌드 종속 항목 추가를 참고하세요.
의견
제출하신 의견은 Jetpack을 개선하는 데 도움이 됩니다. Media3 Issue Tracker를 사용하여 질문, 알려진 문제, 기능 요청에 대한 답변을 찾고 새 문제를 제출할 수 있습니다.
버전 1.9.0
버전 1.9.0-alpha01
2025년 10월 22일
androidx.media3:media3-*:1.9.0-alpha01이 출시되었습니다.
버전 1.9.0-alpha01에는 이 커밋이 포함되어 있습니다.
- 공통 라이브러리:
- 다른 AndroidX 라이브러리와 마찬가지로
minSdk를23로 업데이트합니다. Player인스턴스 간에 재생 상태를 쉽게 전송할 수 있는PlayerTransferState추가- 0으로 설정하기 전후에 플레이어의 볼륨을 보존하고 복원하는
void mute()및void unmute()메서드를 플레이어에 추가합니다. ExoPlayer에서 내부적으로 사용된 유틸리티 클래스WakeLockManager,WifiLockManager,AudioFocusManager,AudioBecomingNoisyManager,StuckPlayerDetector를 게시하여 다른 플레이어에서 재사용할 수 있도록 합니다(#1893).- 기본 위임 플레이어가 리스너 인스턴스를 비교할 때 참조 동등성을 사용하는 경우
ForwardingPlayer리스너 처리를 수정했습니다(#2675). - 작업을 수행해야 하는 특정
Player.Events를 지정하는media3-common-ktx라이브러리에Player.listenTo일시중단 확장 프로그램 함수를 추가합니다. - 보고된 버퍼링된 위치가 보고된 기간보다 터무니없이 큰 경우 정수 오버플로로 인해
BasePlayer.getBufferedPercentage에서 비정상 종료되는 문제 수정(#2750)
- 다른 AndroidX 라이브러리와 마찬가지로
- ExoPlayer:
- 플레이어가 멈춘 것으로 보이는 경우
StuckPlayerException플레이어 오류를 트리거하는 멈춘 플레이어 감지 추가 이는 다음 경우에 발생하며, 필요한 경우 각 기본 제한 시간은ExoPlayer.Builder에서 구성할 수 있습니다.- 재생을 시도하는 동안
STATE_BUFFERING가 10분 동안 표시되고 버퍼링 진행률이 표시되지 않습니다. - 재생을 시도하는 동안
STATE_READY초가 지나도 재생이 진행되지 않습니다. - 선언된 기간이 지나고 1분이 지났는데도 상품 끝에 도달하지 못함
STATE_READY - 재생을 시도하는 동안 재생 억제 사유가 있는 상태로 10분이 지난 후
- 재생을 시도하는 동안
- 백그라운드 재생 중 버퍼링 문제를 해결하기 위해 기본적으로 절전 모드 해제 잠금 처리를 사용 설정 이는
ExoPlayer.Builder.setWakeMode를C.WAKE_MODE_LOCAL로 설정하는 것과 같습니다. - 변경사항이
ExoPlayer.Builder에 원래 전달된Context에 보고될 때 가상 기기 ID를 자동으로 업데이트하는 리슨 로직 추가 ExoPlayer.Builder에 전달된Context에서 가져온 가상 기기 ID를 수동으로 업데이트하도록ExoPlayer.setVirtualDeviceId추가- 렌더러가 현재 항목이 끝나기 10초 전에 다음 재생목록 항목의 데이터를 소비하지 않도록 합니다.
setSeekBackIncrementMs,setSeekForwardIncrementMs,setMaxSeekToPreviousPositionMs를ExoPlayer에 추가하여 생성 후 이러한 설정을 업데이트합니다(#2736).DefaultPreloadManager에 사전 캐싱 기능 추가 이제 앱은TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData)를 통해DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs)또는DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs)를 반환하여 미디어 항목을 미리 캐시해야 함을 나타낼 수 있습니다.- Shortform 데모 앱에서
DefaultPreloadManager의 사전 캐싱 기능을 사용합니다. - 로컬 재생을 위한
DefaultLoadControl.Builder설정자를 추가하고 다양한 로컬 파일과 잘 작동하도록DefaultLoadControl의 기본값을 조정합니다. - 빈 재생목록을 설정하면 플레이어가
STATE_READY또는STATE_BUFFERING에 남을 수 있는 버그 수정 - 미리 로드 관리자 API 개선:
- 미디어 항목 또는 미디어 소스를 일괄적으로 추가하고 이후에
invalidate()를 자동으로 호출하는addMediaItems(List<MediaItem>, List<T>)및addMediaSources(List<MediaSource>, List<T>)추가 - 미디어 항목 또는 미디어 소스를 일괄적으로 삭제하는
removeMediaItems((List<MediaItem>)및removeMediaSources(List<MediaSource>)를 추가하고 삭제 후 미리 로드 관리자가 이러한 항목의 미리 로드를 시작하거나 계속하지 않는지 확인합니다. DefaultPreloadManager.setCurrentPlayingIndex(int)가 자동으로 무효화되도록 허용 현재 재생 중인 색인을 업데이트한 후에는 앱이 더 이상invalidate()를 명시적으로 호출할 필요가 없습니다.
- 미디어 항목 또는 미디어 소스를 일괄적으로 추가하고 이후에
- 스크러빙 모드에서 동일한 사진 그룹 내에서 앞으로 탐색할 때 키프레임 재설정을 건너뛰는 기능 추가
- 앱이 지정된
playerName로 플레이어의 타겟 버퍼 바이트 값을 설정할 수 있도록DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)추가 이제DefaultLoadControl는 할당된 자체 바이트와 타겟 버퍼 바이트를 기반으로 각 플레이어의 결정을 별도로 내릴 수 있습니다. - 광고 그룹의 각 광고에 대한 건너뛰기 정보를 전달하기 위해
AdPlaybackState.AdGroup에SkipInfo를 추가합니다. - 포스트롤 재생 중에
removeMediaItems(List)를 호출하면 비정상 종료가 발생하는 버그를 수정했습니다(#2746). - 프레임이 항상 마지막 샘플로 잘못 설정되고 렌더링되는 재생목록 재생에서 발생하는 일부 끊김 현상 수정
- 플레이어가 오디오 세션 ID를 생성하지 못하는 경우 재시도 경로를 사용 설정합니다(#2382, #2678).
DefaultPreloadManager에서 소스의 총 버퍼 바이트를 제어하는 지원을 추가하여 미리 로드용 총 버퍼 바이트가 임의로 증가하지 않도록 합니다. 기본 제어 로직을 사용하려면 앱은PlayerId.Preload.name('preload')의playerName에 대해DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)를 통해 미리 로드할 타겟 버퍼 바이트를 설정하고DefaultPreloadManager.Builder.setLoadControl(LoadControl)를 통해 생성된DefaultLoadControl를 삽입할 수 있습니다.
- 플레이어가 멈춘 것으로 보이는 경우
- CompositionPlayer:
- 실험에 사용할 수 있지만 아직 개발 중임을 나타내기 위해 새로운
@ExperimentalApi주석 아래에CompositionPlayer를 게시합니다. 일부 API는 향후 버전에서 크게 변경될 수 있으며 일부 사용 사례에는 알려진 문제와 제한사항이 있습니다(일부는 문서화되지 않음). CompositionPlayer에서COMMAND_SET_AUDIO_ATTRIBUTES및 오디오 포커스 처리 지원 추가CompositionPlayer의 보조 시퀀스에서 속도 변경 지원 추가
- 실험에 사용할 수 있지만 아직 개발 중임을 나타내기 위해 새로운
- 변환기:
InAppMp4Muxer을 기본 멀티플렉서로 사용EditedMediaItem.Builder#setSpeed()를 추가하고Effects#createExperimentalSpeedChangingEffects()를 지원 중단합니다.EditedMediaItemSequence에서forceAudioTrack및forceVideoTrack를trackTypes로 바꿉니다.
- 트랙 선택:
- 다른 더 구체적인 환경설정을 지정하지 않고 텍스트 트랙 선택을 선호하도록
TrackSelectionParameters.selectTextByDefault를 추가합니다. TrackSelectionParameters에preferredVideoLabels,preferredAudioLabels,preferredTextLabels를 추가하여 특정 라벨이 있는 트랙의 환경설정을 지정합니다(예: HLS NAME 태그에서 읽은 트랙(#1666)).
- 다른 더 구체적인 환경설정을 지정하지 않고 텍스트 트랙 선택을 선호하도록
- 추출기:
- FLAC: 인코딩된 FLAC 데이터에서 가짜 헤더를 찾을 가능성을 줄여 디코딩 오류를 유발하도록 헤더 감지를 강화했습니다(#558).
- MP3: MP3 파일 시작 부분에 있는 ID3 태그 사이 (및 앞)의 간격 허용 (#811, #5718)
- MP4: 추출기에서 트랙 형식을 내보내기 전에 첫 번째 샘플의 레이어 값을 살펴봄으로써
audio/mpeg(MP3),audio/mpeg-L1,audio/mpeg-L2MIME 유형을 구분합니다(#2683). - MP4: 1MB보다 큰
stbl상자는 파일이 조각화되지 않음을 의미한다고 가정하여 매우 큰 파일의 스니핑 효율성 개선(#2650) - Matroska: DTS-HD 감지 지원 추가(#6225)
- 트랙이 여러 개인 파일의 경우 탐색이 정확하지 않을 수 있는
MatroskaExtractor의 문제 수정 이제 큐 포인트가 각 트랙과 올바르게 연결되어 더 정확한 탐색이 가능합니다. - MP4:
©mvn(동작 이름) 및©mvi(동작 색인) 메타데이터 지원을 추가했습니다. 이제 이러한 메타데이터는 각각 ID가MVNM및MVIN인Format.metadata의TextInformationFrame객체로 내보내집니다(#2754). - MPEG-TS: 타임스탬프가 없는 PES 패킷으로 인해
ReorderingBufferQueue에서IllegalArgumentException가 발생하는 문제 수정(#2764) - MP4: 전체 파일 파싱에 실패하는 대신
stsd상자가 누락된 트랙을 무시합니다. - HEIC 모션 사진 추출 지원 추가 이제
HeifExtractor에서 삽입된 동영상 및 오디오 트랙이 포함된 HEIC 파일을 파싱할 수 있습니다. - MP3: 다른 탐색 정보가 없는 경우 인덱스 기반 탐색으로 대체하여 메타데이터 헤더 (예: Xing 및 VBRI)에서 정보를 탐색하는 것을 선호하도록
FLAG_ENABLE_INDEX_SEEKING변경 이렇게 하면 탐색 메타데이터가 있는 파일의 성능이 향상됩니다(#2839).
- 검사자:
- 미디어 검사 유틸리티의 전용 홈 역할을 하는 새로운
:media3-inspector모듈이 도입되었습니다. 이제 이 모듈에는 메타데이터와 프레임 추출 모두에 통합 API를 제공하는 새로운androidx.media3.inspector.MetadataRetriever가 있습니다. 기존androidx.media3.exoplayer.MetadataRetriever은 이제 이 새 버전으로 대체되어 지원 중단됩니다. - 프레임 추출을 위한 새로운 공개 API인
androidx.media3.inspector.FrameExtractor가 도입되었습니다. 이AutoCloseable클래스는 HDR 동영상, 동영상 효과, 맞춤 디코더 선택을 지원하는 프레임을 추출하는 방법을 제공합니다. 특정MediaItem의Builder를 통해 생성해야 합니다. - FrameExtractor: 특정 타임스탬프가 필요 없이 미디어 파일에서 대표 썸네일 프레임을 추출하는
getThumbnail()추가
- 미디어 검사 유틸리티의 전용 홈 역할을 하는 새로운
- 오디오:
AudioProcessor인스턴스가 탐색을 인식하도록 합니다.- 맞춤 오디오 출력 경로를 지원하기 위해 새
AudioOutputProvider인터페이스를DefaultAudioSink.Builder에 삽입하도록 허용 기본값은AudioTrackAudioOutputProvider입니다. GainProcessor에서 탐색 처리- 트랙 형식 지원 평가에서 AC-4 디코더 프로필 및 수준 기능을 활용합니다(#2580).
- 재생 시작 시 라우팅 변경 콜백을 처리하여 발생할 수 있는 지연 방지(#2646)
- EAC3, EAC3-JOC, AC-4 형식의 코덱 재사용 허용(#1346)
Sonic에 부동 소수점 PCM 샘플 지원 추가ToFloatPcmAudioProcessor에 16비트 PCM 샘플 지원 추가
- 동영상:
- 프로필이 다른 Dolby-Vision 콘텐츠의 코덱 재사용 사용 중지
- 텍스트:
- Dolby Vision 콘텐츠에서 CEA-6/708 자막 파싱 수정(#2775)
- 이미지:
- DASH 썸네일 트랙을 스크러빙하는 동안 플레이어가 멈추는 ScrubbingMode 문제 수정(#2815)
- DRM:
- 추가 선택적 정보를 반환할 수 있도록
MediaDrmCallback메서드의 반환 유형을byte[]에서 새로운MediaDrmCallback.Response유형으로 변경 이는 소스 호환성 변경사항이지만 이전byte[]반환 값을 반환하기 전에new Response로 래핑하면 손쉽게 해결할 수 있습니다. - URL 및 지연 시간과 같은 주요 요청 정보를
AnalyticsListener.onDrmKeysLoaded에 추가합니다(#1001). - 프로비저닝 요청 데이터를 URL 매개변수에서 POST 본문으로 이동
- 추가 선택적 정보를 반환할 수 있도록
- Muxers:
- 프레임워크
MediaMuxer의 대체품인MediaMuxerCompat추가 - 모션 사진 생성을 허용하도록
MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo()추가 OPUS,VORBIS,VP8,VP9미디어 스트림을webm파일 형식으로 멀티플렉싱할 수 있도록WebmMuxer추가
- 프레임워크
- IMA 확장 프로그램:
- 앱이 IMA Android 보관 파일에 출시된 규칙을 대신 사용할 수 있도록 맞춤 Proguard 규칙 삭제
- Google Ad Manager 설정에 지정된 대로 IMA SDK가 광고 식별자를 처리하도록 Google Ad Manager 네트워크 코드를 설정하는 새로운 API인
ImaServerSideAdInsertionUriBuilder.setNetworkCode를 추가합니다. 네트워크 코드는 선택사항이지만 전체 서비스 스트림 요청에 권장됩니다. 네트워크 코드를 확인하려면 이 도움말을 참고하세요. - 핵심 라이브러리 desugaring을 사용 설정해야 하는 3.37.0으로 IMA 종속 항목을 범프합니다. 종속 앱에서도 사용 설정해야 합니다. IMA의 구성 메모를 참고하세요.
- SSAI URI 빌더에서 IMA DAI 맞춤 UI 옵션 지원 서버 측 광고 삽입을 위한 맞춤 UI 옵션에는 '건너뛸 수 있음' 및 '이 광고 정보' 렌더링 지원이 포함됩니다. 이 기능은 현재 허용 목록에 있는 일부 게시자에게만 제공됩니다. 또한 이 변경사항은 맞춤 UI 옵션 API에 액세스하기 위해 IMA SDK 버전을 3.38.0(출시 노트)으로 업그레이드합니다.
- 세션:
- 정보를 수집하기 위해서만 호출되는지 아니면 재생을 시작하기 위해 호출되는지 나타내기 위해
MediaSession.Callback.onPlaybackResumption에 새 매개변수 추가 (#1764) - 자체 앱의 컨트롤러도 신뢰할 수 있는 것으로 선언하도록
MediaSession.ControllerInfo.isTrusted업데이트(#2542) MediaSessionService.triggerNotificationUpdate를 추가하여 알림 업데이트를 수동으로 트리거합니다(#1833).- 맞춤 명령어 메서드에
ProgressListener추가 MediaLibrarySession.Builder.setLibraryErrorReplicationMode의 기본값을 심각하지 않은 것으로 변경MediaButtonReceiver.onForegroundServiceStartNotAllowedException에Context매개변수 추가(#2625)- 바인더를 통해 가져오는 대신 플랫폼
PlaybackInfo에서 볼륨 제어 ID를 읽습니다. 이렇게 하면 재생 유형과 볼륨 제어 ID가 원자적으로 읽히고 서로 일치합니다. - 맞춤 처리를 위해 콜백에 전달하기 전에
ACTION_UP키 이벤트가 필터링되는 버그 수정 이렇게 하면 media1이 실행한 작업과 플랫폼이 실행한 작업(#2637) 간에 패리티가 유지됩니다. - 명령어를 사용할 수 없는 경우에도
PlayerWrapper에 의해getCurrentTimeline()가 호출되는 버그를 수정합니다(#2665). - 서비스가 종료된 후 메모리 누수를 일으키는 메시지가 기본 루퍼의 메시지 대기열에 남아 있는 버그를 수정했습니다(#2692).
MediaBrowser가 있는 기존 세션 앱에 연결된 경우 맞춤 작업이 기존 세션의PlaybackStateCompat에 맞춤 작업으로 광고된 경우에만 맞춤 명령어가 세션에 전송됩니다. 다른 모든 맞춤 작업은 서비스로 전송됩니다.- 오디오 세션 ID가 세션에 의해 설정될 때 미디어 컨트롤러에 알리도록
onAudioSessionIdChanged를 구현했습니다(#244). KEYCODE_HEADSETHOOK가onStartCommand()에 도착하는 미디어 키 이벤트Intent에서 플레이어를 시작하지 않는 버그를 수정했습니다. 이는KEYCODE_MEDIA_PLAY_PAUSE(#2816)와 마찬가지로 'KEYCODE_HEADSETHOOK'을 처리하여 수정됩니다.- 세션과 컨트롤러 간에 서피스 크기가 전달되지 않아 데모 세션에서 동영상 효과를 적용하지 못하는 버그를 수정했습니다. 컨트롤러를 사용하는 경우 플레이어가
setVideoSurfaceHolder호출을 처리할 수 없으면 호환성이 깨지는 변경사항일 수 있습니다. - 스팬 스타일 문자열과 같은
String가 아닌CharSequence메타데이터 값의 전파 수정(#2853)
- 정보를 수집하기 위해서만 호출되는지 아니면 재생을 시작하기 위해 호출되는지 나타내기 위해
- UI:
media3-ui-compose모듈에ProgressStateWithTickInterval클래스와 해당rememberProgressStateWithTickInterval컴포저블을 추가합니다. 이 상태 홀더는demo-compose에서 현재 위치와 지속 시간을 텍스트 형식으로 표시하는 데 사용됩니다.Player볼륨의 음소거를 처리하는ui-compose에MuteButtonState추가 이 상태 홀더는demo-compose에서 음소거/음소거 해제 전환 버튼을 표시하는 데 사용됩니다.ProgressStateWithTickCount클래스와 상응하는rememberProgressStateWithTickCount컴포저블을media3-ui-compose모듈에 추가합니다. 이 상태 홀더는demo-compose에서 진행률을 가로 읽기 전용 진행률 표시줄로 표시하는 데 사용됩니다.PlayerSurface관리와 가로세로 비율 조정 및 셔터로 덮기를 결합하는ContentFrame컴포저블을media3-ui-compose에 추가- Compose
AndroidView내에서SurfaceView를 사용할 때 동영상이 늘어나거나 잘리는 알려진 API 34 플랫폼 버그를 해결하여SURFACE_TYPE_SURFACE_VIEW로ContentFrame및PlayerSurface컴포저블에 영향을 미칩니다(#1237, #2811). - 새
media3-ui-compose-material3모듈을 만들고 여기에 Material3 테마가 적용된 컴포저블 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton)을 추가합니다. PlayerView에 미디어 경로 버튼을 배치하는 지원 추가
- HLS 확장 프로그램:
- DASH 확장 프로그램:
- RTSP 확장 프로그램:
- H264 및 H265의 분할된 NAL 단위를 처리할 때 누락된 RTP 패킷 오류를 처리합니다(#2613).
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1 등):
- AV1 확장 프로그램: 이제 AV1 소프트웨어 디코더가 고성능
dav1d라이브러리를 사용하여 이전libgav1구현을 대체하여 디코딩 속도를 개선합니다.
- AV1 확장 프로그램: 이제 AV1 소프트웨어 디코더가 고성능
- Cast 확장 프로그램:
CastPlayer이 로컬 재생과 전송 재생을 모두 실행할 수 있도록 하는CastPlayer.Builder추가 Cast 재생만 지원하는 이전CastPlayer동작을 유지하려면RemoteCastPlayer를 사용하면 됩니다. 기존CastPlayer생성자는 이전 동작을 유지하지만 대신CastPlayer또는RemoteCastPlayer빌더를 사용하는 것이 권장되지 않습니다.DefaultMediaItemConverter에서 null이 아닌 MIME 유형 강제 적용 중지- 사용 가능한 경우
MediaItem.mediaMetadata.mediaType를 사용하여DefaultCastOptionsProvider#toMediaQueueItem에서 사용할 Cast MEDIA_TYPE을 추론합니다. DefaultCastOptionsProvider에서 원격에서 로컬로 전송을 사용 설정합니다.- 세션 데모에 Cast 지원 추가
- 컴포저블 UI에 미디어 경로 버튼을 표시하는 지원 추가
- 작업 모음 메뉴에 미디어 경로 버튼을 표시하는 지원 추가
- 미디어 경로 버튼을 뷰 UI로 표시하는 지원 추가
- 테스트 유틸리티:
FakeClock의 자동 진행 동작에 최대 시간 차이 추가 기본값은 1초이지만FakeClock.Builder를 통해 구성할 수 있습니다.RobolectricUtil.runMainLooperUntil(및runLooperUntil)의 메시지 간 최대 시간 차이 추가. 기본값은 1초이지만 이러한 메서드의 새로운 오버로드를 통해 구성할 수 있습니다.CapturingRenderersFactory을(를)test-utils에서test-utils-robolectric로 이동
- 지원 중단된 기호 삭제:
- 지원 중단된
DefaultPreloadManager생성자가 삭제됩니다. 대신DefaultPreloadManager.Builder를 사용합니다. - 지원 중단된
EditedMediaItemSequence생성자가 삭제되었습니다. 대신EditedMediaItemSequence.Builder를 사용합니다.
- 지원 중단된
버전 1.8.0
버전 1.8.0
2025년 7월 30일
버전 1.8.0에는 이 커밋이 포함되어 있습니다.
- 공통 라이브러리:
ForwardingSimpleBasePlayer에서 플레이어 교체 지원 추가
- ExoPlayer:
ExoPlayer인터페이스에 셔플 모드 getter 추가(#2522)- 여러 스레드에서
DefaultAudioSink에 액세스하는 경우 예외를 더 명확하게 발생시킴 플레이어 외부에서RendererCapabilities.getFormatSupport를 호출하여 이 문제가 발생하는 경우 ExoPlayer의 재생 스레드와 동일한 스레드에서 이 메서드를 호출하거나 재생에 사용된 인스턴스와 다른 인스턴스를 사용해야 합니다(#1191). - TV의 비스테레오 오디오 형식이
DefaultTrackSelector에 의해 지원되지 않는 것으로 표시될 수 있는 버그 수정 - MediaCodec의
DECODE_ONLY플래그 (스크러빙 모드에서 기본적으로 사용 설정됨)를 사용할 때 마지막 프레임이 올바르게 렌더링되는지 확인합니다. ExoPlayer.Builder에 전달된Context에서 가상 기기 ID를 사용하는 지원 추가- 스크러빙 모드에서 기본적으로 동적 예약 사용 설정
- 항목 끝으로 이동할 때 소스가 불필요하게 다시 로드되지 않도록 합니다.
- 스크러빙 모드에서 기본적으로
MediaCodec.BUFFER_FLAG_DECODE_ONLY사용 PreloadMediaSource이 미리 로드 스레드와 다른 재생 스레드가 있는ExoPlayer에 의해 재생될 때IllegalStateException을 발생시킵니다 (#2495).- 기본 구현(#2226)으로
ShuffleMode에cloneAndMove추가 render호출이 필요하지 않은 경우 더 큰 값을 반환하도록Renderer.getMinDurationToProgressUs의 기본 동작 변경- 일시중지된 상태에서 끝으로 탐색할 때 내부 예약으로 인해 마지막 프레임이 지연되는 버그 수정 현재 이 버그 수정은
ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled가 사용 설정된 경우에만 적용됩니다. ExoPlayer.setScrubbingModeEnabled(boolean)메서드 추가 이렇게 하면 사용자가 스크러버 바를 드래그하는 등 자주 탐색하는 경우 플레이어가 최적화됩니다. 스크러빙 모드의 동작은ExoPlayer및ExoPlayer.Builder에서setScrubbingModeParameters(..)를 사용하여 맞춤설정할 수 있습니다.- 스크러빙 모드에서 부분 탐색 허용 오차를 맞춤설정할 수 있도록 허용
- 스크러빙 모드에서 코덱 작동률을 높입니다.
AdsMediaSource콘텐츠의 준비 오류가 보고되지 않을 수 있는 버그 수정 (#2337)- 자막을 사이드로드할 때 사용되는
MergingMediaSource의 메모리 누수를 수정했습니다(#2338). CmcdConfiguration.Factory가null를 반환하여 특정 미디어 항목의 CMCD 로깅을 사용 중지하도록 허용(#2386)- 기본 이미지 버퍼 크기를 128KB (텍스트 트랙에서 복사하여 붙여넣는 실수)에서 26MB로 늘립니다. 이는 50MP 울트라 HDR 이미지에 충분한 크기입니다(#2417).
- 앱이 지정된 시작 위치와 재생 시간으로 단일 미디어를 미리 캐시할 수 있는
PreCacheHelper추가 DefaultPreloadManager의 지정된 위치에서 미리 로드 지원 추가
- 변환기:
- 동영상 인코딩 설정의 칩셋별 최적화를 지원하는
CodecDbLite추가 DefaultEncoderFactory에setEnableCodecDbLite플래그를 추가하여 CodecDB Lite 설정 최적화를 사용 설정합니다. 기본적으로 이 플래그는 false로 설정됩니다.- 이제 음소거 오디오로 초기 간격 (
addGap()를 통해 추가됨)을 채우려면EditedMediaItemSequence.Builder에서experimentalSetForceAudioTrack(true)을 명시적으로 설정해야 합니다. 갭이 시퀀스 중간에 있는 경우 이 플래그는 필요하지 않습니다. Muxer인터페이스를media3-transformer에서media3-muxer로 이동- 미디어 항목을 이미지로 가져오려면
MediaItem.Builder().setImageDuration(long)설정을 필수사항으로 만듭니다. - 트리밍할 때 MP4 수정 목록을 포함하는
Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean)를 추가하여 플레이어에게 트림 시작점 전의 키 프레임과 트림 시작점 사이의 샘플을 무시하도록 안내합니다. - Kotlin과 Jetpack Compose를 사용하도록 컴포지션 데모 앱을 업데이트하고 시퀀스를 2x2 또는 PiP 레이아웃으로 정렬하는 맞춤
VideoCompositorSettings를 추가합니다.
- 동영상 인코딩 설정의 칩셋별 최적화를 지원하는
- 추출기:
- 분할된 MP4 파일에서 메타데이터 파싱(#2084)
- JPEG: 시작 부분에 Exif 세그먼트가 없는 모션 사진 지원(#2552)
- 여러
sidx원자가 있는 조각화된 MP4에서 탐색 지원 추가 이 동작은FragmentedMp4Extractor에서FLAG_MERGE_FRAGMENTED_SIDX플래그를 사용하여 사용 설정할 수 있습니다(#9373). - FLAC 파일에서 빈 탐색 테이블 (자리표시자 탐색 포인트만 포함된 테이블 포함)을 무시하고 파일의 재생 시간이 알려진 경우 바이너리 검색 탐색으로 대체합니다(#2327).
- 인식되지 않는 SEI 유형을 완전히 건너뛰도록 H.265 SEI 단위의 파싱을 수정합니다(#2456).
WAVE_FORMAT_EXTENSIBLE유형 파일을 파싱할 때 오디오 형식에 헤더 확장 프로그램의 SubFormat 데이터를 사용하도록WavExtractor업데이트- MP4: 원시 PCM 오디오 트랙을 정의하는
ipcm및fpcm상자 지원 추가 (64비트 부동 소수점 PCM은 지원되지 않음) - MP4: 동영상을 회전하고 반사하는
tkhd변환 행렬의 회전 부분을 처리합니다. 이렇게 하면 iPhone 전면 카메라로 촬영한 반사된 동영상이 올바르게 표시되지만 y축에서 잘못 반사됩니다(#2012). - MP3:
FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS)로 인해 고정 비트 전송률 탐색으로 대체될 때 탐색할 수 없는 Xing, VBRI, 유사한 가변 비트 전송률 메타데이터의 지속 시간과 데이터 크기를 사용합니다(#2194).
- 오디오:
- 미디어 끝에 매우 가까운 오디오 재생이 시작될 때
AnalyticsListener.onAudioPositionAdvancing가 호출되지 않는 버그 수정 ChannelMappingAudioProcessor및TrimmingAudioProcessor에서 모든 선형 PCM 샘플 형식 지원 추가CompositionPlayer에 오디오 간격 지원 추가BaseAudioProcessor#reset()에서BaseAudioProcessor#flush()에 대한 가짜 호출을 삭제합니다.- DefaultAudioMixer에서 일정한 전력 업믹싱/다운믹싱 허용
ChannelMappingAudioProcessor,TrimmingAudioProcessor,ToFloatPcmAudioProcessor를 공개로 설정합니다(#2339).- 최선을 다한 추정 대신
AudioTrackPositionTracker에서AudioTrack#getUnderrunCount()를 사용하여DefaultAudioSink의 언더런을 감지합니다. - 오디오 출력 장치에서 예기치 않은 위치 드리프트에 대한 오디오 타임스탬프 스무딩을 개선합니다.
- 블루투스 기기에 연결된 상태에서 일시중지 후 다시 시작한 후 처음 10초 동안 A/V 동기화가 깨지는 버그 수정
AnalyticsListener.onAudioPositionAdvancing가 오디오가 진행되기 시작한 시간은 보고하지 않고 첫 번째 측정 시간만 보고하는 버그를 수정했습니다.- 일부 기기에서 스테레오 오디오로 대체된 후 멀티채널 오디오로 복구하는 문제 수정 (#2258)
- 미디어 끝에 매우 가까운 오디오 재생이 시작될 때
- 동영상:
- 분리된 화면 해결 방법을 'lenovo' 및 'motorola' 기기로 확장(#2059)
- 오디오 샘플이 요청된 위치에서 정확하게 시작되지 않을 때 시작 시 부드러운 동영상 프레임 출시 개선
- 분리된 표면 해결 방법을 'realme' 기기로 확장(#2059)
- 디코딩 전용 입력 버퍼를 대기열에 추가할 때
MediaCodec.BUFFER_FLAG_DECODE_ONLY플래그를 포함하는 실험용ExoPlayerAPI 추가 이 플래그는 디코더에 디코딩 전용 버퍼를 건너뛰도록 신호를 보내므로 더 빠른 탐색이 가능합니다.DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag로 사용 설정합니다. - 소프트웨어 동영상 코덱의 코덱 성능 검사 개선 이로 인해 일부 트랙이
EXCEEDS_CAPABILITIES로 표시될 수 있습니다. - 일부 기기에서 VP9 Widevine 재생 오류 수정(#2408)
- 텍스트:
- MP4 파일에서 VobSub 트랙 지원 추가(#2510)
- 자막 세그먼트가 처음에는 로드되지 않았지만 나중에 로드된 후 여러 개의 빈 자막 세그먼트가 이어지는 경우 재생이 멈추는 문제 수정(#2517)
- 자막을 사용 설정할 때 진행 중인 큐가 표시되도록 SSA 및 SubRip 수정(#2309)
- 자막 오류가 있는 스트림에서 자막 트랙이 비어 있는 라이브 스트림으로 전환할 때 재생이 멈추는 문제 수정(#2328)
- B 프레임이 포함된 H.262 스트림을 재생할 때 CEA-608 자막이 깨지는 문제 수정 (#2372)
- Matroska 파일에서
CodecId = S_TEXT/SSA를 사용하여 SSA 자막 지원 추가 이전에는MatroskaExtractor가 SubStation Alpha 자막의 '고급' (v4 이상) 변형을 나타내는CodecId = S_TEXT/ASS만 지원했습니다 (하지만 ExoPlayer의 파싱 로직은 두 변형 모두 동일함)(#2384). - 화면에 동시에 두 개 이상의 자막이 표시될 때 자막의 z-순서를 정의하는 데 사용되는 SubStation Alpha (SSA) 자막 파일의
layer속성 지원 추가(#2124)
- 메타데이터:
MetadataRetriever에 미디어 재생 시간과Timeline가져오기 지원을 추가하고 인스턴스 기반AutoCloseableAPI로 이전했습니다. 새Builder를 사용하여MediaItem의 인스턴스를 만든 다음retrieveTrackGroups(),retrieveTimeline(),retrieveDurationUs()를 호출하여 메타데이터의ListenableFuture를 가져옵니다. 이전 정적 메서드는 이제 지원 중단됩니다(#2462).
- 이미지:
- 매우 큰 (예: 50MP) 이미지를 표시하려고 할 때
PlayerView에서Canvas: trying to draw too large bitmap.로 인해 앱이 비정상 종료되는 것을 방지하기 위해BitmapFactoryImageDecoder에서 디코딩된 비트맵을 디스플레이 크기로 제한합니다. Context매개변수를 사용하도록DefaultRenderersFactory.getImageDecoderFactory()의 서명을 변경합니다.CompositionPlayer에 사용된 최대 비트맵 출력 크기를Transformer에 이미 사용된 크기와 정렬합니다 (즉,CompositionPlayer는ExoPlayer와 달리 비트맵을 디코딩할 때 디스플레이 크기를 고려하지 않음).
- 매우 큰 (예: 50MP) 이미지를 표시하려고 할 때
- DRM:
- HTTP 요청 헤더가 올바르게 적용될 수 있도록
MediaItem.DrmConfiguration를 허용하는OfflineLicenseHelper.newWidevineInstance의 새 오버로드 추가(#2169)
- HTTP 요청 헤더가 올바르게 적용될 수 있도록
- 효과:
- 입력 방향과 관계없이 가장 짧은 면이 항상 지정된 값과 일치하도록 하는
Presentation를 생성하는Presentation.createForShortSide(int)추가
- 입력 방향과 관계없이 가장 짧은 면이 항상 지정된 값과 일치하도록 하는
- Muxers:
- 분할된 MP4에서 오디오 샘플에 올바른 샘플 플래그가 설정되지 않는 버그 수정
- 이제
writeSampleData()API는MediaCodec.BufferInfo대신 믹서별BufferInfo클래스를 사용합니다. - 기본값이 false인
Muxer.Factory#supportsWritingNegativeTimestampsInEditList추가
- IMA 확장 프로그램:
- 한 광고의 로드 오류로 인해 다른 광고 그룹이 실수로 무효화될 수 있는 버그가 수정되었습니다.
- VOD 기간이 끝난 후 광고 그룹으로 인해 재생이 중지되는 버그를 수정했습니다.
이제 기간이 지난 후 시작되는 광고 그룹은
MediaPeriodQueue에 대기열로 추가되지 않습니다(#2215).
- 세션:
- 권한이 없는 서드 파티 Media3 컨트롤러의 연결이 무시되는 버그 수정
- 맞춤 명령어를 기존
MediaBrowserServiceCompat에 전송할 때 사용 가능한 명령어 확인 삭제 이는 기존 앱에 연결된 경우 기존 컨트롤러/브라우저의 동작과 동일합니다. - 플레이어의 첫 번째 재생 오류가 지속적인 맞춤 예외로 잘못 처리되는 버그 수정 이렇게 하면 애플리케이션이 복구되지 않습니다.
- 세션에서 처리하지 않는 일부 컨트롤러 변경사항으로 인해
IllegalStateExceptions가 발생할 수 있는 버그 수정 - 세션에서 처리하지 않는 컨트롤러 작업으로 인해 컨트롤러가 잘못된 상태로 남을 수 있는 버그 수정
- StrictMode 안전하지 않은 실행 위반 경고 수정(#2330)
- 기본 스레드와 다른 애플리케이션 스레드에서 플레이어를 실행할 때 기본 스레드에서
setSessionExtras를 호출하면IllegalStateException가 발생하는 버그를 수정했습니다(#2265). - 플레이어가 미디어 항목을 준비하거나 재생하지 않고 설정된 경우 알림이 자동으로 표시되지 않음(#2423https://github.com/androidx/media/issues/2423). 이 동작은
MediaSessionService.setShowNotificationForIdlePlayer를 통해 구성할 수 있습니다. - 전체 또는 선택한 컨트롤러에 맞춤
PlaybackException추가 MediaController에서 라이브 스트림을 탐색하면IllegalArgumentException가 발생하는 버그 수정- 라이브 스트림의 경우 Android Auto UI (및 플랫폼 미디어 세션의 이 정보를 사용하는 기타 컨트롤러)에서 위치 아티팩트를 방지하기 위해 플랫폼 미디어 컨트롤러의 재생 위치와 현재 항목에서 탐색하는 기능을 게시하지 않습니다(#1758).
- 기존
MediaBrowserServiceCompat에 연결된MediaBrowser의getLibraryRoot에 null을 전달하면NullPointerException가 생성되는 버그를 수정했습니다. - 맞춤 작업, 검색 결과 또는 getItem 요청을 전송하면
ClassNotFoundException와 함께 기존 세션 앱이 비정상 종료되는 버그를 수정했습니다. MediaItem.LocalConfiguration.uri가 플랫폼 세션의MediaMetadata에 공유되는 버그 수정 컨트롤러가 미디어를 다시 요청할 수 있도록 의도적으로 URI를 공유하려면MediaItem.RequestMetadata.mediaUri를 대신 설정하세요.
- UI:
LazyColumn과 같은 재사용 가능한 구성요소 내의PlayerSurface가 올바르게 작동하지 않는 버그를 수정합니다(#2493).- 초기 버튼 상태를 설정하는 것과 상태 변경사항 (예: 아이콘 모양 또는 사용 설정)을 관찰하는 것 사이에 간격이 발생하는 Compose 버그를 수정했습니다. 관찰 기간 외에 플레이어에 적용된 변경사항이 이제 선택됩니다(#2313).
SeekBackButtonState및SeekForwardButtonState의media3-ui-compose모듈에 상태 홀더와 컴포저블을 추가합니다.PlayerControlView에 ExoPlayer의 스크러빙 모드 지원 추가 사용 설정하면 사용자가 스크러버 바를 드래그하기 시작할 때 플레이어가 스크러빙 모드로 전환되고, 움직일 때마다player.seekTo호출이 실행된 후 터치가 화면에서 떨어지면 스크러빙 모드가 종료됩니다. 이 통합은 XML의time_bar_scrubbing_enabled = true또는 Java/Kotlin의setTimeBarScrubbingEnabled(boolean)메서드를 사용하여 사용 설정할 수 있습니다.PlayerSurface가 null을 허용하는Player인수를 허용하도록 합니다.
- 다운로드:
- 프로그레시브 스트림의 부분 다운로드 지원 추가 앱은
DownloadHelper로 프로그레시브 스트림을 준비하고 다운로드에서 다뤄야 하는 시간 기반 미디어 시작 및 종료 위치를 지정하여 도우미에서DownloadRequest를 요청할 수 있습니다. 반환된DownloadRequest는 확인된 바이트 범위를 전달하며, 이를 통해ProgressiveDownloader를 만들어 이에 상응하는 콘텐츠를 다운로드할 수 있습니다. - 정적
DownloadHelper.forMediaItem()메서드가 대체되는DownloadHelper.Factory를 추가합니다. SegmentDownloader구현을 위해Factory추가- 적응형 스트림의 부분 다운로드 지원 추가 앱은
DownloadHelper로 적응형 스트림을 준비하고 다운로드에서 다뤄야 하는 시간 기반 미디어 시작 및 종료 위치를 지정하여 도우미에서DownloadRequest를 요청할 수 있습니다. 반환된DownloadRequest는 해결된 시간 범위를 전달하며, 이를 통해 구체적인SegmentDownloader를 만들고 이에 따라 콘텐츠를 다운로드할 수 있습니다.
- 프로그레시브 스트림의 부분 다운로드 지원 추가 앱은
- Cronet 확장 프로그램:
- 자동 쿠키 처리 추가(#5975)
- HLS 확장 프로그램:
- 버퍼에 사용 가능한 청크가 없는 경우
HlsSampleStreamWrapper가 버퍼 내부에서 탐색을 시도하는 버그 수정 #2598 - 지연 시간이 짧은 파트를 로드한 후 트랙 선택이 변경되고 미리 로드 힌트로 인해 재생이 멈추거나 중단될 수 있는 버그를 수정했습니다(#2299).
- 서버에서
CAN-BLOCK-RELOAD=YES를 따르지 않는 경우 타겟 기간의 절반을 기다려 과도한 새로고침 방지(#2317) - 미드롤 전에 인앱 광고 스트림을 시작할 때 재생이 중단되고 잘못된 광고에 대해 미드롤 및 애셋 목록 해결이 시도되는 버그를 수정했습니다 (#2558).
- 인용된 문자열 속성 값에서
\f(양식 피드)를 허용하도록 재생목록 파싱을 수정합니다(#2420). - 동일한 ID로 인터스티셜 업데이트 지원(#2427)
- 라이브 스트림에 로드할 세그먼트가 소진되면 재생목록 로드 오류가 전파되지 않는 버그를 수정했습니다(#2401https://github.com/androidx/media/issues/2401).
- 오디오 변환이 이미 그룹화된 방식과 유사하게 NAME 태그별로 자막 변환을 그룹화합니다(#1666).
HlsInterstitialsAdsLoader를 사용하여 X-ASSET-LIST 및 라이브 스트림 지원
- 버퍼에 사용 가능한 청크가 없는 경우
- DASH 확장 프로그램:
- RTSP 확장 프로그램:
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1 등):
- 오디오 디코더 확장 프로그램에
DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange이 적용되지 않는 버그를 수정했습니다(#2258).
- 오디오 디코더 확장 프로그램에
- Cast 확장 프로그램:
- 테스트 유틸리티:
- 지정된 위치에 도달할 때까지 플레이어를 앞으로 이동하기 위해
TestPlayerRunHelper에advance(player).untilPositionAtLeast및untilMediaItemIndex을 추가합니다. 대부분의 경우 이러한 메서드는 기존untilPosition및untilStartOfMediaItem메서드보다 더 안정적입니다. - 다른 테스트에서 재사용할 수 있도록
FakeDownloader를test-utils-robolectric모듈로 이동 transformer.TestUtil.addAudioDecoders(String...),transformer.TestUtil.addAudioEncoders(String...),transformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...)가 삭제되었습니다. 대신ShadowMediaCodecConfig를 사용하여 섀도우 인코더와 디코더를 구성하세요.ShadowMediaCodecConfig에서 보고한 코덱 이름의 'exotest' 접두사를 'media3'으로 바꿨습니다.
- 지정된 위치에 도달할 때까지 플레이어를 앞으로 이동하기 위해
- 지원 중단된 기호 삭제:
- 지원 중단된
SegmentDownloader생성자SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor)와 서브클래스DashDownloader,HlsDownloader,SsDownloader의 해당 생성자가 삭제되었습니다. - 지원 중단된
Player.hasNext(),Player.hasNextWindow()이 삭제되었습니다. 대신Player.hasNextMediaItem()를 사용하세요. - 지원 중단된
Player.next()이 삭제되었습니다. 대신Player.seekToNextMediaItem()를 사용하세요. - 지원 중단된
Player.seekToPreviousWindow()이 삭제되었습니다. 대신Player.seekToPreviousMediaItem()를 사용합니다. - 지원 중단된
Player.seekToNextWindow()이 삭제되었습니다. 대신Player.seekToNextMediaItem()를 사용합니다. exoplayer모듈에서 지원 중단된BaseAudioProcessor가 삭제되었습니다.common모듈에서BaseAudioProcessor를 사용합니다.- 지원 중단된
MediaCodecVideoRenderer생성자MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider)를 삭제합니다.
- 지원 중단된
버전 1.8.0-rc02
2025년 7월 24일
1.8.0 정식 버전을 사용합니다.
버전 1.8.0-rc01
2025년 7월 16일
1.8.0 정식 버전을 사용합니다.
버전 1.8.0-beta01
2025년 7월 2일
1.8.0 정식 버전을 사용합니다.
버전 1.8.0-alpha01
2025년 5월 19일
1.8.0 정식 버전을 사용합니다.
버전 1.7.0
버전 1.7.1
2025년 5월 16일
이 버전은 1.6.1과 동일한 코드를 사용하며 실수로 안정 버전으로 태그된 알파 버전인 1.7.0보다 '최신' 버전으로 표시되도록 출시됩니다 (아래 참고).
버전 1.7.0
2025년 5월 16일
이 버전은 1.7.0-alpha01이어야 하지만 maven.google.com에서 실수로 1.7.0 (즉, 안정)로 태그되었습니다. 사용하지 마세요. 1.6.1을 유지하거나 1.7.1 (1.6.1과 동일한 코드 사용)로 업그레이드합니다.
버전 1.6.0
1.6.1
2025년 4월 14일
androidx.media3:media3-*:1.6.1이 출시되었습니다.
버전 1.6.1에 포함된 커밋을 확인하세요.
- 공통 라이브러리:
- 새
pitch값으로PlaybackParameters를 쉽게 복사할 수 있는PlaybackParameters.withPitch(float)메서드 추가(#2257)
- 새
- ExoPlayer:
- 다음 미디어 항목 초기화 중에 복구 가능한 렌더러 오류로 인해 미디어 항목 전환이 실패하는 문제 수정(#2229)
PreloadMediaSource가 준비되기 전에getBufferedDurationUs()를 호출하려고 할 때ProgressiveMediaPeriod가IllegalStateException를 발생시키는 문제 수정(#2315)- DASH, HLS, SmoothStreaming의 매니페스트 요청에서
CmcdData전송 수정 (#2253) - 광고 그룹이 삭제된 후에도
AdPlaybackState.withAdDurationsUs(long[][])을 사용할 수 있는지 확인합니다. 사용자는 삭제된 광고 그룹의 기간 배열을 전달해야 합니다. 이 배열은 비어 있거나 null일 수 있습니다(#2267).
- 추출기:
- MP4:
tkhd상자에서alternate_group를 파싱하고 각 트랙의Format.metadata에서Mp4AlternateGroupData항목으로 노출합니다(#2242).
- MP4:
- 오디오:
- 짧은 콘텐츠 재생목록을 재생할 때 위치가 멈출 수 있는 오프로드 문제를 수정했습니다(#1920).
- 세션:
- 플랫폼
MediaSession콜백의 집계 시간 제한을 500에서 100밀리초로 낮추고 앱이 이 값을 구성할 수 있도록 실험적 설정자를 추가합니다. - 사용자가 알림을 닫은 후 알림이 다시 표시되는 문제 수정 (#2302)
- 래핑된 플레이어가 실제로 비어 있을 때 세션에서 단일 항목 타임라인을 반환하는 버그 수정 이 문제는 래핑된 플레이어에
COMMAND_GET_TIMELINE가 제공되지 않지만COMMAND_GET_CURRENT_MEDIA_ITEM는 제공되고 래핑된 플레이어가 비어 있을 때 발생했습니다 (#2320). setForegroundServiceTimeoutMs과 같은 서비스와의 다른 상호작용 후MediaSessionService.setMediaNotificationProvider호출이 무시되는 버그를 수정했습니다(#2305).
- 플랫폼
- UI:
PlayerSurface이ExoPlayer.setVideoEffects및CompositionPlayer와 함께 작동하도록 사용 설정- 새
Player로PlayerSurface를 리컴포즈할 수 없는 버그 수정
- HLS 확장 프로그램:
- HLS 미디어의 경우
CmcdData에서 청크 지속 시간이 설정되지 않아 암호화된 미디어 세그먼트를 처리할 때 어설션 실패가 발생하는 문제 수정(#2312)
- HLS 미디어의 경우
- RTSP 확장 프로그램:
- RTSP 세션이 TCP를 사용하도록 구성하는 방법으로 RTSPT 스키마가 있는 URI 지원 추가(#1484)
- Cast 확장 프로그램:
- 재생목록 메타데이터 지원 추가(#2235)
1.6.0
2025년 3월 26일
androidx.media3:media3-*:1.6.0이 출시되었습니다.
버전 1.6.0에는 이 커밋이 포함되어 있습니다.
- 공통 라이브러리:
androidx.media의 동등한 클래스를 대체하도록AudioManagerCompat및AudioFocusRequestCompat추가- Kotlin을 1.9.20에서 2.0.20으로 업그레이드하고 Compose Compiler Gradle 플러그인을 사용합니다. KotlinX Coroutines 라이브러리를 1.8.1에서 1.9.0으로 업그레이드
Format.toBundle(boolean excludeMetadata)메서드를 삭제하고 대신Format.toBundle()을 사용합니다.nullMediaMetadata로setPlaylist후State에서 새currentMediaItemIndex을 설정하면 메타데이터가 재평가되지 않는SimpleBasePlayer의 버그를 수정했습니다(#1940).- 다른 클래스에서 업데이트를 더 쉽게 처리할 수 있도록
SimpleBasePlayer.State액세스를 보호에서 공개로 변경합니다(#2128).
- ExoPlayer:
- 플랫폼
MediaExtractor과 동일한 기능을 제공하는 새 클래스MediaExtractorCompat를 추가합니다. MediaCodecVideoRenderer를 사용한 재생을 위해 실험적인 'ExoPlayer' 사전 워밍 지원을 추가합니다.experimentalSetEnableMediaCodecVideoRendererPrewarming을 통해DefaultRenderersFactory를 구성하여ExoPlayer에 보조MediaCodecVideoRenderer를 제공할 수 있습니다. 사용 설정된 경우ExoPlayer는 재생 중에 연속 미디어 항목의 동영상을 사전 처리하여 미디어 항목 전환 지연 시간을 줄입니다.DefaultLoadControl에서bufferForPlaybackMs및bufferForPlaybackAfterRebufferMs의 기본값을 각각 1,000ms 및 2,000ms로 줄입니다.DeviceInfo및 기기 볼륨을 비동기식으로 초기화합니다 (setDeviceVolumeControlEnabled를 사용하여 사용 설정된 경우). 이러한 값은ExoPlayer.Builder.build()후 즉시 사용할 수 없으며Player.Listener는onDeviceInfoChanged및onDeviceVolumeChanged를 통해 변경사항을 알립니다.- 플레이어를 만든 후 초기 오디오 세션 ID를 더 이상 즉시 사용할 수 없습니다. 필요한 경우
AnalyticsListener.onAudioSessionIdChanged를 사용하여 초기 업데이트를 수신 대기할 수 있습니다. - 동영상 트랙을 선택할 때 언어를 고려하세요. 기본적으로 선택한 오디오 트랙의 언어와 일치하는 '기본' 동영상 트랙을 선택합니다(있는 경우). 명시적인 동영상 언어 환경설정은
TrackSelectionParameters.Builder.setPreferredVideoLanguage(s)로 표현할 수 있습니다. DefaultTrackSelector.selectVideoTrack()메서드에selectedAudioLanguage매개변수를 추가합니다.retryCount매개변수를MediaSourceEventListener.onLoadStarted및 상응하는MediaSourceEventListener.EventDispatcher메서드에 추가- 실제 콘텐츠와 일치하지 않는 재생 시간의 멀티 기간 DASH 스트림에 있는 재생목록 항목 또는 기간으로 인해 항목 끝에서 프레임이 멈출 수 있는 버그를 수정했습니다(#1698).
BasePreloadManager.Listener을 최상위PreloadManagerListener로 이동RenderersFactory.createSecondaryRenderer는 예열을 위한 보조 렌더러를 제공하기 위해 구현할 수 있습니다. 사전 워밍을 사용하면 재생 중에 미디어 항목 전환이 더 빨라집니다.- 적응형 스트리밍 형식 DASH, HLS, SmoothStreaming에서 매니페스트 요청에
CmcdData전송 사용 설정(#1951) MediaCodecRenderer.onReadyToInitializeCodec에서 초기화될 코덱의MediaCodecInfo를 제공합니다(#1963).- 광고 그룹을 추가하여
AdPlaybackStates이 증가할 수 있도록AdsMediaSource을 변경합니다. 잘못된 수정사항이 감지되어 예외가 발생합니다. - 미드롤 광고 후 콘텐츠 미디어로 전환할 때 추가 디코딩 전용 프레임이 연속으로 표시될 수 있는 문제 수정
- 앱이 기본적으로 두 가지 다른 메타데이터 스키마를 수신할 수 있도록
DefaultRenderersFactory가 두 개의MetadataRenderer인스턴스를 추가하도록 합니다. - 재생이 일시중지될 때 진행 중인 청크 로드를 취소해야 하는지 재평가합니다(#1785).
- 탐색 불가능한 미디어에서 클리핑을 허용하는
ClippingMediaSource옵션 추가 - 사전 워밍으로 탐색하면 다음 미디어 항목 전환이 차단될 수 있는 버그 수정
ExoPlayer.isLoading()이STATE_IDLE또는STATE_ENDED로 전환되었는데도true로 유지되는 버그를 수정했습니다(#2133).LoadControl.Parameter에lastRebufferRealtimeMs추가(#2113)
- 플랫폼
- 변환기:
- 이전 버전과 호환되는 대체 형식으로 트랜스먹싱 지원 추가
- Dolby Vision (프로필 8) 형식의 트랜스코딩 및 트랜스먹싱 지원 추가
Format를 사용하도록VideoFrameProcessor.registerInputStream및VideoFrameProcessor.Listener.onInputStreamRegistered의 매개변수를 업데이트합니다.DefaultEncoderFactory사용 시 HDR 정적 메타데이터를 생성합니다.MediaMetricsManager를 사용하여 Android 플랫폼 진단 지원을 사용 설정합니다. 트랜스포머는 수정 이벤트 및 성능 데이터를 플랫폼에 전달하여 기기의 시스템 성능 및 디버깅 정보를 제공하는 데 도움을 줍니다. 기기 사용자가 사용 및 진단 데이터를 공유하도록 설정한 경우 Google이 이 데이터를 수집할 수도 있습니다. 앱은Transformer.Builder.setUsePlatformDiagnostics(false)를 사용하여 트랜스포머의 플랫폼 진단에 기여하는 옵션을 선택 해제할 수 있습니다.InAppMuxer를InAppMp4Muxer및InAppFragmentedMp4Muxer로 분할합니다.InAppMp4Muxer는 조각화되지 않은 MP4 파일을 생성하는 데 사용되고InAppFragmentedMp4Muxer는 조각화된 MP4 파일을 생성하는 데 사용됩니다.Muxer인터페이스를media3-muxer에서media3-transformer로 이동- 화면 녹화를 위해
MediaProjection에서 미디어를 제공하는MediaProjectionAssetLoader를 추가하고 트랜스포머 데모 앱에 화면 녹화 지원을 추가합니다. Codec인터페이스에#getInputFormat()추가- 가능한 경우
GlObjectsProvider해제 책임을DefaultVideoFrameProcessor및DefaultVideoCompositor의 호출자에게 이전합니다.
- 추출기:
- AVI: 스트림 헤더에 청크 수가 아닌 바이트 수가 저장된 일정한 비트 전송률 압축 오디오가 있는 파일 처리 수정
- 길이가 4바이트가 아닌 1바이트 또는 2바이트로 표현된 NAL 단위 처리 수정
- 수정 목록이 이전 동기화 프레임 없이 동기화되지 않은 프레임에서 시작될 때 MP4 수정 목록의
ArrayIndexOutOfBoundsException수정(#2062) - 일부 기기에서 TS 스트림이 멈출 수 있는 문제 수정(#2069)
- FLAC: 32비트 FLAC 파일 지원 추가 이전에는
IllegalStateException: Playback stuck buffering and not loading로 재생되지 않았습니다 (#2197).
- 오디오:
- 재생이 재개될 때 호출되도록
onAudioPositionAdvancing수정(이전에는 재생이 일시중지될 때 호출됨) SpeedChangingAudioProcessor이 기본 매개변수로 구성된 경우SonicAudioProcessor를 우회하지 마세요.DefaultAudioSink이 멈출 수 있는Sonic#getOutputSize()의 언더플로 수정- 탐색이 제공된 기간을 올바르게 재설정하도록
MediaCodecAudioRenderer.getDurationToProgressUs()및DecoderAudioRenderer.getDurationToProgressUs()수정 androidx.media3.common.audio.SonicAudioProcessor를 final로 설정ChannelMappingAudioProcessor및TrimmingAudioProcessor에 부동 PCM 지원 추가
- 재생이 재개될 때 호출되도록
- 동영상:
- 애플리케이션이 자리표시자 표면의 사용을 차단하도록 재정의할 수 있도록
MediaCodecVideoRenderer.shouldUsePlaceholderSurface를 보호로 변경합니다(#1905). - 탐색 속도를 높이기 위해 실험용
ExoPlayerAV1 샘플 종속 항목 파싱을 추가했습니다. 새DefaultRenderersFactory.experimentalSetParseAv1SampleDependenciesAPI를 사용하여 사용 설정합니다. - 종속되지 않은 후반
MediaCodecVideoRenderer디코더 입력 버퍼를 삭제하는 실험용ExoPlayerAPI 추가DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs로 사용 설정합니다. - 표면이 없는 플레이어가 즉시 준비되고 대기 중인 프레임을 매우 느리게 디코딩하는 문제 수정(#1973)
- 화면 깜박임을 방지하기 위해 분리된 화면 모드에서 Xiaomi 및 OPPO 기기를 제외합니다(#2059).
- 애플리케이션이 자리표시자 표면의 사용을 차단하도록 재정의할 수 있도록
- 텍스트:
- VobSub 자막 지원 추가(#8260)
MediaItem.Builder.setSubtitleConfigurations로 구성된 모든 자막 파일을 적극적으로 로드하는 것을 중지하고 트랙 선택으로 선택된 경우에만 하나를 로드합니다(#1721).- TTML:
style를 사용하여tts:origin및tts:extent참조 지원 추가 (#2953) - WebVTT 및 SubRip 타임스탬프를 정확히 소수점 셋째 자리로 제한합니다. 이전에는 소수점 이하 자릿수를 잘못 파싱했지만 항상 값이 밀리초 단위라고 가정하여 타임스탬프가 잘못되었습니다(#1997).
- 재생목록에 CEA-608 또는 CEA-708 자막이 있는 클립 항목이 포함된 경우 재생이 멈추는 문제 수정
- SSA 파일에 지속 시간이 0인 큐 (시작 시간과 종료 시간이 동일함)가 포함된 경우
IllegalStateException수정(#2052) - 자막이 오디오 및 동영상과 동일한 컨테이너에 멀티플렉싱되는 경우 자막 파싱 오류를 억제하고 로깅합니다(#2052).
- CR 줄바꿈을 사용하는 WebVTT 파일에서 멀티바이트 UTF-8 문자 처리 수정 (#2167)
- DRM:
- API 27 미만 기기에서 ClearKey 콘텐츠를 재생할 때 발생하는
MediaCodec$CryptoException: Operation not supported in this configuration오류를 수정합니다(#1732).
- API 27 미만 기기에서 ClearKey 콘텐츠를 재생할 때 발생하는
- 효과:
OverlaySettings의 기능을StaticOverlaySettings로 이동했습니다.OverlaySettings는 동적 오버레이 설정을 허용하도록 서브클래스를 지정할 수 있습니다.
- Muxers:
- 정규화된 이름이 너무 길어지는 것을 방지하기 위해
Muxer인터페이스에서MuxerException를 이동했습니다. Mp4Muxer.Builder와FragmentedMp4Muxer.Builder에서setSampleCopyEnabled()메서드의 이름을setSampleCopyingEnabled()로 변경했습니다.- 이제
Mp4Muxer.addTrack()및FragmentedMp4Muxer.addTrack()은TrackToken대신int트랙 ID를 반환합니다. Mp4Muxer및FragmentedMp4Muxer이 더 이상Muxer인터페이스를 구현하지 않습니다.- 기본적으로
Mp4Muxer샘플 일괄 처리 및 복사를 사용 중지합니다. - 오디오 트랙만 작성될 때 많은 프래그먼트를 생성하는
FragmentedMp4Muxer의 버그 수정
- 정규화된 이름이 너무 길어지는 것을 방지하기 위해
- 세션:
- 재생이 일시중지되거나 중지되거나 실패할 때 포그라운드 서비스 상태를 10분 더 유지합니다. 이를 통해 사용자는 다양한 기기에서 포그라운드 서비스 제한의 위험 없이 이 제한 시간 내에 재생을 재개할 수 있습니다.
onTaskRemoved를 재정의할 때stopSelf()전에 포그라운드 서비스를 중지하는 데player.pause()호출을 더 이상 사용할 수 없습니다. 대신MediaSessionService.pauseAllPlayersAndStopSelf()를 사용하세요. - 재생이 오류 또는 중지 상태로 전환될 때 알림을 표시된 상태로 유지합니다. 재생목록이 삭제되거나 플레이어가 해제된 경우에만 알림이 삭제됩니다.
- 사용 가능한 명령에 따라 하나만 설정하고 하나만 설정된 경우에도 허용하도록 Android 플랫폼 MediaSession 작업 ACTION_PLAY 및 ACTION_PAUSE의 처리 개선
MediaButtonReceiver.shouldStartForegroundService에Context를 매개변수로 추가합니다(#1887).- 레거시 세션에 연결된
MediaController에서Player메서드를 호출하면 대기 중인 업데이트의 변경사항이 삭제되는 버그 수정 MediaSession.setSessionActivity(PendingIntent)가 null을 허용하도록 합니다(#2109).- 재생목록이 지워질 때 오래된 알림이 표시된 상태로 유지되는 버그를 수정합니다 (#2211).
- 재생이 일시중지되거나 중지되거나 실패할 때 포그라운드 서비스 상태를 10분 더 유지합니다. 이를 통해 사용자는 다양한 기기에서 포그라운드 서비스 제한의 위험 없이 이 제한 시간 내에 재생을 재개할 수 있습니다.
- UI:
PlayerSurface,PresentationState,PlayPauseButtonState,NextButtonState,PreviousButtonState,RepeatButtonState,ShuffleButtonState,PlaybackSpeedState의media3-ui-compose모듈에 상태 보유자 및 컴포저블 추가
- 다운로드:
- 데이터 소스가
IOException이외의Exception를 발생시키는 경우 데이터 소스가 열려 있고 캐시 영역이 잠겨 있는CacheWriter의 버그를 수정합니다(#9760).
- 데이터 소스가
- HLS 확장 프로그램:
HlsInterstitialsAdsLoader의 첫 번째 버전을 추가합니다. 광고 로더는 HLS 미디어 재생목록의 HLS 전면 광고를 읽고 이를AdsMediaSource에 전달되는AdPlaybackState에 매핑합니다. 이 초기 버전은X-ASSET-URI속성이 있는 HLS VOD 스트림만 지원합니다.HlsInterstitialsAdsLoader.AdsMediaSourceFactory를 추가합니다. 앱은 이를 사용하여 편리하고 안전한 방식으로HlsInterstitialsAdsLoader를 사용하는AdsMediaSource인스턴스를 만들 수 있습니다.- HLS 재생목록에서
SUPPLEMENTAL-CODECS태그를 파싱하여 Dolby Vision 형식을 감지합니다 (#1785). - HLS 스트림에서 동기화된 위치를 탐색하기 위한 조건을 완화합니다(#2209).
- DASH 확장 프로그램:
- DASH에 AC-4 레벨 4 형식 지원 추가(#1898)
- 다중 기간 라이브 스트림에서 광고 삽입의 업데이트 간격을 계산할 때 발생하는 문제 수정(#1698)
- DASH 매니페스트에서
scte214:supplementalCodecs속성을 파싱하여 Dolby Vision 형식을 감지합니다(#1785). - 선언된 기간을 초과하는 미디어 샘플이 기간에 포함된 라이브 스트림에서 기간 전환 처리를 개선합니다(#1698).
adaptation-set-switching로 표시되었지만 언어나 역할 플래그가 다른 적응 세트가 병합되는 문제 수정(#2222)
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1 등):
- 내장 MPEG-H 디코더를 사용하여 MPEG-H 오디오를 디코딩하는 MPEG-H 디코더 모듈 추가(#1826)
- MIDI 확장 프로그램:
- 맞춤
AudioSink및AudioRendererEventListener인스턴스를MidiRenderer에 연결
- 맞춤
- Cast 확장 프로그램:
- Google Play 서비스가 설치되어 있지만 사용 중지된 기기에서 API 34 이상을 타겟팅하는 앱의
FLAG_MUTABLE비정상 종료를 수정하기 위해play-services-cast-framework종속 항목을 21.5.0으로 올립니다(#2178).
- Google Play 서비스가 설치되어 있지만 사용 중지된 기기에서 API 34 이상을 타겟팅하는 앱의
- 데모 앱:
- 추가 버튼으로
demo-compose확장 및 스케일링과 셔터 지원으로PlayerSurface통합 개선
- 추가 버튼으로
- 지원 중단된 기호 삭제:
- 지원 중단된
AudioMixer.create()메서드 삭제 대신DefaultAudioMixer.Factory().create()를 사용합니다. - 지원 중단된 다음
Transformer.Builder메서드를 삭제합니다.setTransformationRequest(), 대신setAudioMimeType(),setVideoMimeType(),setHdrMode()를 사용하세요.setAudioProcessors()를 사용하여EditedMediaItem.Builder.setEffects()에서 오디오 프로세서를 설정하고Transformer.start()에 전달합니다.setVideoEffects()에서 동영상 효과를 설정하고EditedMediaItem.Builder.setEffects()에 전달한 후Transformer.start()에 전달하세요.setRemoveAudio(), 대신EditedMediaItem.Builder.setRemoveAudio()를 사용하여Transformer.start()에 전달된EditedMediaItem에서 오디오를 삭제하세요.setRemoveVideo()의 경우EditedMediaItem.Builder.setRemoveVideo()를 사용하여Transformer.start()에 전달된EditedMediaItem에서 동영상을 삭제하세요.setFlattenForSlowMotion(): 대신EditedMediaItem.Builder.setFlattenForSlowMotion()를 사용하여Transformer.start()에 전달된EditedMediaItem를 평면화하세요.setListener(), 대신addListener(),removeListener()또는removeAllListeners()를 사용하세요.
- 지원 중단된 다음
Transformer.Listener메서드를 삭제합니다.onTransformationCompleted(MediaItem), 대신onCompleted(Composition, ExportResult)을 사용하세요.onTransformationCompleted(MediaItem, TransformationResult), 대신onCompleted(Composition, ExportResult)을 사용하세요.onTransformationError(MediaItem, Exception), 대신onError(Composition, ExportResult, ExportException)을 사용하세요.onTransformationError(MediaItem, TransformationException), 대신onError(Composition, ExportResult, ExportException)을 사용하세요.onTransformationError(MediaItem, TransformationResult, TransformationException), 대신onError(Composition, ExportResult, ExportException)를 사용하세요.onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest), 대신onFallbackApplied(Composition, TransformationRequest, TransformationRequest)를 사용하세요.
- 지원 중단된
TransformationResult클래스 삭제 대신ExportResult를 사용하세요. - 지원 중단된
TransformationException클래스 삭제 대신ExportException를 사용하세요. - 지원 중단된
Transformer.PROGRESS_STATE_NO_TRANSFORMATION삭제 대신Transformer.PROGRESS_STATE_NOT_STARTED를 사용합니다. - 지원 중단된
Transformer.setListener()삭제 대신Transformer.addListener(),Transformer.removeListener()또는Transformer.removeAllListeners()를 사용하세요. - 지원 중단된
Transformer.startTransformation()삭제 대신Transformer.start(MediaItem, String)를 사용합니다. - 지원 중단된
SingleFrameGlShaderProgram삭제 대신BaseGlShaderProgram를 사용합니다. Transformer.flattenForSlowMotion가 삭제됩니다. 대신EditedMediaItem.flattenForSlowMotion를 사용합니다.ExoPlayer.VideoComponent,ExoPlayer.AudioComponent,ExoPlayer.TextComponent,ExoPlayer.DeviceComponent가 삭제되었습니다.androidx.media3.exoplayer.audio.SonicAudioProcessor을 삭제했습니다.- 지원 중단된 다음
DownloadHelper메서드가 삭제되었습니다.- 생성자
DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]), 대신DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList)사용 getRendererCapabilities(RenderersFactory)의 경우RenderersFactory로DefaultRendererCapabilitiesList을 만들고DefaultRendererCapabilitiesList.getRendererCapabilities()를 호출하여 동일한 기능을 구현할 수 있습니다.
- 생성자
PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat)메서드가 삭제되었습니다.PlayerNotificationManager.setMediaSessionToken(MediaSession.Token)를 사용하고(MediaSession.Token) compatToken.getToken()에 전달하세요.
- 지원 중단된
1.6.0-rc02
2025년 3월 19일
1.6.0 정식 버전을 사용합니다.
1.6.0-rc01
2025년 3월 12일
1.6.0 정식 버전을 사용합니다.
1.6.0-beta01
2025년 2월 26일
1.6.0 정식 버전을 사용합니다.
버전 1.6.0-alpha03
2025년 2월 6일
1.6.0 정식 버전을 사용합니다.
버전 1.6.0-alpha02
2025년 1월 30일
1.6.0 정식 버전을 사용합니다.
버전 1.6.0-alpha01
2024년 12월 20일
1.6.0 정식 버전을 사용합니다.
버전 1.5
버전 1.5.1
2024년 12월 19일
androidx.media3:media3-*:1.5.1이 출시되었습니다.
버전 1.5.1에는 이러한 커밋이 포함되어 있습니다.
- ExoPlayer:
- 이 플랫폼 API에서 보고된 코덱 타임아웃 문제를 방지하기 위해 MediaCodec에서 비동기 복호화 사용을 사용 중지합니다(#1641).
- 추출기:
- MP3:
VBRI프레임의 목차가 파일의 모든 MP3 데이터를 포함하지 않는 경우 재생을 일찍 중지하면 안 됩니다(#1904).
- MP3:
- 동영상:
onOutputFormatChanged처리 시 제공된 경우MediaCodecAdapter제공 픽셀 가로세로 비율 값 사용 롤백(#1371)
- 텍스트:
timeUs에서 활성 상태인 (시작되었지만 아직 종료되지 않음) 큐가 잘못 삭제되는ReplacingCuesResolver.discardCuesBeforeTimeUs의 버그를 수정했습니다 (#1939).
- 메타데이터:
- Vorbis 주석에서 디스크/트랙 번호와 장르를
MediaMetadata로 추출합니다(#1958).
- Vorbis 주석에서 디스크/트랙 번호와 장르를
버전 1.5.0
2024년 11월 27일
androidx.media3:media3-*:1.5.0이 출시되었습니다.
버전 1.5.0에는 이러한 커밋이 포함되어 있습니다.
- 공통 라이브러리:
- 전체 일관성과 리스너 처리를 보장하면서 약간의 조정으로 다른 플레이어로 전달할 수 있는
ForwardingSimpleBasePlayer추가(#1183) SimpleBasePlayer.State.playlist를getPlaylist()메서드로 바꿉니다.- 재생목록 구조를 빌드하는 대신
Timeline및 현재Tracks,Metadata을 직접 지정하도록SimpleBasePlayer.State.Builder.setPlaylist()재정의 추가 minSdk을 21 (Android Lollipop)로 늘립니다. 이는 다른 모든 AndroidX 라이브러리와 일치합니다.- 공통 라이브러리를 기반으로 빌드된 Kotlin 전용 기능을 제공하는
androidx.media3:media3-common-ktx아티팩트 추가 Player.listen정지 확장 함수를 추가하여Player.Events을media3-common-ktx라이브러리에 수신하는 코루틴을 실행합니다.- 런타임 클래스 확인 실패를 방지하도록 설계된 수동으로 아웃라인 처리된 내부 클래스에서
@DoNotInline주석을 삭제합니다. 최근 버전의 R8에서는 이제 런타임 실패를 방지하기 위해 이러한 호출을 자동으로 인라인 해제하므로 수동으로 인라인 해제할 필요가 없습니다. 라이브러리의 모든 Gradle 사용자는compileSdk = 35로 인해 이미 이 작업을 실행하는 R8 버전을 사용하는 Android Gradle 플러그인 버전을 사용해야 합니다. Gradle이 아닌 빌드 시스템을 사용하는 라이브러리 사용자는 런타임 클래스 확인 실패를 방지하기 위해 R8에 상응하는 축소/난독화 단계에서 유사한 자동 아웃라인 프로세스를 실행해야 합니다. 이 변경사항은 다른 AndroidX 라이브러리에서 이미 완료되었습니다.
- 전체 일관성과 리스너 처리를 보장하면서 약간의 조정으로 다른 플레이어로 전달할 수 있는
- ExoPlayer:
- 이제 모든 미디어 항목에 대해
MediaCodecRenderer.onProcessedStreamChange()를 호출할 수 있습니다. 이전에는 첫 번째 항목에 대해 호출되지 않았습니다.MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart()를 사용하여 이를 사용 설정합니다. - 오류가 발생할 때
PreloadMediaSource.PreloadControl구현이 작업을 실행할 수 있도록PreloadMediaSource.PreloadControl.onPreloadError추가 - 미리 로드 이벤트를 앱에 전파하도록
BasePreloadManager.Listener추가 - SNTP 클라이언트 제한 시간 변경 및 제한 시간 시 대체 주소 재시도 허용 (#1540)
- 필드가 항상 0이었으므로
MediaCodecAdapter.Configuration.flags을 삭제합니다. - 사용자가 Wear OS API 35 이상에서 재생을 위해 내장 스피커를 선택하도록 허용합니다 (기기에서 이를 지원한다고 광고하는 경우).
- 오디오 포커스 처리가 사용 설정될 때까지
Context.getSystemService(Context.AUDIO_SERVICE)에 대한 차단 호출을 지연합니다. 이렇게 하면 오디오 포커스 처리가 사용 설정되지 않은 경우 차단 호출이 실행되지 않습니다(#1616). - 로드에 실패한 경우 버퍼링된 시간에 관계없이 재생을 허용합니다(#1571).
- 개별 렌더러가 재생 준비를 허용하는 시점을 알리기 위해
AnalyticsListener.onRendererReadyChanged()추가 MediaCodec이 비동기 모드 (API 31 이상의 기본 동작)로 작동할 때MediaCodec.CryptoException이 '예기치 않은 런타임 오류'로 보고되는 문제 수정PreloadMediaSource.PreloadControl.onContinueLoadingRequested()를 사용하여bufferedPositionUs대신bufferedDurationUs를 전달합니다. 또한DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS를DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS로 변경합니다. 그러면 앱은 위치 대신 이 IntDef로 사전 로드해야 하는 해당 미디어 소스의 기본 시작 위치에서 특정 기간을 나타내는 값을 전달해야 합니다.- 모든 메서드 호출을 다른 렌더러로 전달하는
ForwardingRenderer구현을 추가합니다(1703). - 재생목록의 다음 항목에 대한 재생목록 미리 로드 추가 앱은
ExoPlayer.setPreloadConfiguration(PreloadConfiguration)를 적절히 호출하여 미리 로드를 사용 설정할 수 있습니다. 기본적으로 미리 로드는 사용 중지되어 있습니다. 선택한 경우 재생을 방해하지 않도록DefaultLoadControl는 플레이어가 재생을 위해 로드되지 않을 때만 미리 로드가 시작되고 계속되도록 제한합니다. 앱은LoadControl.shouldContinuePreloading()을 적절히 구현하여 이 동작을 변경할 수 있습니다 (예:DefaultLoadControl에서 이 메서드를 재정의하는 경우).LoadControl의 기본 구현은 앱이LoadControl의 맞춤 구현을 사용하는 경우 미리 로드를 사용 중지합니다. - 서브클래스 리스너의 이벤트를 호출할 수 있도록 메서드
MediaSourceEventListener.EventDispatcher.dispatchEvent()추가(1736) - 일관되게 공유된 구성으로
DefaultPreloadManager및ExoPlayer인스턴스를 빌드하는DefaultPreloadManager.Builder추가 DefaultLoadControl구현이ExoTrackSelection[]에서 스트림 유형을 가져올 수 있으므로LoadControl.onTracksSelected()에서Renderer[]매개변수를 삭제합니다.DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])를 지원 중단하고 재정의를 방지하기 위해 메서드를 final로 표시했습니다. 대신 새로운DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])를 사용해야 합니다.MergingMediaSource에서 보조 소스의MediaSourceEventListener이벤트를 보고합니다. 이로 인해 사이드로드된 자막 (MediaItem.LocalConfiguration.subtitleConfigurations로 추가된 자막)에 대해 로드 시작/오류/취소/완료 이벤트가 보고되므로AnalyticsListener에서 발생한 중복 로드 이벤트로 표시될 수 있습니다.- 자막 및 메타데이터 오류로 인해 재생이 완전히 중지되지 않도록 합니다.
대신 문제가 있는 트랙이 사용 중지되고 나머지 트랙의 재생이 계속됩니다(#1722).
- 새 자막 처리 (추출 중)에서 연결된 파싱 (예: 잘못된 자막 데이터) 및 로드 오류 (예: HTTP 404)는
onLoadError콜백을 통해 발생합니다. - 기존 자막 처리 (렌더링 중)에서는 연결된 로드 오류만
onLoadError콜백을 통해 발생하고 파싱 오류는 자동으로 무시됩니다 (이는 기존 동작임).
- 새 자막 처리 (추출 중)에서 연결된 파싱 (예: 잘못된 자막 데이터) 및 로드 오류 (예: HTTP 404)는
- 실제 콘텐츠와 일치하지 않는 재생 시간의 멀티 기간 DASH 스트림에 있는 재생목록 항목 또는 기간으로 인해 항목 끝에서 프레임이 멈출 수 있는 버그를 수정했습니다(#1698).
- 클라이언트가 다시 초기화된 후 마지막 업데이트 이후 경과된 최대 시간을 설정하는
SntpClient에 setter 추가(#1794)
- 이제 모든 미디어 항목에 대해
- 변환기:
Surface을 통해 트랜스포머에 동영상 데이터의 대기열 지정을 지원하는SurfaceAssetLoader추가ImageAssetLoader는IllegalStateException를 발생시키는 대신AssetLoader.onError를 통해 지원되지 않는 입력을 보고합니다.- 이미지 내보내기에
MediaItem.Builder.setImageDurationMs를 사용한 이미지 기간 설정을 필수사항으로 만듭니다. - 오디오 EditedMediaItem 시퀀스의 간격에 대한 내보내기 지원 추가
- 트랙 선택:
DefaultTrackSelector: 다른 요소가 동일한 경우 채널 기반 오디오보다 객체 기반 오디오를 선호합니다.
- 추출기:
Mp4Extractor및FragmentedMp4Extractor가 후속 샘플에서 참조로 사용되지 않는 H264 샘플을 식별하도록 허용AmrExtractor에서 색인 기반 탐색을 사용 설정하는 옵션 추가- 유효한 프레임 간에 128KB를 초과하는 MP3 파일을 잘린 것으로 처리합니다(잘못된 것으로 처리하지 않음). 즉, MP3 바이트 길이를 나타내는 다른 메타데이터가 없고 MP3 데이터가 아닌 데이터가 끝에 있는 파일은 이제
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}(#1563) 오류가 발생하는 대신 MP3 데이터 끝에서 재생이 중지됩니다. - MP4 파일에서 수정 목록을 처리할 때 키프레임이 아닌 미디어 시작 위치의 인트로 샘플 처리를 수정합니다(#1659).
Mp4Extractor및FragmentedMp4Extractor에서mdhd상자의 미디어 기간을 사용하여 프레임 속도 계산을 개선했습니다(#1531).- MP4 수정 목록에서
media_time의 잘못된 크기 조정을 수정합니다.segment_duration는 영화 타임스케일을 사용하여 이미 올바르게 조정되었지만 이제media_time는 MP4 형식 표준에 따라 트랙 타임스케일을 사용하여 올바르게 조정됩니다(#1792). - 편집 목록이 있는 MP4의
endIndices계산에서 순서가 잘못된 프레임 처리 (#1797) -1값을 처리하도록 MP4 파일의mdhd상자에서 미디어 재생 시간 파싱을 수정합니다 (#1819).- H.263 동영상의 MP4 파일에서
h263상자를 식별하는 지원 추가(#1821) - AC-4 레벨 4 ISO 기본 미디어 파일 형식 지원 추가(#1265)
- DataSource:
- API 수준 34 대신 버전 S 확장 프로그램 7부터 사용할 수 있도록
HttpEngineDataSource업데이트(#1262) DataSourceContractTest:DataSource.getUri()가 확인된 URI를 반환한다고 어설션합니다 (문서화됨). 요청된 URI와 다른 경우 테스트는 새DataSourceContractTest.TestResource.Builder.setResolvedUri()메서드를 사용하여 이를 나타낼 수 있습니다.DataSourceContractTest: '찾을 수 없음' 리소스로 인해open()호출이 실패한 후와 후속close()호출 전에DataSource.getUri()및getResponseHeaders()가 '열기' 값을 반환한다고 어설션합니다.DataSourceContractTest.getNotFoundResources()를 재정의하면 테스트 하위 클래스가 여러 '찾을 수 없음' 리소스를 제공하고 예상되는 헤더도 제공할 수 있습니다. 이를 통해 HTTP 404 (헤더 포함)와 '서버를 찾을 수 없음' (헤더 없음)을 구분할 수 있습니다.
- API 수준 34 대신 버전 S 확장 프로그램 7부터 사용할 수 있도록
- 오디오:
- 미디어에 있는 경우 코덱에서 CTA-2075 음량 메타데이터를 자동으로 구성합니다.
- 탐색 시 볼륨이 부드럽게 감소하는지 확인합니다.
- 탐색 중에 발생할 수 있는 팝 소리 수정
- Sonic의 시간 늘리기/피치 변경 알고리즘의 잘림 오류 누적 수정
- 출력 프레임이 삭제되는
SpeedChangingAudioProcessor의 버그 수정
- 동영상:
MediaCodecVideoRenderer는 렌더링되지도 않고 다른 샘플에서 참조로 사용되지도 않는 샘플의 디코딩을 피합니다.- API 35 이상에서는 이제
MediaCodecAdapter가configure에서nullSurface를 수신하고 코덱이 이를 지원하는 경우(MediaCodecInfo.detachedSurfaceSupported) 이전에 설정된Surface를 삭제하는 새 메서드detachOutputSurface를 호출할 수 있습니다. onOutputFormatChanged(#1371)을 처리할 때 제공된 경우MediaCodecAdapter제공된 픽셀 가로세로 비율 값을 사용합니다.- 60fps 보안 H264 스트림이 지원되지 않는 것으로 표시되는 Galaxy Tab S7 FE의 기기 문제에 대한 해결 방법 추가(#1619)
- 마지막 샘플 후 스트림 종료 신호를 반환하지 않고 멈추는 코덱의 해결 방법 추가
- 텍스트:
- 맞춤
VoiceSpan를 추가하고 WebVTT 음성 범위에 맞게 채웁니다(#1632). - 마이크로초로 표현되고
90,000MPEG 타임베이스로 곱해질 때 64비트long를 오버플로하는 매우 큰 자막 타임스탬프가 있는 HLS의 WebVTT가 표시되는지 확인합니다(#1763). - Dolby Vision 콘텐츠에서 CEA-608 자막 지원(#1820)
- CEA-608 자막이 사용 설정된 경우 DASH 다중 기간 스트림에서 재생이 멈추는 문제 수정 (#1863)
- 맞춤
- 메타데이터:
- icy 또는 vnd.dvb.ait 콘텐츠가 포함된 트랙에
C.TRACK_TYPE_METADATA유형을 할당합니다.
- icy 또는 vnd.dvb.ait 콘텐츠가 포함된 트랙에
- 이미지:
- Glide 또는 Coil과 같은 외부 이미지 로드 라이브러리와의 통합을 간소화하기 위해
ExternallyLoadedImageDecoder를 추가합니다.
- Glide 또는 Coil과 같은 외부 이미지 로드 라이브러리와의 통합을 간소화하기 위해
- DataSource:
FileDescriptor에서 읽는 데 사용할 수 있는 새로운DataSource인FileDescriptorDataSource추가(#3757)
- 효과:
- 사소한
SurfaceTexture확장용DefaultVideoFrameProcessor해결 방법 추가SurfaceTexture에는 잘린 버퍼의 가장자리 주위에 있는 1텍셀 테두리를 잘라내는 작은 스케일링이 포함될 수 있습니다. 이제 출력이 예상에 더 가깝도록 처리됩니다. DefaultVideoFrameProcessor.queueInputBitmap()속도를 높입니다. 따라서Transformer를 사용하여 이미지를 동영상으로 내보내는 속도가 더 빨라집니다.
- 사소한
- IMA 확장 프로그램:
- 재생목록을 지우면
ImaServerSideAdInsertionMediaSource에서ArrayIndexOutOfBoundsException가 발생할 수 있는 버그 수정 - 프리롤이 없는 서버 측 삽입 DAI 스트림을 마지막 미드롤 이후에 재생하면
ArrayIndexOutOfBoundsException가 발생하는 버그를 수정했습니다 (#1741).
- 재생목록을 지우면
- 세션:
- 이 메서드를 재정의하여 앱이 재생 재개를 위해 수신되는 재생 명령어를 억제할 수 있도록
MediaButtonReceiver.shouldStartForegroundService(Intent)추가 기본적으로 서비스는 항상 시작되며 시스템이ForegroundServiceDidNotStartInTimeException(#1528)로 서비스를 비정상 종료하지 않는 한 재생을 억제할 수 없습니다. - 기존 서비스에 연결될 때 메서드의
MediaBrowserServiceCompat변형 대신MediaSessionCompat.Callback에 디스패치되는MediaBrowser에서 전송된 맞춤 명령어를 야기하는 버그를 수정했습니다. 이로 인해MediaBrowser가 기존 서비스에서 다시 전송한 실제 반환 값을 수신할 수 없었습니다(#1474). - 미디어 버튼 인텐트의 브로드캐스트 리시버를 설정할 때 특정 제조업체의 기기에서 발생한
IllegalArgumentException처리 (#1730) - 미디어 항목의 명령어 버튼 추가 이렇게 하면
MediaBrowserCompat이 있는 기존 라이브러리와 함께Custom browse actions로 알려진 항목의 Media3 API가 추가됩니다. 미디어 항목용 Media3 명령어 버튼은MediaBrowser및MediaController모두에서 사용할 수 있습니다. 맞춤 탐색 작업 구현을 참고하세요. play()를 요청한 후 세션 앱이 포그라운드 서비스를 시작할 수 없는 경우가 있는 Media3 컨트롤러의 버그 수정- 콘텐츠 URI만 허용하도록
CommandButton.Builder.setIconUri제한 - 기존
MediaBrowserCompat에 연결할 때 Media3 브라우저의 연결 힌트를 초기MediaBrowserCompat에 전달 서비스는onGetRoot()에 대한 첫 번째 호출과 함께 루트 힌트로 전달된 연결 힌트를 수신할 수 있습니다. - 레거시 브라우저 서비스에 연결된
MediaBrowser가 브라우저가parentid를 구독한 후 서비스에서 전송한 오류를 수신하지 못하는 버그 수정 - 상위 항목을 구독할 때
parentId의 하위 항목을 두 번 요청하지 않도록 기존MediaBrowserService에 연결된 Media3 브라우저의 상호 운용성 동작 개선
- 이 메서드를 재정의하여 앱이 재생 재개를 위해 수신되는 재생 명령어를 억제할 수 있도록
- UI:
- XML 기반 공유 전환 관련 문제로 인해
PlayerView-in-Compose-AndroidView해결 방법에서 늘리거나 잘린 동영상을 선택합니다.AndroidView내에서PlayerView를 사용하는 앱은 선택하기 위해PlayerView.setEnableComposeSurfaceSyncWorkaround를 호출해야 합니다(#1237, #1594). - 온디맨드로 전체 화면 버튼의 아이콘을 업데이트할 수 있도록
PlayerView에setFullscreenButtonState추가(예: 클릭 상호작용에 반응하지 않고 대역 외)(#1590, #184) - 앱 정의 텍스트 트랙 선택 환경설정이 있는 경우 텍스트 선택의 '없음' 선택이 작동하지 않는 버그 수정
- XML 기반 공유 전환 관련 문제로 인해
- DASH 확장 프로그램:
- 세그먼트 중간에서 시작하는 기간 지원 추가(#1440)
- 원활한 스트리밍 확장 프로그램:
- 텍스트 트랙이 있는 SmoothStreaming 스트림을 재생할 때 발생하는
Bad magic number for Bundle오류를 수정했습니다(#1779).
- 텍스트 트랙이 있는 SmoothStreaming 스트림을 재생할 때 발생하는
- RTSP 확장 프로그램:
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1 등):
- libiamf 네이티브 라이브러리를 사용하여 오디오를 합성하는 IAMF 트랙이 포함된 MP4 파일의 재생을 지원하는 IAMF 디코더 모듈을 추가합니다.
- 재생은 스테레오 레이아웃과 공간화가 적용된 5.1로 사용 설정되며, 선택적으로 헤드 트래킹을 사용 설정할 수 있지만 현재 바이노럴 재생 지원은 제공되지 않습니다.
- Android 15에서 디코더 확장 프로그램의 16KB 페이지 지원 추가(#1685)
- libiamf 네이티브 라이브러리를 사용하여 오디오를 합성하는 IAMF 트랙이 포함된 MP4 파일의 재생을 지원하는 IAMF 디코더 모듈을 추가합니다.
- 전송 확장 프로그램:
- CastSession 연결이 해제된 후 타임라인 청소를 중지하여 발신자 앱이 연결 해제 후 로컬에서 재생을 재개할 수 있도록 합니다.
Context이 제공되면 CastPlayer의DeviceInfo채우기 이를 통해MediaSession를RoutingSession에 연결할 수 있으며 이는 출력 스위처를 통합하는 데 필요합니다(#1056).
- 테스트 유틸리티:
- 이제
DataSourceContractTest에는 다음을 확인하는 테스트가 포함됩니다.- 입력 스트림
read position이 업데이트됩니다. - 출력 버퍼
offset가 올바르게 적용됩니다.
- 입력 스트림
- 이제
- 데모 앱
- 데모 짧은 형식 앱의 메모리 누수 해결(#1839)
- 지원 중단된 기호 삭제:
- 지원 중단된
Player.hasPrevious,Player.hasPreviousWindow()삭제 대신Player.hasPreviousMediaItem()를 사용하세요. - 지원 중단된
Player.previous()메서드 삭제 대신Player.seekToPreviousMediaItem()를 사용합니다. - 지원 중단된
DrmSessionEventListener.onDrmSessionAcquired메서드 삭제 - 지원 중단된
DefaultEncoderFactory생성자가 삭제됩니다. 대신DefaultEncoderFactory.Builder를 사용합니다.
- 지원 중단된
버전 1.5.0-rc02
2024년 11월 19일
1.5.0 정식 버전을 사용합니다.
버전 1.5.0-rc01
2024년 11월 13일
1.5.0 정식 버전을 사용합니다.
버전 1.5.0-beta01
2024년 10월 30일
1.5.0 정식 버전을 사용합니다.
버전 1.5.0-alpha01
2024년 9월 10일
1.5.0 정식 버전을 사용합니다.
버전 1.4.0
버전 1.4.1
2024년 8월 27일
androidx.media3:media3-*:1.4.1이 출시되었습니다.
버전 1.4.1에는 이러한 커밋이 포함되어 있습니다.
- ExoPlayer:
- 추출기:
- MP3:
Info프레임의 길이 필드를 기반으로 후행 비MP3 데이터를 올바르게 무시하여Searched too many bytes오류 수정(#1480)
- MP3:
- 텍스트:
- TTML: 백분율
tts:fontSize값이 백분율tts:fontSize값을 갖는 상위 노드에서 올바르게 상속되도록 백분율tts:fontSize값의 처리 수정 - 요청된 출력 시작 시간이
Subtitle의 최종 이벤트 시간보다 크거나 같은 경우를 잘못 처리하여LegacySubtitleUtil의IndexOutOfBoundsException수정(#1516)
- TTML: 백분율
- DRM:
- L1 Widevine 콘텐츠를 재생하는 API 31 이상 기기에서
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE오류 수정 이 오류는 프레임워크MediaDrm.requiresSecureDecoder메서드 (#1603)의 불완전한 구현으로 인해 발생합니다.
- L1 Widevine 콘텐츠를 재생하는 API 31 이상 기기에서
- 효과:
GlObjectsProvider에release()메서드를 추가합니다.
- 세션:
- RTSP 확장 프로그램:
- SDP 파싱에서 잘못된 미디어 설명 건너뛰기(#1087)
버전 1.4.0
2024년 7월 25일
androidx.media3:media3-*:1.4.0이 출시되었습니다.
버전 1.4.0에는 이러한 커밋이 포함되어 있습니다.
- 공통 라이브러리:
- 작업 없음으로 간주되는 탐색 호출을 무시하는 대신 보호된
BasePlayer.seekTo()및SimpleBasePlayer.handleSeek()메서드로 전달 맞춤 플레이어에서 이러한 메서드를 구현하는 경우mediaItemIndex == C.INDEX_UNSET로 이러한 추가 호출을 처리해야 할 수 있습니다. - 향상된 Java 8 desugaring의 컴파일 종속성 삭제(#1312)
MediaItem.Builder.setImageDurationMs()에 전달된 기간이 이미지 외MediaItem에 대해 무시되는지 확인합니다 (문서화됨).Format인스턴스에 관한 앱 제공 맞춤 정보를 저장하기 위해Format.customData추가
- 작업 없음으로 간주되는 탐색 호출을 무시하는 대신 보호된
- ExoPlayer:
rankingData에 의해 정의된 우선순위에 따라 여러 소스의 미리 로드를 조정하는BasePreloadManager추가 이 클래스를 확장하여 맞춤설정할 수 있습니다.PreloadMediaSource를 사용하여 소스의 미디어 샘플을 메모리에 미리 로드하고 UI의 항목 색인을 나타내는 정수rankingData를 사용하는DefaultPreloadManager추가LoadControl구현이 여러 플레이어를 지원할 수 있도록LoadControl의 대부분의 메서드에PlayerId를 추가합니다.Buffer.isDecodeOnly()및C.BUFFER_FLAG_DECODE_ONLY이 삭제됩니다. 렌더러와 디코더가 타임스탬프에 따라 버퍼를 건너뛸지 결정하므로 이 플래그를 설정할 필요가 없습니다. 맞춤Renderer구현은 샘플을 표시할지 여부를 결정하기 위해 버퍼 시간이BaseRenderer.getLastResetPositionUs()이상인지 확인해야 합니다. 맞춤SimpleDecoder구현은 필요한 경우isAtLeastOutputStartTimeUs()를 확인하거나DecoderOutputBuffer.shouldBeSkipped로 다른 버퍼를 표시하여 건너뛸 수 있습니다.TargetPreloadStatusControl.getTargetPreloadStatus(T)에서 null 값이 반환되어 지정된rankingData로MediaSource을 미리 로드하지 않도록 허용remove(MediaSource)를BasePreloadManager에 추가합니다.BasePreloadManager에reset()를 추가하여 프리로드 관리자 인스턴스를 유지하면서 모든 보유 소스를 해제합니다.- API 35부터
PriorityTaskManager에 사용되고 MediaCodec 중요도에 사용되는 우선순위 값을 정의하는ExoPlayer.setPriority()(및Builder.setPriority()) 추가 - CMCD에서 잘못된
bs(버퍼 부족) 키가 발생하는 마지막 리버퍼링 시간 업데이트 문제를 수정했습니다(#1124). - 소스가 끝까지 로드되었음을 나타내기 위해
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)을 추가합니다. 이를 통해DefaultPreloadManager및 맞춤PreloadMediaSource.PreloadControl구현이 다음 소스를 미리 로드하거나 다른 작업을 실행할 수 있습니다. - 항목 끝에서 무음 건너뛰기로 인해 재생 예외가 트리거될 수 있는 버그 수정
clear을PreloadMediaSource에 추가하여 미리 로드 기간을 삭제합니다.- 우선순위가 더 높은 작업에 코덱 리소스가 회수될 때 사용되는 새 오류 코드
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED추가 AdsMediaSource가 초기 콘텐츠 미디어 준비가 완료되기 전에 프리롤 광고를 로드하도록 허용합니다(#1358).- 원래 기간이 이미 매니페스트에서 삭제된 후 다중 기간 DASH 라이브 스트림을 다시 준비할 때 재생이
STATE_ENDED로 이동하는 버그 수정 PreloadMediaSource.PreloadControl에서onTimelineRefreshed()을onSourcePrepared()으로,onPrepared()을onTracksSelected()로 바꿉니다.DefaultPreloadManager.Stage의 IntDefs 이름도 적절하게 바꿉니다.- 작업을 CPU 절전 모드 해제 주기와 더 잘 정렬하고 렌더러가 진행될 수 있을 때까지 절전 모드 해제를 지연하는 동적 예약에 대한 실험적 지원 추가
ExoPlayer 인스턴스를 설정할 때
experimentalSetDynamicSchedulingEnabled()를 사용하여 이를 사용 설정할 수 있습니다. Renderer.getDurationToProgressUs()를 추가합니다.Renderer는 이 메서드를 구현하여 렌더러가 진행되려면 재생이 진행되어야 하는 기간을 ExoPlayer에 반환할 수 있습니다.ExoPlayer이experimentalSetDynamicSchedulingEnabled()로 설정되면ExoPlayer은 작업 작업을 예약할 시간을 계산할 때 이 메서드를 호출합니다.MediaCodecRenderer에서 사용할 수 있는 입력 및 출력 버퍼가 있을 때 알리도록MediaCodecAdapter#OnBufferAvailableListener추가MediaCodecRenderer는 이러한 콜백을 수신할 때ExoPlayer에 신호를 보내고ExoPlayer이experimentalSetDynamicSchedulingEnabled()로 설정된 경우ExoPlayer은 렌더러가 진행할 수 있으므로 작업 루프를 예약합니다.- 개별 매개변수 대신
LoadControl메서드에 데이터 클래스를 사용합니다. Exoplayer.release()가 호출되었는지 확인하기 위해ExoPlayer.isReleased()추가seekToPrevious()이 이전 항목으로 탐색하는 최대 위치를 구성하는ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()추가 (#1425)- 플레이어가 일시중지된 동안 전체 또는 일시적 포커스 손실을 보고하지 않는 등 일부 오디오 포커스 불일치 수정(#1436)
- 초기 준비 단계 후에 추가 트랙을 보고하는 추출기로 인해 발생할 수 있는
IndexOutOfBoundsException수정(#1476) ExoPlayer.setVideoEffect()의Effects는 렌더러 오프셋이 삭제된 타임스탬프를 수신합니다(#1098).- 다른 재생목록 항목을 미리 읽는 중에 발생한 플레이어 오류를 처리할 때 발생할 수 있는
IllegalArgumentException수정(#1483)
- 변환기:
- 출력 파일의 각 트랙이 생성된 방식을 나타내는
audioConversionProcess및videoConversionProcess를ExportResult에 추가합니다. - 트림 최적화 H.264 수준 검사 완화
- 시퀀스에서 SDR과 HDR 입력 미디어 간 전환 지원 추가
- 컴포지션 수준 오디오 효과 지원 추가
- 울트라 HDR 이미지를 HDR 동영상으로 트랜스코딩하는 지원 추가
- 재설정되고 재사용된 후
DefaultAudioMixer이 올바른 바이트 수를 출력하지 않는 문제 수정 - PCM 입력을 처리할 때 오디오 채널 수가 스테레오로 제한되는 디코더 버그를 해결합니다.
ExoPlayerAssetLoader에서 트랙을 선택할 때는 오디오 채널 수 제약 조건을 무시하세요. 재생에만 적용되기 때문입니다.androidx.media3.transformer.Muxer인터페이스를androidx.media3.muxer.Muxer로 바꾸고androidx.media3.transformer.Muxer를 삭제합니다.- 콘텐츠 URI 스키마에서 HEIC 이미지 로드 수정 (#1373)
AudioGraphInput에서 오디오 트랙 재생 시간을 조정하여 AV 동기화를 개선합니다.ExportResult.processedInputs필드를 삭제합니다. 코덱 세부정보에 이 필드를 사용하는 경우DefaultDecoderFactory.listener를 대신 사용하세요. 코덱 예외의 경우 코덱 세부정보는ExportException.codecInfo에서 확인할 수 있습니다.
- 출력 파일의 각 트랙이 생성된 방식을 나타내는
- 추출기:
- MPEG-TS: 스트림의 마지막 액세스 단위를 샘플 대기열에 전달하여 마지막 프레임이 렌더링되도록 변경사항을 롤포워드합니다(#7909). I-frame 전용 HLS 스트림(#1150) 및 H.262 HLS 스트림(#1126)에서 발생한 문제를 해결하기 위한 수정사항이 통합되었습니다.
- MP3: 기본 스트림 (예: 파일 크기 또는 HTTP
Content-Length헤더)에서 보고한 크기보다Info프레임의 데이터 크기를 선호합니다. 이를 통해 재생할 수 없는 트레일러 데이터 (예: 앨범 아트)가 일정한 비트 전송률 탐색 계산에서 제외되어 탐색이 더 정확해집니다(#1376). - MP3:
Info프레임(있는 경우)의 프레임 수와 기타 데이터를 사용하여Info프레임 후 프레임의 비트 전송률에서 외삽하는 대신 고정 비트 전송률 탐색의 평균 비트 전송률을 계산합니다. 이는 인위적으로 작을 수 있습니다(예:PCUT프레임(#1376)). - AVI 컨테이너에서 PCM 오디오 형식 추출 수정
- 오디오:
- 패스 스루 재생을 위한 DTS:X 프로필 2 인코딩 속성 수정(#1299)
- 오프로드된 재생의 경우
AudioTrack.stop()를 호출하기 전에DefaultAudioSink에서 스트림 완료 추적 필드를 재설정하여AudioTrack.StreamEventCallback#onPresentationEnded가 대기 중인 모든 데이터가 재생된 시점을 올바르게 식별하도록 합니다. SilenceSkippingAudioProcessor에서 서로 다른 오디오 형식 (예: 스테레오에서 모노) 간 전환으로 인해 프로세서가 예외를 발생시킬 수 있는 버그를 수정했습니다(#1352).- MediaCodecAudioRenderer가 진행될 수 있는 시점에 ExoPlayer가 기본 작업 루프를 동적으로 예약하도록
MediaCodecAudioRenderer.getDurationToProgressUs()를 구현합니다.
- 동영상:
- 재생 중에 서페이스를 전환할 때
Listener.onRenderedFirstFrame()이 너무 일찍 도착하는 문제 수정 - 필요한 경우 호환되는 AV1 디코더를 사용하도록 Dolby Vision의 디코더 대체 로직을 수정합니다(#1389).
- 재생 중에 동영상 렌더러를 사용 설정하여 발생할 수 있는 코덱 예외 수정
- 재생 중에 서페이스를 전환할 때
- 텍스트:
- 탐색 위치 전에 시작되는 자막이 건너뛰어지는 문제 수정 이 문제는 Media3 1.4.0-alpha01에서만 도입되었습니다.
- 렌더링 중에 발생하는 대신 추출 중에 발생하도록 기본 자막 파싱 동작을 변경합니다 (추출과 렌더링의 차이는 ExoPlayer 아키텍처 다이어그램 참고).
- 이 변경사항은
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)와TextRenderer.experimentalSetLegacyDecodingEnabled(true)를 모두 호출하여 재정의할 수 있습니다. 이러한 구성요소를ExoPlayer인스턴스에 연결하는 방법은 맞춤설정 관련 문서를 참고하세요. 이러한 메서드와 기존 자막 디코딩 지원은 향후 출시에서 삭제될 예정입니다. - 맞춤
SubtitleDecoder구현이 있는 앱은 대신SubtitleParser(및SubtitleDecoderFactory대신SubtitleParser.Factory)를 구현하도록 업데이트해야 합니다.
- 이 변경사항은
- PGS:
0을 리터럴 색상 값(#1367)이 아닌 색상 색인으로 해석하도록 런 길이 디코딩 수정 - CEA-708:
rowLock값을 무시합니다. CEA-708-E S-2023 사양에 따르면 스트림에 있는 값과 관계없이rowLock와columnLock가 모두 true로 간주되어야 합니다 (columnLock지원은 구현되지 않았으므로 항상 false로 간주됨).- 이 변경사항은 원래
1.3.0-alpha01출시 노트에 포함되었지만1.3.0-rc01출시 전에 실수로 되돌려졌습니다. 이제 이 문제가 해결되어 변경사항이 다시 표시됩니다.
- 이 변경사항은 원래
- CEA-708: ExoPlayer의 '펜 위치 설정' 명령(#1315)에 대한 단순한 처리로 인해 중복된 줄바꿈이 추가되지 않도록 합니다.
- WebVTT 자막 샘플에 신호가 없는 경우(예: DASH 스트림의 일부)
LegacySubtitleUtil에서IllegalArgumentException수정(#1516)
- 메타데이터:
- 이미지:
- 정사각형이 아닌 DASH 썸네일 그리드 지원 추가(#1300)
- API 34 이상의 AVIF 지원 추가
- 이전에 설정된
ImageOutput를 삭제하기 위해ExoPlayer.setImageOutput()의 매개변수로null허용
- DataSource:
package이 현재 애플리케이션의 패키지와 다른 경우android.resource://package/id원시 리소스 URI 지원 구현 이전에는 작동한다고 문서화되지 않았지만 이름으로 액세스하는 것보다 다른 패키지의 리소스에 액세스하는 더 효율적인 방법입니다.DataSpec생성자에서url가 null이 아닌지 적극적으로 확인합니다. 이 매개변수는 이미 null이 아닌 것으로 주석이 달려 있습니다.ByteArrayDataSource가 생성 시 하드 코딩되는 대신open()중에 URI를 바이트 배열로 확인할 수 있도록 허용(#1405)
- DRM:
DefaultDrmSessionManagerProvider에서LoadErrorHandlingPolicy설정을 허용합니다(#1271).
- 효과:
SpeedChangeEffect에서 동일한EditedMediaItem또는Composition내에서 여러 속도 변경 지원- Ultra HDR 비트맵 입력에서 HLG 및 PQ 출력 지원
- ExoPlayer.setVideoEffect 및 Transformer의 디버그 SurfaceView에서 HLG 표면 출력을 개선하는 EGL_GL_COLORSPACE_BT2020_HLG_EXT 지원 추가
setOverlayFrameAnchor()에 적용된 x 및 y 값을 뒤집어 문서와 일치하도록 오버레이 매트릭스 구현을 업데이트합니다.OverlaySettings.Builder.setOverlayFrameAnchor()를 사용하는 경우 x 및 y 값에-1를 곱하여 값을 뒤집습니다.ExoPlayer#setVideoEffects와 함께 사용하면TimestampWrapper이 비정상 종료되는 버그를 수정했습니다(#821).- 기본 SDR 색상 작업 공간을 선형 색상에서 전기 BT 709 SDR 동영상으로 변경 원래 색상 공간을 유지하는 세 번째 옵션도 제공합니다.
- EditedMediaItemSequences의 불확실한 z-order 정의 허용(#1055)
- 다양한 HDR 콘텐츠에서 일관된 휘도 범위를 유지합니다 (HLG 범위 사용).
- HDR 콘텐츠에 울트라 HDR (비트맵) 오버레이 지원 추가
- API 26 전에
SeparableConvolution효과를 사용할 수 있도록 허용 - 오버레이와 프레임의 동적 범위가 일치해야 하므로 사용하지 않는
OverlaySettings.useHdr삭제 TextOverlay의 HDR 지원 추가 텍스트 오버레이의 휘도는OverlaySettings.Builder.setHdrLuminanceMultiplier()로 조정할 수 있습니다.
- IMA 확장 프로그램:
- 앱이 DAI 광고 스트림을 재생하는 데 필요한 API를 안정 버전으로 승격
- 런타임에 광고 태그 매개변수를 대체할 수 있는
ImaServerSideAdInsertionMediaSource.AdLoader에replaceAdTagParameters(Map <String, String>)추가 - 광고 재생 중에 플레이어 오류가 발생할 때
VideoAdPlayer.VideoAdPlayerCallback.onError()이 호출되지 않는 버그를 수정했습니다(#1334). data://광고 태그 URI를 사용할 때NullPointerException를 수정하기 위해 IMA SDK 버전을 3.33.0으로 범프합니다(#700).
- 세션:
CommandButton.enabled의 기본값을true로 변경하고 연결된 명령어를 사용할 수 있더라도 컨트롤러의 값이 false로 유지될 수 있는지 확인합니다.- 맞춤 아이콘 리소스 대신 사용해야 하는
CommandButton의 아이콘 상수 추가 - 앱이
onTaskRemoved()에서 서비스를 중지해야 하는지 쿼리할 수 있도록MediaSessionService.isPlaybackOngoing()추가(#1219) - 모든 세션의 재생을 일시중지하고
stopSelf()을 호출하여MediaSessionService의 수명 주기를 종료할 수 있는MediaSessionService.pauseAllPlayersAndStopSelf()을 추가합니다. MediaSessionService.onTaskRemoved(Intent)를 재정의하여 재생이 진행 중이면 서비스를 포그라운드에서 실행하고 그렇지 않으면 서비스를 중지하는 안전한 기본 구현을 제공합니다.- 플랫폼 세션 메타데이터에 재생 시간을 설정하지 않아 라이브 스트림의 미디어 알림에서 탐색 막대를 숨깁니다(#1256).
- 미디어1에서와 같이 메타데이터 속성을 선택할 때 동일한 기본 순서와 논리를 사용하도록
MediaMetadata를MediaDescriptionCompat로 변환합니다. - 심각하지 않은 오류를 Media3 컨트롤러로 전송할 수 있는
MediaSession.sendError()추가 알림 컨트롤러 (MediaSession.getMediaNotificationControllerInfo()참고)를 사용하는 경우 맞춤 오류는 지정된 오류 정보(#543)를 사용하여 플랫폼 세션의PlaybackState을 오류 상태로 업데이트하는 데 사용됩니다. - 특정 컨트롤러의 일련의 플레이어 상호작용이 완료된 시점을 세션에 알리도록
MediaSession.Callback.onPlayerInteractionFinished()추가 SessionError를 추가하고 오류 코드 대신SessionResult및LibraryResult에서 사용하여 오류에 관한 자세한 정보와 가능한 경우 오류 해결 방법을 제공합니다.- 미디어 세션을 게시하는 앱과의 상호작용을 테스트하는 데 사용할 수 있는 media3 컨트롤러 테스트 앱의 코드를 게시합니다.
- media3의
MediaSession[Builder].setSessionExtras()에 전달된 추가 항목을 media1 컨트롤러의PlaybackStateCompat.getExtras()에 전파 - 심각한 오류 및 심각하지 않은 오류를 플랫폼 세션으로 매핑합니다.
PlaybackException은PlaybackStateCompat의 심각한 오류 상태에 매핑됩니다.MediaSession.sendError(ControllerInfo, SessionError)와 함께 미디어 알림 컨트롤러에 전송된SessionError는PlaybackStateCompat의 심각하지 않은 오류에 매핑됩니다. 즉, 오류 코드와 메시지가 설정되지만 플랫폼 세션의 상태는STATE_ERROR와 다르게 유지됩니다. - 전역 세션 활동을 재정의하기 위해 컨트롤러별로 세션 활동을 설정할 수 있습니다. 세션 활동은
AcceptedResultBuilder.setSessionActivivty(PendingIntent)로ConnectionResult를 만들어 연결 시간에 컨트롤러에 대해 정의할 수 있습니다. 연결되면MediaSession.setSessionActivity(ControllerInfo, PendingIntent)를 사용하여 세션 활동을 업데이트할 수 있습니다. MediaLibrarySession.Callback호출의 오류 복제를 개선합니다. 이제 오류 유형을 선택하거나 기본적으로 사용 설정된 오류 복제를 선택 해제하는MediaLibrarySession.Builder.setLibraryErrorReplicationMode()를 사용하여 오류 복제를 구성할 수 있습니다.
- UI:
- 다운로드:
DownloadHelper가 출시되지 않은Renderer인스턴스를 누수하지 않도록 합니다. 이렇게 하면 결국IllegalStateException: Too many receivers, total of 1000, registered for pid로 앱이 비정상 종료될 수 있습니다 (#1224).
- Cronet 확장 프로그램:
CronetDataSource의SocketTimeoutException수정 Cronet의 일부 버전에서는 콜백에서 제공하는 요청이 항상 동일하지는 않습니다. 이로 인해 콜백이 완료되지 않고 요청 시간이 초과됩니다(https://issuetracker.google.com/328442628).
- HLS 확장 프로그램:
- 불연속을 기다리는 보류 중인 EMSG 샘플이 잘못된 오프셋으로
HlsSampleStreamWrapper에 위임되어IndexOutOfBoundsException또는IllegalArgumentException가 발생하는 버그를 수정했습니다(#1002). - LL-HLS 스트림에서 기본이 아닌 재생목록이 계속 다시 로드되는 버그를 수정했습니다(#1240).
- 초기화 세그먼트가 있는 HLS에 CMCD를 사용 설정하면
Source Error및IllegalArgumentException가 발생하는 버그 수정 - 라이브 재생 중에 기본 재생 목록이 아닌 재생 목록이 새로고침되지 않는 버그를 수정했습니다 (#1240).
- HLS 라이브 스트림에 CMCD를 사용 설정하면
ArrayIndexOutOfBoundsException가 발생하는 버그 수정(#1395)
- 불연속을 기다리는 보류 중인 EMSG 샘플이 잘못된 오프셋으로
- DASH 확장 프로그램:
- 전송 확장 프로그램:
MediaQueueItem의 앨범 제목을 Media3 미디어 항목의 아티스트로 변환하는 버그를 수정했습니다(#1255).
- 테스트 유틸리티:
FakeRenderer에서onInit()및onRelease()구현- 심각하지 않은 오류 (예:
AnalyticsListener.onVideoCodecError()에 보고된 오류)에서 실패하도록TestPlayerRunHelper.runUntil()/playUntil()메서드를 변경합니다. 이 동작을 사용 중지하려면 새TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()메서드 체인을 사용하세요.
- 데모 앱:
- 짧은 형식 데모 앱에서
DefaultPreloadManager을 사용합니다. - 명령줄에서
Intent인수로 반복 모드 설정 허용(#1266) - 기기에서 지원하는 경우
HttpEngineDataSource을HttpDataSource로 사용합니다.
- 짧은 형식 데모 앱에서
- 지원 중단된 기호 삭제:
CronetDataSourceFactory를 삭제합니다. 대신CronetDataSource.Factory를 사용하세요.- 일부
DataSpec생성자가 삭제됩니다. 대신DataSpec.Builder를 사용합니다. DefaultHttpDataSource,OkHttpDataSource,CronetDataSource에서setContentTypePredicate(Predicate)메서드를 삭제합니다. 대신 각XXXDataSource.Factory에서 동등한 메서드를 사용하세요.OkHttpDataSource생성자 및OkHttpDataSourceFactory이 삭제됩니다. 대신OkHttpDataSource.Factory를 사용하세요.PlayerMessage.setHandler(Handler)가 삭제됩니다. 대신setLooper(Looper)를 사용하세요.Timeline.Window.isLive필드를 삭제합니다. 대신isLive()메서드를 사용하세요.DefaultHttpDataSource생성자가 삭제됩니다. 대신DefaultHttpDataSource.Factory를 사용합니다.DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS가 삭제됩니다. 대신DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS를 사용합니다.MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)가 삭제됩니다. 대신MediaCodecInfo.canReuseCodec(Format, Format)를 사용합니다.DrmSessionManager.DUMMY및getDummyDrmSessionManager()메서드를 삭제합니다. 대신DrmSessionManager.DRM_UNSUPPORTED를 사용하세요.AnalyticsListener.onAudioInputFormatChanged(EventTime, Format),AnalyticsListener.onVideoInputFormatChanged(EventTime, Format),AudioRendererEventListener.onAudioInputFormatChanged(Format),VideoRendererEventListener.onVideoInputFormatChanged(Format)삭제DecoderReuseEvaluation를 사용하는 오버로드를 대신 사용하세요.RendererSupport.FormatSupportIntDef 및FORMAT_HANDLED,FORMAT_EXCEEDS_CAPABILITIES,FORMAT_UNSUPPORTED_DRM,FORMAT_UNSUPPORTED_SUBTYPE,FORMAT_UNSUPPORTED_TYPE상수를 삭제합니다. 대신androidx.media3.common.C에서 동등한 IntDef 및 상수를 사용합니다 (예:C.FORMAT_HANDLED).Bundleable인터페이스를 삭제합니다. 여기에는 모든Bundleable.Creator<Foo> CREATOR상수 필드 삭제가 포함됩니다. 호출자는 각 유형에서Bundle toBundle()및static Foo fromBundle(Bundle)메서드를 대신 사용해야 합니다.
버전 1.4.0-rc01
2024년 7월 10일
1.4.0 정식 버전을 사용합니다.
버전 1.4.0-beta01
2024년 6월 26일
1.4.0 정식 버전을 사용합니다.
버전 1.4.0-alpha02
2024년 6월 7일
1.4.0 정식 버전을 사용합니다.
버전 1.4.0-alpha01
2024년 4월 17일
1.4.0 정식 버전을 사용합니다.
버전 1.3.0
버전 1.3.1
2024년 4월 11일
androidx.media3:media3-*:1.3.1이 출시되었습니다.
버전 1.3.1에는 이러한 커밋이 포함되어 있습니다.
- 공통 라이브러리:
- 현지화된 라벨 또는 기타 대체 라벨을 허용하려면
Format.labels를 추가합니다.
- 현지화된 라벨 또는 기타 대체 라벨을 허용하려면
- ExoPlayer:
- 변환기:
- API 30 이전에서
MediaMuxer이 음수 프레젠테이션 타임스탬프를 지원하지 않아 발생한 예외의 해결 방법 추가
- API 30 이전에서
- 트랙 선택:
DefaultTrackSelector: 프레임 속도가 낮거나 설정되지 않은 트랙보다 '적절한' 프레임 속도 (>=10fps)가 있는 동영상 트랙을 선호합니다. 이렇게 하면 플레이어가 동작 사진에서 추출된 MP4에서 '실제' 동영상 트랙을 선택할 수 있습니다. 동작 사진에는 해상도는 높지만 프레임 수가 매우 적은 HEVC 트랙이 두 개 포함될 수 있습니다(#1051).
- 추출기:
- 오디오:
- 오디오 트랙이 오프로드 모드에서 초기화되지 않으면 오프로드를 사용 중지하여 렌더러 복구 허용
- 동영상:
- 텍스트:
- WebVTT: 연속된 큐가
WebvttParser.parse에서 허위 추가CuesWithTiming인스턴스를 생성하지 못하도록 방지(#1177)
- WebVTT: 연속된 큐가
- DRM:
- 일부 Android 14 기기에서
ResourceBusyException또는NotProvisionedException대신MediaDrm프레임워크에 의해 발생할 수 있는NoSuchMethodError해결(#1145)
- 일부 Android 14 기기에서
- 효과:
- 색상 공간을 변환하여 PQ에서 SDR로의 톤 매핑이 개선되었습니다.
- 세션:
- UI:
Locale에서 표시 이름을 식별할 수 없는 경우 오디오 트랙 언어 이름을 포함하도록 대체합니다(#988).
- DASH 확장 프로그램:
- 매니페스트의 모든
Label요소를Format.labels에 채웁니다(#1054).
- 매니페스트의 모든
- RTSP 확장 프로그램:
- SDP 파싱에서 빈 세션 정보 값 (i-tag)을 건너뜁니다(#1087).
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1, MIDI 등):
- MIDI 확장 프로그램은 추가 Maven 저장소를 구성해야 하므로 기본적으로 로컬 종속 항목으로 사용 중지합니다. 로컬 종속 항목에서 이 모듈이 필요한 사용자는 다시 사용 설정할 수 있습니다.
버전 1.3.0
2024년 3월 6일
androidx.media3:media3-*:1.3.0이 출시되었습니다.
버전 1.3.0에는 이러한 커밋이 포함되어 있습니다.
- 공통 라이브러리:
package이 현재 애플리케이션의 패키지와 다른 경우android.resource://package/[type/]name원시 리소스 URI 지원 구현 이 기능은 항상 작동하는 것으로 문서화되었지만 지금까지는 올바르게 구현되지 않았습니다.- 앱 코드에 의해 설정되거나 미디어에서 읽어온 MIME 유형을 완전히 소문자로 정규화
AdPlaybackState에서 단일Uri대신 전체MediaItem로 광고를 정의합니다.minSdk을 19 (Android KitKat)로 늘립니다. 이는 다른 모든 AndroidX 라이브러리와 일치하며, AndroidX 종속 항목을 최신 버전으로 업그레이드하는 데 필요합니다.artworkUri와artworkData중 하나 이상이 null이 아닌 경우MediaMetadata.Builder.populate(MediaMetadata)에서 두 값을 모두 채웁니다 (#964).
- ExoPlayer:
- 앱이 재생 전에 특정 시작 위치에서 콘텐츠 미디어 소스를 미리 로드할 수 있도록 하는
PreloadMediaSource및PreloadMediaPeriod추가PreloadMediaSource는Timeline를 수신할 콘텐츠 미디어 소스를 준비하고, 지정된 시작 위치에서 기간을 준비하고 캐시하며, 트랙을 선택하고 기간의 미디어 데이터를 로드합니다. 앱은PreloadMediaSource.PreloadControl를 구현하여 미리 로드 진행 상황을 제어하고 재생을 위해 미리 로드된 소스를 플레이어에 설정합니다. - 앱이
ImageRenderer.ImageOutput를 설정할 수 있도록 허용하는ExoPlayer.setImageOutput추가 - 이제
DefaultRenderersFactory는 nullImageOutput및ImageDecoder.Factory.DEFAULT로 기본적으로 플레이어에게ImageRenderer를 제공합니다. - 무음이 건너뛰어지면
Player.Listener.onPositionDiscontinuity이벤트 발생 (#765) - 추출 중에 자막을 파싱하기 위한 실험용 지원 추가
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()를 사용하여 이를 사용 설정할 수 있습니다. PreloadMediaSource로 적응형 미디어 소스 지원- HttpEngine API를 사용하여
HttpDataSource인HttpEngineDataSource를 구현합니다. CompositeSequenceableLoader서브클래스화를 방지합니다. 이 구성요소는 이전에 확장 가능하게 만들어졌지만 라이브러리 내에서 서브클래스가 된 적이 없습니다. 데코레이터 패턴을 사용하여 인스턴스를 래핑하고 맞춤CompositeSequenceableLoaderFactory를 구현하여 맞춤설정을 할 수 있습니다.- 동일한 시간을 반복하면 이 항목의 메타데이터가 삭제되는 문제 수정 (#1007)
BundledChunkExtractor.Factory및DefaultHlsExtractorFactory의experimentalSetSubtitleParserFactory메서드 이름을setSubtitleParserFactory로 바꾸고null전달을 허용하지 않습니다. 새experimentalParseSubtitlesDuringExtraction(boolean)메서드를 사용하여 파싱 동작을 제어합니다.- 추출 중에 사용되는
SubtitleParser.Factory맞춤설정 지원 추가MediaSource.Factory.setSubtitleParserFactory()을 사용하면 됩니다. MergingMediaSource에서 생성된 모든Format.id필드에 소스 접두사 추가 이를 통해Format(#883)를 생성한 소스를 식별할 수 있습니다.- 하이픈만 확인하도록 수정하여 맞춤 일반 미디어 클라이언트 데이터 (CMCD) 키 이름의 유효성 검사에 사용되는 정규식을 수정합니다(#1028).
- CMCD 쿼리 매개변수의 이중 인코딩 중지(#1075)
- 앱이 재생 전에 특정 시작 위치에서 콘텐츠 미디어 소스를 미리 로드할 수 있도록 하는
- 변환기:
- H.265/HEVC SEF 슬로우 모션 동영상 평탄화 지원 추가
- 특히 '동영상 삭제' 수정의 경우 트랜스먹싱 속도가 향상됩니다.
- 출력 파일이 동영상 프레임에서 시작되도록 하는 API 추가 이렇게 하면 프레젠테이션 타임스탬프(#829)가 표시될 때까지 첫 번째 동영상 프레임을 표시하지 않는 플레이어 구현과 트리밍 작업의 출력이 더 호환될 수 있습니다.
- 단일 애셋 MP4 자르기 작업을 최적화하는 지원 추가
- 동영상 프레임에 출력 파일의 첫 번째 타임스탬프가 있는지 확인하는 지원 추가 iOS 기반 플레이어에서 검은색 프레임으로 시작하는 출력 파일을 수정합니다 (#829).
- 트랙 선택:
- 이미지 트랙 선택을 사용 설정하기 위해
DefaultTrackSelector.selectImageTrack추가 - 이미지 트랙과 동영상 트랙이 모두 제공되는 경우 이미지 트랙을 선택할지 여부를 결정하기 위해
TrackSelectionParameters.isPrioritizeImageOverVideoEnabled를 추가합니다. 기본값은false이며, 이는 동영상 트랙 선택이 우선시됨을 의미합니다.
- 이미지 트랙 선택을 사용 설정하기 위해
- 추출기:
ColorInfo.colorSpace,ColorInfo.colorTransfer,ColorInfo.colorRange값을 가져오기 위해 MP4 추출기에 추가 AV1C 파싱 추가(#692)- MP3:
Info헤더 (Xing헤더의 CBR에 해당)가 있는 파일에 상수 비트 전송률(CBR) 시크 사용 이전에는Info헤더의 탐색 테이블을 사용했지만, 이를 무시하고 파일이 CBR이라고 가정하면 탐색이 덜 정확해집니다. - MPEG2-TS: DTS, DTS-LBR, DTS:X Profile2 지원 추가(#275)
- TS 설명자에서 오디오 유형을 추출하고 역할 플래그에 매핑하여 사용자가 더 나은 정보를 바탕으로 오디오 트랙을 선택할 수 있도록 지원합니다(#973).
- 오디오:
- 동영상:
VideoFrameProcessor.Factory인수를 사용하는MediaCodecVideoRenderer생성자를 변경하고VideoSinkProvider인수를 사용하는 생성자로 대체합니다. 맞춤VideoFrameProcessor.Factory를 삽입하려는 앱은 맞춤VideoFrameProcessor.Factory를 사용하는CompositingVideoSinkProvider를 인스턴스화하고 동영상 싱크 제공자를MediaCodecVideoRenderer에 전달할 수 있습니다.
- 텍스트:
DefaultExtractorsFactory.setTextTrackTranscodingEnabled사용 시Tried to marshall a Parcel that contained Binder objects오류를 해결하기 위해 비트맵 큐의 직렬화 수정(#836)- CEA-708:
rowLock값을 무시합니다. CEA-708-E S-2023 사양에 따르면 스트림에 있는 값과 관계없이rowLock와columnLock가 모두 true로 간주되어야 합니다 (columnLock지원은 구현되지 않았으므로 항상 false로 간주됨).
- 이미지:
- DASH 썸네일 지원 추가 그리드 이미지는 잘리고 개별 썸네일은
ImageOutput에 표시되는 시간에 가까워질 때 제공됩니다.
- DASH 썸네일 지원 추가 그리드 이미지는 잘리고 개별 썸네일은
- DRM:
- 후속 암호화된 샘플의 키가 아직 준비되지 않은 경우에도 기본적으로 DRM 콘텐츠에서 암호화되지 않은 '명확한 리드' 샘플을 즉시 재생합니다. 재생 위치가 암호화된 샘플에 도달할 때 키가 아직 준비되지 않으면 재생 중에 멈춤이 발생할 수 있습니다 (하지만 이전에는 이 시점까지 재생이 시작되지 않았음). 이 동작은
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey또는DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys을 사용하여 사용 중지할 수 있습니다.
- 후속 암호화된 샘플의 키가 아직 준비되지 않은 경우에도 기본적으로 DRM 콘텐츠에서 암호화되지 않은 '명확한 리드' 샘플을 즉시 재생합니다. 재생 위치가 암호화된 샘플에 도달할 때 키가 아직 준비되지 않으면 재생 중에 멈춤이 발생할 수 있습니다 (하지만 이전에는 이 시점까지 재생이 시작되지 않았음). 이 동작은
- IMA 확장 프로그램:
- 적절한 파일 확장자가 없는 DASH 및 HLS 광고를 재생할 수 없는 문제 수정
- 세션:
- TV 앱의 더블클릭 감지를 사용 중지합니다(#962).
- null이 아닌 추가 데이터만 있는
MediaItem.RequestMetadata가 미디어 컨트롤러와 세션 간에 전송되지 않는 문제 수정 MediaLibraryService대신Context만 사용하는 생성자를MediaLibrarySession.Builder에 추가합니다.
- HLS 확장 프로그램:
HlsMediaPeriod를 package-private 공개 상태로 줄임 이 유형은 HLS 패키지 외부에서 직접 종속되어서는 안 됩니다.- 세그먼트 시작 부분으로의 탐색을 더 효율적으로 해결합니다(#1031).
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1, MIDI 등):
- MIDI 디코더: SysEx 이벤트 메시지 무시(#710)
- 테스트 유틸리티:
TestPlayerRunHelper.playUntilPosition에서 재생을 일시중지하지 마세요. 테스트는 재생을 재생 상태로 유지하지만 테스트에서 어설션과 추가 작업을 추가할 수 있을 때까지 진행을 일시중지합니다.
- 데모 앱:
PreloadMediaSource사용을 단편 콘텐츠 사용 사례와 함께 데모하는 단편 데모 모듈 추가
버전 1.3.0-rc01
2024년 2월 22일
1.3.0 정식 버전을 사용합니다.
버전 1.3.0-beta01
2024년 2월 7일
1.3.0 정식 버전을 사용합니다.
버전 1.3.0-alpha01
2024년 1월 15일
1.3.0 정식 버전을 사용합니다.
버전 1.2.0
버전 1.2.1
2024년 1월 9일
- ExoPlayer:
LiveConfiguration.min/maxOffset범위를 벗어난 수동 탐색으로 오프셋이min/maxOffset으로 계속 조정되는 문제 수정- 3, 5, 6, 7, 8 채널의 OPUS 및 VORBIS 채널 레이아웃이 잘못된 문제 수정(#8396)
- 라이브 스트림에서 0으로 탐색한 후 트랙 선택으로 스트림이 기본 위치에서 시작되는 문제를 수정합니다(#9347).
CmcdData.Factory의 새 인스턴스가 청크 소스에서bufferedDurationUs의 음수 값을 수신하여IllegalArgumentException가 발생하는 문제를 수정했습니다(#888).
- 변환기:
- 높은 작동 속도를 설정하여 인코더가 구성 시간에 발생할 수 있는 문제 해결
- 추출기:
- 오디오:
- 여러 번 호출될 때
SilenceSkippingAudioProcessor의 EOS 처리 수정 (#712)
- 여러 번 호출될 때
- 동영상:
- 60fps AVC 스트림이 지원되지 않는 것으로 표시되는 Galaxy Tab S7 FE, Chromecast with Google TV, Lenovo M10 FHD Plus의 기기 문제 해결 방법 추가(#693)
- 메타데이터:
MediaMetadata가 대문자 키가 있는 Vorbis 주석에서만 채워지는 버그를 수정했습니다(#876).- 매우 큰 ID3 프레임을 파싱할 때
OutOfMemoryError를 포착합니다. 즉, 재생이 완전히 실패하는 대신 태그 정보 없이 재생을 계속할 수 있습니다.
- DRM:
- 가짜 ClearKey
https://default.url라이선스 URL의 해결 방법을 API 33 이상으로 확장합니다 (이전에는 해결 방법이 정확히 API 33에만 적용됨) (#837). - 플레이어에 연결된 화면 없이 암호화된 콘텐츠에서 일반 콘텐츠로 전환할 때
ERROR_DRM_SESSION_NOT_OPENED수정 이 오류는 보안 디코더를 잘못 사용하여 일반 콘텐츠를 재생했기 때문에 발생했습니다.
- 가짜 ClearKey
- 세션:
- 맞춤 키와 값을
MediaMetadataCompat~MediaMetadata.extras및MediaMetadata.extras~MediaMetadataCompat에 넣습니다(#756, #802). - 기존 컨트롤러의
notifyChildrenChanged브로드캐스팅 수정(#644) - 사용 중지된 알림의
setWhen타이머에 음수 시간을 설정하면 일부 기기에서 비정상 종료가 발생하는 버그를 수정했습니다(#903). - 첫 번째 알림 업데이트가 요청될 때 미디어 알림 컨트롤러의 연결이 완료되지 않은 경우
IllegalStateException수정 (#917)
- 맞춤 키와 값을
- UI:
- DASH 확장 프로그램:
- DASH 매니페스트에서 Dolby의 채널 수를 5로 파싱합니다(#688).
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1, MIDI 등):
- 전송 확장 프로그램:
- 전송 기기에서 미디어 로드에 실패할 때 앱이 비정상 종료되지 않도록
Timeline생성을 정리합니다(#708).
- 전송 기기에서 미디어 로드에 실패할 때 앱이 비정상 종료되지 않도록
버전 1.2.0
2023년 11월 15일
- 공통 라이브러리:
Log.Logger인터페이스의 메서드에@Nullable Throwable매개변수를 추가합니다. 이러한 메서드의message매개변수에는 더 이상Log.{d,i,w,e}()메서드에 전달된Throwable에 관한 정보가 포함되지 않으므로 원하는 경우 구현에서 이 정보를 수동으로 추가해야 합니다 (Logger.appendThrowableString(String, Throwable)사용 가능).- null을 허용하는 일반 유형 매개변수와 null을 허용하는 배열 요소 유형이 null을 허용하는 것으로 감지되지 않는 Kotlin 호환성 문제 수정
TrackSelectorResult및SimpleDecoder메서드 매개변수(#6792)가 그 예입니다. - 재생이 일시적으로 억제되는 동안 (예: 일시적인 오디오 포커스 손실로 인해) '재생' 버튼을 표시하도록
Util.shouldShowPlayButton에서 기본 UI 및 알림 동작을 변경합니다.PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)또는MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)(#11213)을 사용하여 기존 동작을 유지할 수 있습니다. - https://issuetracker.google.com/251172715를 수정하기 위해
androidx.annotation:annotation-experimental를1.3.1로 업그레이드 ExoPlayer.setAudioAttributes를Player인터페이스로 이동
- ExoPlayer:
- 디코딩 전용 샘플을 올바르게 식별하지 않아 발생하는 AC4 스트림의 탐색 문제를 수정합니다(#11000).
- 이 기능이
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput를 통해 사용 설정된 경우 적합하지 않은 오디오 출력 기기 (예: Wear OS 기기의 내장 스피커)에서 재생을 억제하는 기능 추가 적절한 오디오 출력을 사용할 수 없을 때 재생을 시도하거나 재생 중에 적절한 출력이 모두 연결 해제되면 재생 억제 이유가Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT로 업데이트됩니다. 적절한 출력이 연결되면 억제 이유가 삭제됩니다. Player.replaceMediaItem(s)를 통해 생성 후MediaItem업데이트를 수락하도록MediaSource.canUpdateMediaItem및MediaSource.updateMediaItem추가Player.replaceMediaItem(s)를 통해 라이브러리에서 제공하는 모든MediaSource클래스의MediaItem업데이트 허용(#33, #9978)MimeTypes.TEXT_EXOPLAYER_CUES의 이름을MimeTypes.APPLICATION_MEDIA3_CUES로 바꿉니다.- 전체 PNG 파일을
TrackOutput에 보내고 읽는PngExtractor를 하나의 샘플로 추가합니다. SequenceableLoader인터페이스의SequenceableLoader.continueLoading(long)메서드를SequenceableLoader.continueLoading(LoadingInfo loadingInfo)로 개선LoadingInfo에는 기존playbackPositionUs외에playbackSpeed및lastRebufferRealtimeMs를 비롯한 추가 매개변수가 포함됩니다.ChunkSource인터페이스의ChunkSource.getNextChunk(long, long, List, ChunkHolder)메서드를ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)로 개선합니다.- CMCD (Common Media Client Data) 로깅에 버퍼 고갈 (
bs), 기한 (dl), 재생률 (pr), 시작(su) 필드를 추가합니다(#8699). ColorInfo에 루마 및 크로마 비트 심도 추가(#491)- 다음 객체 요청 (
nor) 및 다음 범위 요청 (nrr)과 같은 Common Media Client Data (CMCD) 로깅에 필드를 추가합니다(#8699). - 질의 매개변수를 사용하여 일반 미디어 클라이언트 데이터 (CMCD) 데이터를 전송하는 기능 추가 (#553)
ExperimentalBandwidthMeter의ConcurrentModificationException을 수정합니다(#612).CompositeMediaSource.getMediaTimeForChildMediaTime에MediaPeriodId매개변수 추가ConcatenatingMediaSource2에서ClippingMediaSource(및 기간/창 시간 오프셋이 있는 기타 소스) 지원(#11226)MediaPeriodId인수도 수신하도록BaseRenderer.onStreamChanged()변경
- 변환기:
- 이미지 입력의 EXIF 회전 데이터를 파싱합니다.
TransformationRequest.HdrMode주석 유형과 관련 상수를 삭제합니다. 대신Composition.HdrMode및 연결된 상수를 사용하세요.- 회전 문제를 해결하기 위해
OverlaySettings간소화 SampleConsumer.queueInputBitmap의frameRate및durationUs매개변수가TimestampIterator로 변경되었습니다.
- 트랙 선택:
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness를 추가하여 원활하지 않은 적응을 명시적으로 허용하거나 허용하지 않습니다. 기본값은 현재 동작인true로 유지됩니다.
- 추출기:
- MPEG-TS: 스트림의 마지막 액세스 단위를 샘플 대기열에 전달하여 마지막 프레임이 렌더링되도록 합니다(#7909).
rotationDegrees을 결정할 때 오타 수정projectionPosePitch를projectionPoseRoll로 변경했습니다(#461).Extractor인스턴스를instanceof로 직접 검사할 수 있다는 가정을 삭제합니다.Extractor의 구현 세부정보에 런타임 액세스하려면 먼저Extractor.getUnderlyingInstance를 호출해야 합니다.BmpExtractor를 추가합니다.WebpExtractor를 추가합니다.HeifExtractor를 추가합니다.Mp4Extractor에 QuickTime 클래식 지원 추가
- 오디오:
- MP4 및 Matroska에서 24/32비트 빅엔디언 PCM 지원을 추가하고 MP4에서
lpcm의 PCM 인코딩을 파싱합니다. - MP4에서 Vorbis 오디오 추출 지원 추가
DefaultAudioOffloadSupportProvider을 통해 싱크가 형식에 제공할 수 있는 오프로드 지원 수준을 가져오는AudioSink.getFormatOffloadSupport(Format)추가isFormatSupported,isGaplessSupported,isSpeedChangeSupported가 포함된 새로운AudioOffloadSupport를 반환합니다.- 오디오 싱크의 오프로드 구성이 구성되는
AudioSink.setOffloadMode()추가 기본값은AudioSink.OFFLOAD_MODE_DISABLED입니다. - 오프로드는
TrackSelectionParameters의setAudioOffloadPreference를 통해 사용 설정할 수 있습니다. 설정된 환경설정이 사용 설정인 경우 기기가 형식의 오프로드를 지원하고 트랙 선택이 단일 오디오 트랙이면 오디오 오프로드가 사용 설정됩니다. audioOffloadModePreference이AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED으로 설정된 경우DefaultTrackSelector는 오디오 트랙만 선택하며, 해당 트랙의 형식이 오프로드에서 지원되는 경우에만 선택합니다. 오프로드에서 지원되는 오디오 트랙이 없으면 트랙이 선택되지 않습니다.- 트랙 전환 후 재생 위치 문제로 인해 API 수준 33 이전에서 오프로드에 대한 갭리스 지원을 사용 중지합니다.
DefaultRenderersFactory.buildAudioSink메서드 서명에서enableOffload매개변수를 삭제합니다.DefaultAudioSink.Builder.setOffloadMode메서드를 삭제합니다.- intdef 값
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED를 삭제합니다. - 오프로드 재생 중에 Opus 연속 재생 메타데이터 지원 추가
- 첫 번째 쓰기에서 실패한 경우 오프로드를 사용 중지하여 렌더러 복구 허용(#627)
- 오디오 전용 오프로드 재생을 위해 기본적으로 오프로드 예약 사용 설정
ExoPlayer.experimentalSetOffloadSchedulingEnabled및AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged을 삭제합니다.onExperimentalSleepingForOffloadChanged의 이름이onSleepingForOffloadChanged으로,onExperimentalOffloadedPlayback의 이름이onOffloadedPlayback으로 변경되었습니다.- 오디오 오프로드 모드 관련
TrackSelectionParameters인터페이스와 정의를 내부AudioOffloadPreferences클래스로 이동 AnalyticsListener,AudioRendererEventListener,AudioSink.Listener에onAudioTrackInitialized및onAudioTrackReleased콜백 추가- DTS Express 오디오 버퍼 언더플로 문제 수정(#650)
- E-AC3-JOC의 기능 확인 시
IllegalArgumentException이 발생하는 버그를 수정했습니다(#677).
- MP4 및 Matroska에서 24/32비트 빅엔디언 PCM 지원을 추가하고 MP4에서
- 동영상:
MediaCodecVideoRenderer이(가) 맞춤VideoFrameProcessor.Factory을(를) 사용하도록 허용- 오디오 스트림이 음수 타임스탬프로 시작되는 경우 첫 번째 프레임을 렌더링할 수 없는 버그를 수정했습니다(#291).
- 텍스트:
ExoplayerCuesDecoder가 삭제됩니다. 이제sampleMimeType = application/x-media3-cues가 있는 텍스트 트랙은SubtitleDecoder인스턴스 없이TextRenderer에서 직접 처리합니다.
- 메타데이터:
- 구현에서 어쨌든 null을 반환해야 하므로 '디코딩 전용' 샘플에 더 이상
MetadataDecoder.decode가 호출되지 않습니다.
- 구현에서 어쨌든 null을 반환해야 하므로 '디코딩 전용' 샘플에 더 이상
- 효과:
- 타임스탬프로 비트맵 입력을 대기열에 추가하는
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)추가 VideoFrameProcessor.registerInputStream()을 비차단으로 변경 앱은VideoFrameProcessor.Listener#onInputStreamRegistered()를 구현해야 합니다.VideoFrameProcessor.queueInputBitmap의frameRate및durationUs매개변수가TimestampIterator로 변경되었습니다.
- 타임스탬프로 비트맵 입력을 대기열에 추가하는
- IMA 확장 프로그램:
- 재생목록의 첫 번째 항목이 아닌 멀티 기간 DASH 라이브 스트림이 예외를 발생시킬 수 있는 버그를 수정했습니다(#571).
AdsLoader.destroy()를 호출하기 전에 StreamManager를 해제합니다.- IMA SDK 버전을 3.31.0으로 범프합니다.
- 세션:
DefaultMediaNotificationProvider에서 알림 포그라운드 서비스 동작을FOREGROUND_SERVICE_IMMEDIATE로 설정합니다(#167).- API 31 이상의
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()만 사용하여 삼성 기기에서 지원 중단된 API 관련 문제를 방지합니다(#167). - 미디어 알림 컨트롤러를 프록시로 사용하여 알림과 플랫폼 세션을 채우는 데 사용되는 사용 가능한 명령어와 맞춤 레이아웃을 설정합니다.
- 플랫폼 세션으로 라우팅했다가 다시 Media3로 라우팅하는 대신 Media3 내에서
MediaSessionService.onStartCommand()에 의해 수신되는 미디어 버튼 이벤트를 변환합니다. 이렇게 하면 호출자 컨트롤러가 항상 미디어 알림 컨트롤러가 되며 앱은 지원되는 모든 API 수준에서 동일한 방식으로 알림에서 오는 호출을 쉽게 인식할 수 있습니다. - 기존
MediaSessionCompat에 연결된 경우MediaController.getCurrentPosition()가 진행되지 않는 버그 수정 - 편의를 위해
MediaLibrarySession.getSubscribedControllers(mediaId)추가 - 컨트롤러가 구독하는 상위 ID의 가용성을 어설션하기 위해
MediaLibrarySession.Callback.onSubscribe()재정의 성공하면 정기 결제가 수락되고notifyChildrenChanged()가 즉시 호출되어 브라우저에 알립니다(#561). - Automotive OS용 세션 데모 모듈을 추가하고 Android Auto용 세션 데모를 사용 설정합니다.
- 미디어 알림 컨트롤러에
COMMAND_GET_TIMELINE를 사용할 수 없는 경우 프레임워크 세션의 대기열을 설정하지 마세요. Android Auto가 프레임워크 세션에서 읽어오는 클라이언트 컨트롤러이므로 Android Auto UI의queue버튼이 표시되지 않습니다(#339). - 기본적으로
SimpleBitmapLoader대신DataSourceBitmapLoader사용(#271, #327) - 앱이 기본 미디어 버튼 이벤트 처리를 재정의할 수 있도록 하는
MediaSession.Callback.onMediaButtonEvent(Intent)추가
- UI:
- 사용자가 적합한 오디오 출력 (예: 블루투스 헤드폰)을 연결할 수 있도록 시스템 대화상자를 실행하여
Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT로 인한 재생 억제를 처리하는 Wear OS 기기용Player.Listener구현 추가 적합한 기기가 구성 가능한 제한 시간(기본값은 5분) 내에 연결되면 리스너가 재생을 자동 재개합니다.
- 사용자가 적합한 오디오 출력 (예: 블루투스 헤드폰)을 연결할 수 있도록 시스템 대화상자를 실행하여
- 다운로드:
- Android 14 호환성을 위해
DownloadService의 '데이터 동기화' 포그라운드 서비스 유형을 선언합니다. 이 서비스를 사용하는 경우 앱은 매니페스트에dataSync를foregroundServiceType로 추가하고FOREGROUND_SERVICE_DATA_SYNC권한(#11239)을 추가해야 합니다.
- Android 14 호환성을 위해
- HLS 확장 프로그램:
- 마지막 로드 완료 시간이 아닌 마지막 로드 시작 시간에서 계산된 간격으로 HLS 라이브 재생목록을 새로고침합니다(#663).
- DASH 확장 프로그램:
- 세그먼트 템플릿 URL에서 동일한 DASH 식별자를 여러 개 허용
- 추출 중에 자막을 파싱하기 위한 실험용 지원 추가 이렇게 하면 자막 세그먼트 간 전환 시 깜박임 해결을 비롯해 겹치는 자막 병합이 더 잘 지원됩니다.
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()(#288)을 사용하여 이를 사용 설정할 수 있습니다.
- RTSP 확장 프로그램:
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1, MIDI 등):
- Jsyn 라이브러리를 사용하여 오디오를 합성하는 표준 MIDI 파일 재생을 지원하는 MIDI 디코더 모듈을 출시합니다.
- 표시할 필요가 없는 출력 버퍼를 직접 표시하도록
DecoderOutputBuffer.shouldBeSkipped추가 이는 지원 중단될C.BUFFER_FLAG_DECODE_ONLY보다 선호됩니다. - 디코더가 시작 시간 전에 디코딩 전용 샘플을 삭제할 수 있도록
Decoder.setOutputStartTimeUs및SimpleDecoder.isAtLeastOutputStartTimeUs추가 지원 중단될Buffer.isDecodeOnly보다 이 방법을 사용하는 것이 좋습니다. - MIDI 디코더 아티팩트를 Maven 저장소에 게시하는 버그 수정 아티팩트의 이름이
media3-exoplayer-midi로 바뀌었습니다(#734).
- Leanback 확장 프로그램:
- 표면을 사용 중지하면 Leanback 코드에서
ArithmeticException이 발생할 수 있는 버그를 수정했습니다 (#617).
- 표면을 사용 중지하면 Leanback 코드에서
- 테스트 유틸리티:
TestExoPlayerBuilder및FakeClock가 Espresso UI 테스트 및 Compose UI 테스트와 호환되도록 합니다. 이 수정사항은 Espresso 또는 Compose 뷰 상호작용 중에 재생이 비결정적으로 진행되는 버그를 수정합니다.
- 지원 중단된 기호 삭제:
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)및TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)을 삭제합니다.Composition.Builder.setHdrMode(int)를 사용하고Composition를Transformer.start(Composition, String)에 전달하세요.- 지원 중단된
DownloadNotificationHelper.buildProgressNotification메서드를 삭제하고notMetRequirements매개변수를 사용하는 지원 중단되지 않은 메서드를 대신 사용합니다.
버전 1.2.0-rc01
2023년 11월 1일
1.2.0 정식 버전을 사용합니다.
버전 1.2.0-beta01
2023년 10월 19일
1.2.0 정식 버전을 사용합니다.
버전 1.2.0-alpha02
2023년 9월 29일
1.2.0 정식 버전을 사용합니다.
버전 1.2.0-alpha01
2023년 8월 17일
1.2.0 정식 버전을 사용합니다.
버전 1.1.0
버전 1.1.1
2023년 8월 16일
- 공통 라이브러리:
- 모든 모듈에서 실수로 추가된
multidex종속 항목을 삭제합니다(#499).
- 모든 모듈에서 실수로 추가된
- ExoPlayer:
- 재생목록이 삭제된 후 가짜
PlaybackStats가 생성되는PlaybackStatsListener의 문제 수정 - 일반 미디어 클라이언트 데이터 (CMCD) 로깅에 스트리밍 형식 (sf), 스트림 유형 (st), 버전 (v), 최고 비트 전송률 (tb), 객체 지속 시간 (d), 측정된 처리량 (mtp), 객체 유형 (ot)을 추가합니다(#8699).
- 재생목록이 삭제된 후 가짜
- 오디오:
- 매우 짧은 파일을 재생할 때
Player.getState()이STATE_ENDED로 전환되지 않는 버그를 수정했습니다(#538).
- 매우 짧은 파일을 재생할 때
- 오디오 오프로드:
- RFC 7845에 따라 오프로드된 Opus 재생을 위해 Ogg ID 헤더 및 댓글 헤더 페이지를 비트스트림에 추가합니다.
- 동영상:
- H.265/HEVC: SPS 단기 및 장기 참조 사진 정보 파싱 수정
- 텍스트:
- CEA-608: 표시되는 텍스트만 고려하도록 큐 잘림 로직 변경 이전에는 큐 길이를 32자로 제한할 때 들여쓰기와 탭 오프셋이 포함되었습니다 (사양에 따라 기술적으로 올바름)(#11019).
- IMA 확장 프로그램:
- IMA SDK 버전을 3.30.3으로 범프합니다.
- 세션:
- 컨트롤러 상태에 맞춤 레이아웃을 추가하고 이에 액세스하는 getter를 제공합니다. 맞춤 레이아웃이 변경되면
MediaController.Listener.onCustomLayoutChanged가 호출됩니다. 다른 Media3 컨트롤러에 다른 맞춤 레이아웃을 전송하려는 앱은MediaSession.Callback.onConnect에서AcceptedResultBuilder를 사용하여 연결이 완료될 때 컨트롤러에서 맞춤 레이아웃을 사용할 수 있도록 하면 됩니다. MediaLibraryServiceLegacyStub이 이를 지원하지 않는Result에 오류를 전송하여UnsupportedOperationException(#78)이 생성되는 사례 수정PlayerWrapper가 기존 명령어(COMMAND_ADJUST_DEVICE_VOLUME및COMMAND_SET_DEVICE_VOLUME)와 새 명령어 (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS및COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS)를 통해volumeControlType를 결정하여VolumeProviderCompat를 만드는 방식 수정(#554)
- 컨트롤러 상태에 맞춤 레이아웃을 추가하고 이에 액세스하는 getter를 제공합니다. 맞춤 레이아웃이 변경되면
버전 1.1.0
2023년 7월 5일
- 공통 라이브러리:
- 부적합한 오디오 라우트에 대한 억제 이유 추가 및 준비 시 재생 너무 오래 억제된 이유 변경 (#15)
- 플레이어에 명령어 추가:
COMMAND_GET_METADATACOMMAND_SET_PLAYLIST_METADATACOMMAND_SET_DEVICE_VOLUME_WITH_FLAGSCOMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- 사용자가 볼륨 플래그를 지정할 수 있도록 Player에 오버로드된 메서드 추가
void setDeviceVolume(int, int)void increaseDeviceVolume(int)void decreaseDeviceVolume(int)void setDeviceMuted(boolean, int)
DeviceInfo에Builder추가 및 기존 생성자 지원 중단- 원격 재생의 라우팅 컨트롤러 ID를 지정하기 위해
DeviceInfo.routingControllerId추가 - 동일한 위치에서 항목을 추가하고 삭제하는 바로가기로
Player.replaceMediaItem(s)추가(#8046)
- ExoPlayer:
- 명시적으로 선택한 경우에만 ExoPlayer가 기기 볼륨 메서드를 제어하도록 허용
ExoPlayer.Builder.setDeviceVolumeControlEnabled을 사용하여 다음 항목에 액세스할 수 있습니다.getDeviceVolume()isDeviceMuted()setDeviceVolume(int)및setDeviceVolume(int, int)increaseDeviceVolume(int)및increaseDeviceVolume(int, int)decreaseDeviceVolume(int)및decreaseDeviceVolume(int, int)
MediaSource에서 사용 가능한 트랙 유형을 필터링할 수 있는FilteringMediaSource추가- 적응형 스트리밍 형식 DASH, HLS, SmoothStreaming의 아웃바운드 요청에 일반 미디어 클라이언트 데이터 (CMCD)를 포함하는 지원 추가
br,bl,cid,rtp,sid필드가 통합되었습니다(#8699). API 구조 및 API 메서드:- CMCD 로깅은 기본적으로 사용 중지되어 있습니다.
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory)을 사용하여 사용 설정하세요. - 모든 키는 기본적으로 사용 설정되어 있습니다.
CmcdConfiguration.RequestConfig.isKeyAllowed(String key)를 재정의하여 로깅되는 키를 필터링하세요. CmcdConfiguration.RequestConfig.getCustomData()를 재정의하여 맞춤 키 로깅을 사용 설정합니다.
- CMCD 로깅은 기본적으로 사용 중지되어 있습니다.
- 맞춤
*.exolist.json파일로 데모 앱을 더 쉽게 시작할 수 있도록 기본 데모의 매니페스트에 추가 작업을 추가합니다(#439). - 동영상 재생 중에
Effect을 사용하는ExoPlayer.setVideoEffects()추가 int이 아닌long로sourceId을 저장하도록SampleQueue를 업데이트합니다. 이렇게 하면 공개 메서드SampleQueue.sourceId및SampleQueue.peekSourceId의 서명이 변경됩니다.- 이러한 메서드를 관련
MediaPeriod와 연결할 수 있는 매개변수를LoadControl메서드shouldStartPlayback및onTracksSelected에 추가합니다. - 맵에서 키로 사용되는 UID가 있는 기간을 포함하는 타임라인 매개변수를 추가하여
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)의 서명을 변경합니다. 이는 다중 기간 라이브 스트림의 동시 실행 문제를 방지하는 데 필요합니다. EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)및BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)이 지원 중단됩니다.mediaTimeOffsetUs이 없는 메서드 변형을 대신 호출할 수 있습니다. 지원 중단된 변형의 경우에도 오프셋이 더 이상 디스패처에 의해 디스패치되는MediaLoadData객체의startTimeUs및endTimeUs에 추가되지 않습니다.ExoTrackSelection.blacklist을excludeTrack으로,isBlacklisted을isTrackExcluded으로 바꿉니다.- 빈 재생목록에서 호출될 때
ExoPlayer.setMediaItem(s)과addMediaItem(s)간의 일관되지 않은 동작을 수정합니다.
- 명시적으로 선택한 경우에만 ExoPlayer가 기기 볼륨 메서드를 제어하도록 허용
- 변환기:
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)가 삭제됩니다. 대신ExoPlayerAssetLoader.Factory(MediaSource.Factory)및Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)를 사용하세요.Transformer.startTransformation(MediaItem, ParcelFileDescriptor)가 삭제됩니다.- 입력 프레임의 처리가 대기 중인 순간에 동영상 스트림의 끝이 신호로 전송된 경우 변환이 멈출 수 있는 버그를 수정했습니다 (믹서 타임아웃으로 이어짐).
findDecoder/EncoderForFormat유틸리티를 사용하는 대신MediaCodecList를 통해 코덱을 쿼리하여 지원을 확대합니다.- 일부 기기에서 작동하지 않으므로
DefaultEncoderFactory에서 B 프레임 구성을 삭제합니다.
- 트랙 선택:
- 기본적으로 사용 중지되는
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange를 추가합니다. 사용 설정하면 렌더러 기능이 변경될 때DefaultTrackSelector가 새 트랙 선택을 트리거합니다.
- 기본적으로 사용 중지되는
- 추출기:
- 오디오:
- 터널링이 사용 설정되고
AudioProcessors가 활성 상태일 때 일부 재생이 실패하는 버그를 수정했습니다(예: 끊김 없는 트리밍)(#10847). - 직접 재생 (오프로드)에서 Ogg 패킷에 Opus 프레임 캡슐화
- 오프로드 스케줄링으로 절전 모드 중 현재 위치 추정
- 플레이어 수명 주기 끝에 리소스를 해제하도록
Renderer.release()및AudioSink.release()추가 DefaultAudioSink에서 오디오 기능 변경사항을 수신 대기합니다.DefaultAudioSink의 생성자에 필수 매개변수context를 추가합니다.DefaultAudioSink는 이를 사용하여AudioCapabilitiesReceiver에 리스너로 등록하고 기능 변경이 통보되면audioCapabilities속성을 업데이트합니다.AudioSink.Listener인터페이스의 새 이벤트onAudioCapabilitiesChanged와onRendererCapabilitiesChanged이벤트를 트리거하는 새 인터페이스RendererCapabilities.Listener를 통해 오디오 기능 변경사항을 전파합니다.- 오디오 채널에 스케일링/믹싱을 적용하기 위해
ChannelMixingAudioProcessor추가 - 오디오 기능이 변경된 후 우회 모드가 가능한 경우 오디오 디코더를 삭제하도록
DecoderDiscardReasons에 새 int 값DISCARD_REASON_AUDIO_BYPASS_POSSIBLE추가 - DTS Express 및 DTS:X의 직접 재생 지원 추가(#335)
- 터널링이 사용 설정되고
- 동영상:
- 렌더러가 사용 중지된 경우
MediaCodecVideoRenderer이 너비와 높이가 0인VideoSize을 보고하도록 합니다.Player.getVideoSize()이 변경되면Player.Listener.onVideoSizeChanged가 그에 따라 호출됩니다. 이 변경사항에 따라Player.getCurrentTracks에서 동영상을 지원하지 않거나 지원되는 동영상 트랙의 크기가 아직 결정되지 않은 경우MediaCodecVideoRenderer가 적용된 ExoPlayer의 동영상 크기는 너비와 높이가 0입니다.
- 렌더러가 사용 중지된 경우
- DRM:
- DRM 패키지 외부에서 호출되지 않을 것으로 예상되는
DefaultDrmSession의 내부 전용 메서드 몇 개의 공개 상태를 줄입니다.void onMediaDrmEvent(int)void provision()void onProvisionCompleted()onProvisionError(Exception, boolean)
- DRM 패키지 외부에서 호출되지 않을 것으로 예상되는
- Muxer:
- MP4 컨테이너 파일을 만드는 데 사용할 수 있는 새 muxer 라이브러리 추가
- IMA 확장 프로그램:
- DAI에 다중 기간 라이브 DASH 스트림을 사용 설정합니다. 현재 구현에서는 아직 라이브 스트림에서의 탐색을 지원하지 않습니다(#10912).
- 연속 타임라인에서 계산된 콘텐츠 위치가 약간씩 달라 새 광고 그룹이 라이브 스트림에 삽입되는 버그를 수정했습니다.
- 세션:
- 현재
Player메서드를 호출하는 컨트롤러에 관한 정보를 가져오는 도우미 메서드MediaSession.getControllerForCurrentRequest를 추가합니다. - 앱이 블루투스 헤드셋과 같은 기기에서 전송된 미디어 버튼 이벤트로 재생 재개를 구현할 수 있도록
androidx.media3.session.MediaButtonReceiver추가(#167) - 요청된
MediaItems이LocalConfiguration(예: URI)가 있는 경우Player에 전달될 수 있도록MediaSession.Callback.onAddMediaItems에 기본 구현 추가(#282) - Android 12 이하의 소형 미디어 알림 뷰에 기본적으로 '이전으로 탐색' 및 '다음으로 탐색' 명령 버튼 추가(#410)
- 요청된
MediaItems이LocalConfiguration(예: URI)가 있는 경우Player에 전달될 수 있도록MediaSession.Callback.onAddMediaItems에 기본 구현 추가(#282) - Android 12 이하의 소형 미디어 알림 뷰에 기본적으로 '이전으로 탐색' 및 '다음으로 탐색' 명령 버튼 추가(#410)
- 현재
- UI:
- 재생/일시중지 버튼으로 맞춤 UI 요소를 작성하는 유틸리티 메서드
shouldShowPlayButton및handlePlayPauseButtonAction추가
- 재생/일시중지 버튼으로 맞춤 UI 요소를 작성하는 유틸리티 메서드
- RTSP 확장 프로그램:
- DASH 확장 프로그램:
- 다중 기간 DASH 스트림의 경우
MediaLoadData.startTimeMs및MediaLoadData.endTimeMs에서 미디어 시간 오프셋을 삭제합니다. - 다중 기간 라이브 대시 미디어 소스를 다시 준비하면
IndexOutOfBoundsException이 발생하는 버그를 수정했습니다. (#10838)
- 다중 기간 DASH 스트림의 경우
- HLS 확장 프로그램:
TimestampAdjuster가 초기화될 때까지 로드 스레드가 대기하는 시간 제한을 설정하려면HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)를 추가합니다. 초기화가 제한 시간 전에 완료되지 않으면 재생이 무한정 중단되는 것을 방지하기 위해PlaybackException가 발생합니다. 제한 시간은 기본적으로 0으로 설정됩니다(#323).
- 테스트 유틸리티:
DataSourceContractTest에서 URI 스키마 대소문자 비구분을 확인합니다.
- 지원 중단된 기호 삭제:
DefaultAudioSink생성자를 삭제하고 대신DefaultAudioSink.Builder를 사용합니다.HlsMasterPlaylist을 삭제하고HlsMultivariantPlaylist을 대신 사용합니다.Player.stop(boolean)가 삭제됩니다. 대신Player.stop()및Player.clearMediaItems()(reset이true인 경우)를 사용하세요.- 지원 중단된
SimpleCache생성자 두 개를 삭제하고DatabaseProvider를 사용하는 지원 중단되지 않은 생성자를 대신 사용하여 성능을 개선합니다. DefaultBandwidthMeter생성자를 삭제하고 대신DefaultBandwidthMeter.Builder를 사용합니다.DefaultDrmSessionManager생성자를 삭제하고 대신DefaultDrmSessionManager.Builder를 사용합니다.- 지원 중단된
HttpDataSource.InvalidResponseCodeException생성자 두 개를 삭제하고 추가 필드(cause,responseBody)를 허용하는 지원 중단되지 않은 생성자를 사용하여 오류 로깅을 개선합니다. DownloadHelper.forProgressive,DownloadHelper.forHls,DownloadHelper.forDash,DownloadHelper.forSmoothStreaming를 삭제하고DownloadHelper.forMediaItem를 대신 사용합니다.- 지원 중단된
DownloadService생성자를 삭제하고channelDescriptionResourceId매개변수를 제공하는 옵션이 포함된 지원 중단되지 않은 생성자를 사용합니다. - 지원 중단된 문자 집합 (
ASCII_NAME,UTF8_NAME,ISO88591_NAME,UTF16_NAME,UTF16LE_NAME)의 문자열 상수를 삭제하고kotlin.text패키지,java.nio.charset.StandardCharsets또는com.google.common.base.Charsets의 Kotlin 문자 집합을 대신 사용합니다. - 지원 중단된
WorkManagerScheduler생성자를 삭제하고Context매개변수를 제공하는 옵션이 포함된 지원 중단되지 않은 생성자를 대신 사용합니다. Format클래스를 인스턴스화하는 데 사용된 지원 중단된 메서드createVideoSampleFormat,createAudioSampleFormat,createContainerFormat,createSampleFormat를 삭제합니다. 대신Format.Builder를 사용하여Format인스턴스를 만드세요.- 지원 중단된 메서드
copyWithMaxInputSize,copyWithSubsampleOffsetUs,copyWithLabel,copyWithManifestFormatInfo,copyWithGaplessInfo,copyWithFrameRate,copyWithDrmInitData,copyWithMetadata,copyWithBitrate,copyWithVideoSize을 삭제하고Format.buildUpon()및 setter 메서드를 대신 사용합니다. - 지원 중단된
ExoPlayer.retry()를 삭제하고 대신prepare()을 사용하세요. - 지원 중단된 0 인수
DefaultTrackSelector생성자를 삭제하고 대신DefaultTrackSelector(Context)를 사용합니다. - 지원 중단된
OfflineLicenseHelper생성자를 삭제하고 대신OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)을 사용합니다. - 지원 중단된
DownloadManager생성자를 삭제하고Executor를 사용하는 생성자를 대신 사용합니다. - 지원 중단된
Cue생성자를 삭제하고 대신Cue.Builder를 사용합니다. - 지원 중단된
OfflineLicenseHelper생성자를 삭제하고 대신OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)을 사용합니다. - 지원 중단된
AnalyticsListener메서드 4개 삭제:onDecoderEnabled, 대신onAudioEnabled또는onVideoEnabled를 사용하세요.onDecoderInitialized, 대신onAudioDecoderInitialized또는onVideoDecoderInitialized를 사용하세요.onDecoderInputFormatChanged, 대신onAudioInputFormatChanged또는onVideoInputFormatChanged를 사용하세요.onDecoderDisabled, 대신onAudioDisabled또는onVideoDisabled를 사용하세요.
- 지원 중단된
Player.Listener.onSeekProcessed및AnalyticsListener.onSeekProcessed을 삭제하고 대신DISCONTINUITY_REASON_SEEK과 함께onPositionDiscontinuity를 사용합니다. ExoPlayer.setHandleWakeLock(boolean)을 삭제하고 대신setWakeMode(int)을 사용하세요.- 지원 중단된
DefaultLoadControl.Builder.createDefaultLoadControl()를 삭제하고 대신build()을 사용하세요. - 지원 중단된
MediaItem.PlaybackProperties를 삭제하고 대신MediaItem.LocalConfiguration을 사용하세요. 지원 중단된 필드MediaItem.playbackProperties가 이제MediaItem.LocalConfiguration유형입니다.
버전 1.1.0-rc01
2023년 6월 21일
1.1.0 정식 버전을 사용합니다.
버전 1.1.0-beta01
2023년 6월 7일
1.1.0 정식 버전을 사용합니다.
버전 1.1.0-alpha01
2023년 5월 10일
1.1.0 정식 버전을 사용합니다.
버전 1.0.0
버전 1.0.2
2023년 5월 18일
androidx.media3:media3-*:1.0.2이 출시되었습니다.
버전 1.0.2에 포함된 커밋을 확인하세요.
이 버전은 ExoPlayer 2.18.7 출시에 해당합니다.
이 출시에는 1.0.1 출시 이후 다음과 같은 변경사항이 포함되어 있습니다.
- 핵심 라이브러리:
Buffer에C.BUFFER_FLAG_LAST_SAMPLE플래그가 포함되어 있는지 나타내는Buffer.isLastSample()추가- 프레임이 있는 마지막 샘플이 '스트림 끝' 샘플을 읽지 않고 대기열에서 삭제되면 마지막 프레임이 렌더링되지 않을 수 있는 문제 수정 (#11079)
- 추출기:
- RTSP 및 MP4 추출기에서 이미 사용된 파싱 로직을 재사용하여 MPEG-TS 파일에서 H.265 SPS 파싱 수정(#303)
- 텍스트:
- SSA: 바이트 순서 표시로 시작되는 경우 UTF-16 파일의 지원을 추가합니다(#319).
- 세션:
MediaController가 작업을 업데이트하는 기존MediaSessionCompat에 연결될 때 사용 가능한 명령어를 업데이트하지 않는 문제 수정- API 30에서
params.isRecent == true를 사용하여 시스템 UI에서Callback.onGetLibraryRoot를 호출할 때MediaLibraryService가 null을 반환하지 못하도록 하는 버그를 수정했습니다(#355). MediaSessionService또는MediaLibraryService의 메모리 누수 수정(#346)MediaSession에서 결합된Timeline및 위치 업데이트로 인해MediaController에서IllegalStateException이 발생할 수 있는 버그 수정
버전 1.0.1
2023년 4월 18일
androidx.media3:media3-*:1.0.1이 출시되었습니다.
버전 1.0.1에 포함된 커밋을 확인하세요.
이 버전은 ExoPlayer 2.18.6 출시에 해당합니다.
- 핵심 라이브러리:
- 기본 위치로 이동할 때 타겟 라이브 스트림 재정의를 재설정합니다(#11051).
- 미디어의 빈 샘플 스트림으로 인해 재생이 멈출 수 있는 버그 수정
- 세션:
- 기존
MediaSessionCompat에서 게시한 동일한 대기열 항목이 여러 개 있으면MediaController에서 예외가 발생하는 버그를 수정합니다(#290). MediaSession.broadcastCustomCommand를 기존MediaControllerCompat.Callback.onSessionEvent에 전달하는 누락된 항목 추가(#293)MediaSession.setPlayer호출 시 사용 가능한 명령어가 업데이트되지 않는 버그 수정MediaController에서 전송된TrackSelectionOverride인스턴스가Format.metadata가 있는 그룹을 참조하는 경우 무시되는 문제 수정(#296)- 기존
MediaSessionCompat을 통해 메타데이터에 액세스하려면Player.COMMAND_GET_CURRENT_MEDIA_ITEM을 사용할 수 있어야 하는 문제 수정 - 백그라운드 스레드의
MediaSession인스턴스가MediaSessionService에서 사용될 때 비정상 종료를 일으키는 문제 수정(#318) - 앱에서 의도하지 않았는데 라이브러리에서 미디어 버튼 수신기를 선언하는 문제 수정(#314)
- 기존
- DASH:
- 빈 세그먼트 타임라인 처리 수정(#11014)
- RTSP:
- UDP를 사용한 RTSP 설정이 RTSP 오류 461 UnsupportedTransport로 실패하는 경우 TCP로 재시도합니다(#11069).
버전 1.0.0
2023년 3월 22일
androidx.media3:media3-*:1.0.0이 출시되었습니다.
버전 1.0.0에 포함된 커밋을 확인하세요.
이 버전은 ExoPlayer 2.18.5 출시에 해당합니다.
1.0.0-rc02 이후 변경사항이 없습니다.
버전 1.0.0-rc02
2023년 3월 2일
androidx.media3:media3-*:1.0.0-rc02이 출시되었습니다.
버전 1.0.0-rc02에 포함된 커밋을 확인하세요.
이 버전은 ExoPlayer 2.18.4 출시에 해당합니다.
- 핵심 라이브러리:
- 다운로드:
- 병합할 두 세그먼트의 시작 시간의 최대 차이를
SegmentDownloader및 하위 클래스에서 구성할 수 있도록 합니다(#248).
- 병합할 두 세그먼트의 시작 시간의 최대 차이를
- 오디오:
- 동영상:
- HEVC HDR10 형식을
HEVCProfileMain10대신HEVCProfileMain10HDR10에 매핑 - 60fps AVC 스트림이 지원되지 않는 것으로 표시되는 Chromecast with Google TV 및 Lenovo M10 FHD Plus의 기기 문제 해결 방법 추가(#10898)
- 화면 재생 빈도보다 훨씬 높은 프레임 속도로 미디어를 재생할 때 프레임 출시 성능 문제 수정
- HEVC HDR10 형식을
- 전송:
- 미디어 항목 간 전환 시 일시적인
STATE_IDLE수정(#245)
- 미디어 항목 간 전환 시 일시적인
- RTSP:
- 잘못된 RTSP 설명 응답 메시지 파싱에서 발생한 IllegalArgumentException을 포착합니다(#10971).
- 세션:
- 알림 재생/일시중지 버튼이 플레이어 상태로 업데이트되지 않는 버그를 수정했습니다 (#192).
- IMA 확장 프로그램:
- 광고가 없는 DAI 스트림이 시작되지 않는 버그를 수정했습니다. 첫 번째 (광고가 없는 경우 유일한)
LOADED이벤트가 수신되지 않았기 때문입니다.
- 광고가 없는 DAI 스트림이 시작되지 않는 버그를 수정했습니다. 첫 번째 (광고가 없는 경우 유일한)
버전 1.0.0-rc01
2023년 2월 16일
androidx.media3:media3-*:1.0.0-rc01이 출시되었습니다.
버전 1.0.0-rc01에 포함된 커밋을 확인하세요.
이 버전은 ExoPlayer 2.18.3 출시에 해당합니다.
- 핵심 라이브러리:
- 디코더가 미디어를 제대로 재생하지 못할 수 있다고 보고하더라도
MediaCodecSelector의 환경설정을 유지하도록 렌더기의 디코더 순서 지정 로직을 조정합니다. 예를 들어 기본 선택기에서 기능 지원만 있는 하드웨어 디코더가 이 형식을 완전히 지원하는 소프트웨어 디코더보다 선호됩니다. (#10604) - 새 ExoPlayer 인스턴스의 기존 재생 스레드를 설정하는
ExoPlayer.Builder.setPlaybackLooper를 추가합니다. - 다운로드 관리자 도우미가 삭제되도록 허용합니다. (#10776)
- 탐색에 사용되는 명령어도 나타내도록
BasePlayer.seekTo에 매개변수를 추가합니다. - API 21 이상에서 드로어블을 로드할 때 테마를 사용합니다. (#220)
- 여러 미디어 항목을 단일 창으로 결합할 수 있는
ConcatenatingMediaSource2를 추가합니다. (#247)
- 디코더가 미디어를 제대로 재생하지 못할 수 있다고 보고하더라도
- 추출기:
- trak atom을 파싱할 때 샘플 테이블(stbl)에 필수 샘플 설명(stsd)이 누락된 경우
NullPointerException대신ParserException이 발생합니다. - fMP4의 동기화 프레임으로 직접 이동할 때 샘플을 올바르게 건너뜁니다. (#10941)
- trak atom을 파싱할 때 샘플 테이블(stbl)에 필수 샘플 설명(stsd)이 누락된 경우
- 오디오:
- 압축된 오디오 형식 비트 전송률을 사용하여 직접 재생(패스 스루)에서
AudioTrack의 최소 버퍼 크기를 계산합니다.
- 압축된 오디오 형식 비트 전송률을 사용하여 직접 재생(패스 스루)에서
- 텍스트:
- 자막 파일에 신호가 없는 경우
Subtitle.getEventTime에 잘못된(음수) 색인을 전달하는TextRenderer를 수정합니다. - SubRip: 바이트 순서 표시로 시작되는 경우 UTF-16 파일의 지원을 추가합니다.
- 자막 파일에 신호가 없는 경우
- 메타데이터:
- ID3 v2.4에서 허용하는 대로 ID3 프레임에서 여러 개의 null로 구분된 값을 파싱합니다.
MediaMetadata.mediaType을 추가하여 메타데이터에 설명된 콘텐츠 유형 또는 폴더 유형을 표시합니다.MediaMetadata.folderType대신MediaMetadata.isBrowsable을 추가합니다. 폴더 유형은 다음 출시에서 지원 중단됩니다.
- DASH:
- 타일 수를 포함하여 이미지 적응 세트에 관한 전체 파싱을 추가합니다. (#3752)
- UI:
- 세션:
- 맞춤 플레이어용
Player인터페이스를 구현할 수 있도록 추상SimpleBasePlayer를 추가합니다. - 플랫폼 세션 토큰을 Media3
SessionToken으로 변환하는 도우미 메서드를 추가합니다. (#171) onMediaMetadataChanged를 사용하여 플랫폼 미디어 세션의 업데이트를 트리거합니다. (#219)- 미디어 세션을
DefaultMediaNotificationProvider의getMediaButtons()인수로 추가하고 명확성을 위해 변경 불가능한 목록을 사용합니다. (#216) MediaItem목록을 수정/설정하는 수단을 제공하는onSetMediaItems콜백 리스너를 추가하여 플레이어에 설정하기 전에 세션별 색인 및 위치를 시작합니다. (#156)- 블루투스가 아닌 미디어 버튼 이벤트의 두 번 탭 감지를 피합니다. (#233)
- 기존 세션 상태가 좋지 않은 경우
QueueTimeline을 더 강력하게 만듭니다. (#241)
- 맞춤 플레이어용
- 메타데이터:
- ID3 v2.4에서 허용하는 대로 ID3 프레임에서 여러 개의 null로 구분된 값을 파싱합니다.
MediaMetadata.mediaType을 추가하여 메타데이터에 설명된 콘텐츠 유형 또는 폴더 유형을 표시합니다.MediaMetadata.folderType대신MediaMetadata.isBrowsable을 추가합니다. 폴더 유형은 다음 출시에서 지원 중단됩니다.
- Cast 확장 프로그램:
- Cast SDK 버전을 21.2.0으로 범프합니다.
- IMA 확장 프로그램:
- 스레딩 문제를 방지하기 위해 애플리케이션 스레드에서
ImaServerSideAdInsertionMediaSource의 플레이어 리스너를 삭제합니다. - 속성
focusSkipButtonWhenAvailable을ImaServerSideAdInsertionMediaSource.AdsLoader.Builder에 추가하여 TV 기기에서 건너뛰기 버튼에 포커스를 두도록 요청하고 이를 기본적으로 true로 설정합니다. - 건너뛰기 버튼에 포커스를 맞추도록 프로그래매틱 방식으로 요청하려면
focusSkipButton()메서드를ImaServerSideAdInsertionMediaSource.AdsLoader에 추가합니다. - IMA SDK 버전을 3.29.0으로 범프합니다.
- 스레딩 문제를 방지하기 위해 애플리케이션 스레드에서
- 데모 앱:
- 런타임 시 다운로드 알림의 알림 권한을 요청합니다. (#10884)
버전 1.0.0-beta03
2022년 11월 22일
androidx.media3:media3-*:1.0.0-beta03이 출시되었습니다.
버전 1.0.0-beta03에 포함된 커밋을 확인하세요.
이 버전은 ExoPlayer 2.18.2 출시에 해당합니다.
- 핵심 라이브러리:
- 현재 선택된 트랙에 터널링이 사용 설정되어 있는지
ExoPlayer.isTunnelingEnabled를 추가하여 확인합니다. (#2518) WrappingMediaSource를 추가하여 단일MediaSource래핑을 간소화합니다. (#7279)- 사용 가능한 메모리가 충분하지 않아 재생이 중단되기 전에 백 버퍼를 삭제합니다.
- 오프로드가 사용 설정된 경우 Tracing 'doSomeWork' 블록을 닫습니다.
PlaybackStatsListener에서 빠른 탐색의 세션 추적 문제를 수정합니다. (#180)- 단일 항목 재생목록에서
seekToNext또는seekToPrevious를 호출할 때 누락된onMediaItemTransition콜백을 전송합니다. (#10667) - 동영상이 렌더링되는 노출 영역의 크기를 반환하는
Player.getSurfaceSize를 추가합니다. - 플레이어 해제 중에 리스너를 삭제하면
IllegalStateException이 발생할 수 있는 버그를 수정했습니다. (#10758)
- 현재 선택된 트랙에 터널링이 사용 설정되어 있는지
- 빌드:
- 최소
compileSdkVersion을 적용하여 컴파일 오류를 방지합니다. (#10684) - 블록이 다른 Gradle 빌드에 포함된 경우 블록 게시를 방지합니다.
- 최소
- 트랙 선택:
- 디스플레이에서 지원하지 않는 경우 Dolby Vision보다 다른 트랙을 선호합니다. (#8944)
- 다운로드:
- 동영상:
- 디스플레이에서 지원하지 않는 경우 Dolby Vision에 다른 디코더를 사용해 봅니다. (#9794)
- 오디오:
- 동시에 여러 플레이어를 해제할 때 발생하는 OutOfMemory 오류를 방지하기 위해
AudioTrack인스턴스를 해제하는 데SingleThreadExecutor를 사용합니다. (#10057) - AudioTrack 오프로드 상태에
AudioOffloadListener.onExperimentalOffloadedPlayback을 추가합니다. (#134) AudioTrackBufferSizeProvider를 공개 인터페이스로 만듭니다.ExoPlayer.setPreferredAudioDevice를 추가하여 선호하는 오디오 출력 장치를 설정합니다. (#135)androidx.media3.exoplayer.audio.AudioProcessor의 이름을androidx.media3.common.audio.AudioProcessor로 바꿉니다.- 모든 Android 버전에서 각각 8채널 및 12채널 오디오를 7.1 및 7.1.4 채널 마스크에 매핑합니다. (#10701)
- 동시에 여러 플레이어를 해제할 때 발생하는 OutOfMemory 오류를 방지하기 위해
- 메타데이터:
- 이제 메타데이터를 사용할 수 있을 때 이를 즉시 렌더링하도록
MetadataRenderer를 구성할 수 있습니다.MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean)로 인스턴스를 만들어 렌더러가 메타데이터를 일찍 출력할지 아니면 플레이어 위치에 맞춰 출력할지 지정합니다.
- 이제 메타데이터를 사용할 수 있을 때 이를 즉시 렌더링하도록
- DRM:
- 비어 있지 않지만 잘못된 라이선스 URL을 반환하는 Android 13 ClearKey 구현의 버그를 해결합니다.
- 재생목록에서 DRM 스키마 간에 전환(예: Widevine에서 ClearKey로)할 때 발생하는
setMediaDrmSession failed: session not opened오류를 수정합니다.
- 텍스트:
- CEA-608: 필드 2의 서비스 전환 명령어가 올바르게 처리되는지 확인합니다. (#10666)
- DASH:
- 매니페스트에서
EventStream.presentationTimeOffset를 파싱합니다. (#10460)
- 매니페스트에서
- UI:
TrackSelectionDialogBuilder에 미리 설정된 대로 플레이어의 현재 재정의를 사용합니다. (#10429)
- 세션:
- 일부 명령어는 비동기 해상도가 필요한 경우에도 항상 올바른 순서로 실행됩니다. (#85)
DefaultMediaNotificationProvider.Builder를 추가하여DefaultMediaNotificationProvider인스턴스를 빌드합니다. 빌더는 제공자가 사용하는 알림 ID, 알림 채널 ID, 알림 채널 이름을 구성할 수 있습니다. 또한DefaultMediaNotificationProvider.setSmallIcon(int)메서드를 추가하여 알림을 작은 아이콘으로 설정합니다. (#104)MediaController.release()전에 전송된 명령어가 삭제되지 않도록 합니다. (#99)SimpleBitmapLoader는file://URI에서 비트맵을 로드할 수 있습니다. (#108)MediaController가 일정 기간 동안 광고를 탐색하는 것을 방지하는 어설션을 수정했습니다. (#122)- 재생이 끝나면
MediaSessionService가 포그라운드에서 중지되고 마지막으로 재생된 미디어 항목의 재생을 다시 시작하라는 알림이 표시됩니다. (#112) - 일시중지를 위해 대기 중인 인텐트로 포그라운드 서비스를 시작하지 마세요. (#167)
- API 26 및 API 27에서
DefaultNotificationProvider로 생성된 알림과 관련 있는 '배지'를 수동으로 숨깁니다(API 28 이상에서는 배지가 자동으로 숨겨짐). (#131) - 기존 MediaSession에서 Media3 MediaController로의 두 번째 바인더 연결로 인해 IllegalStateExceptions가 발생하는 버그를 수정했습니다. (#49)
- RTSP:
- IMA:
- FFmpeg 확장 프로그램:
- FFmpeg 라이브러리를 NDK 23.1.7779620 이상과 연결하는 데 필요한 새 플래그를 추가합니다. (#9933)
- AV1 확장 프로그램:
- 최신 Android 스튜디오 버전과의 비호환성을 방지하기 위해 CMake 버전을 업데이트합니다. (#9933)
- Cast 확장 프로그램:
MediaController로 재생을 제어할 때CastPlayer를 식별할 수 있도록getDeviceInfo()를 구현합니다. (#142)
- 변환기:
- 출력 샘플 생성이 너무 느린 경우를 감지하도록 Muxer 워치독 타이머를 추가합니다.
- 지원 중단된 기호 삭제:
Transformer.Builder.setOutputMimeType(String)을 삭제합니다. 이 기능은 삭제되었습니다. 기본 Muxer를 사용할 경우 MIME 유형은 항상 MP4입니다.
버전 1.0.0-beta02
2022년 7월 21일
androidx.media3:media3-*:1.0.0-beta02가 출시되었습니다.
버전 1.0.0-beta02에 포함된 커밋을 확인하세요.
이 버전은 ExoPlayer 2.18.1 출시에 해당합니다.
- 핵심 라이브러리:
ShuffleOrder를ExoPlayer.setShuffleOrder로 변경하면reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED를 통해Player.Listener#onTimelineChanged가 호출됩니다. (#9889)- 점진적 미디어의 경우 선택한 트랙만 버퍼링된 위치에 포함합니다. (#10361)
- 모든 ExoPlayer 로그 출력에 맞춤 로거를 허용합니다. (#9752)
- 경우에 따라 작동하지 않았던
DefaultMediaSourceFactory의setDataSourceFactory구현을 수정합니다. (#116)
- 추출기:
- DASH:
- 매니페스트에서 ClearKey 라이선스 URL을 파싱합니다. (#10246)
- UI:
- TalkBack에서 재생 컨트롤 메뉴의 현재 활성 속도 옵션을 알려줍니다. (#10298)
- RTSP:
- VP8 분할 패킷 처리를 추가합니다. (#110)
- Leanback 확장 프로그램:
LeanbackAdapter의playWhenReady변경사항을 리슨합니다. (10420)
- 전송:
버전 1.0.0-beta01
2022년 6월 16일
androidx.media3:media3-*:1.0.0-beta01이 출시되었습니다.
버전 1.0.0-beta01에 포함된 커밋을 확인하세요.
이는 ExoPlayer 2.18.0 출시에 해당합니다.
- 핵심 라이브러리:
MediaMetricsManager를 통해 Android 플랫폼 진단 지원을 사용 설정합니다. ExoPlayer는 재생 이벤트 및 성능 데이터를 플랫폼에 전달하여 기기의 시스템 성능 및 디버깅 정보를 제공하는 데 도움을 줍니다. 기기 사용자가 사용 및 진단 데이터를 공유하도록 설정한 경우 Google이 이 데이터를 수집할 수도 있습니다. 앱은ExoPlayer.Builder.setUsePlatformDiagnostics(false)를 사용하여 ExoPlayer의 플랫폼 진단에 기여하는 옵션을 선택 해제할 수 있습니다.MergingMediaSource를 사용할 때 트랙이 너무 자주 재설정되는 버그를 수정했습니다. 예를 들어 자막을 사이드로드하고 선택한 자막을 재생 중 변경하는 경우가 있습니다. (#10248)- API 29 및 30에서 5G-NSA 네트워크 유형 감지를 중지합니다. 이러한 재생에서는 4G 네트워크를 가정합니다.
MediaSource.Factory.setDrmSessionManagerProvider및MediaSource.Factory.setLoadErrorHandlingPolicy에null을 전달하는 것을 허용하지 않습니다. 필요한 경우DefaultDrmSessionManagerProvider및DefaultLoadErrorHandlingPolicy인스턴스를 명시적으로 전달할 수 있습니다.MediaItem.RequestMetadata를 추가하여 정확한LocalConfiguration을 알 수 없는 경우 미디어를 재생하는 데 필요한 메타데이터를 나타냅니다. 또한,MediaMetadata.mediaUrl이 이제RequestMetadata에 포함되어 있기 때문에 이 속성을 삭제합니다.Player.Command.COMMAND_SET_MEDIA_ITEM을 추가하여 플레이어가 단일 항목 설정을 허용하도록 합니다.
- 트랙 선택:
TrackSelectionOverrides클래스를TrackSelectionParameters로 평면화하고TrackSelectionOverride를 최상위 클래스로 승격합니다.TracksInfo를Tracks로,TracksInfo.TrackGroupInfo를Tracks.Group으로 바꿉니다.Player.getCurrentTracksInfo및Player.Listener.onTracksInfoChanged또한Player.getCurrentTracks및Player.Listener.onTracksChanged로 바뀌었습니다. 여기에는Player.Listener.onTracksChanged메서드 이름을 '지원 중단하지 않음'이 포함되지만, 다른 매개변수 유형을 사용합니다.- 지원 중단된
DefaultTrackSelector.ParametersBuilder대신DefaultTrackSelector.Parameters.Builder를 반환하도록DefaultTrackSelector.buildUponParameters및DefaultTrackSelector.Parameters.buildUpon을 변경합니다. - 기본적으로 사용 설정되는
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities를 추가합니다. 사용 설정된 경우DefaultTrackSelector는 채널 수가 기기 출력 기능을 초과하지 않는 오디오 트랙을 선호합니다. 휴대기기에서DefaultTrackSelector는 다중 채널 오디오 형식이 공간(Android 12L+) 오디오일 수 있거나 Dolby 서라운드 사운드 형식이 아닌 이상, 다중 채널 오디오 형식보다 스테레오/모노를 선호합니다. 또한 오디오 공간화를 지원하는 기기에서DefaultTrackSelector는 Spatializer 속성의 변경을 모니터링하고 이러한 변경이 있는 경우 새 트랙 선택을 트리거합니다.televisionUI 모드를 사용하는 기기는 이러한 제약 조건에서 제외되며 채널 수가 가장 많은 형식이 선호됩니다. 이 기능을 사용 설정하려면Context로DefaultTrackSelector인스턴스를 구성해야 합니다.
- 동영상:
DummySurface의 이름을PlaceholderSurface로 바꿉니다.MediaCodecVideoRenderer.getCodecMaxInputSize에 AV1 지원을 추가합니다.
- 오디오:
- 비표준 MIME 유형을 광고하는 LG AC3 오디오 디코더를 사용합니다.
- API 21 미만에서 ART 확인이 느린 것을 방지하기 위해
AudioAttributes.getAudioAttributesV21()의 반환 유형을android.media.AudioAttributes에서 새로운AudioAttributesV21래퍼 클래스로 변경합니다. - 형식 오디오 채널 수가 설정되지 않은 경우 오디오 패스 스루를 위해 플랫폼을 쿼리하거나(API 29 이상) 오디오 인코딩 채널 수를 가정하며, 이는 HLS 청크 없는 준비에서 발생합니다. (10204)
- 디코더가 12채널 PCM 오디오를 출력하는 경우 채널 마스크
AudioFormat.CHANNEL_OUT_7POINT1POINT4로AudioTrack을 구성합니다. (#10322)
- DRM
- 형식 변경 직후에 탐색할 때 DRM 세션이 항상 올바르게 업데이트되도록 합니다. (10274)
- 텍스트:
List<Cue>대신CueGroup을 반환하도록Player.getCurrentCues()를 변경합니다.- SSA:
BorderStyle == 3일 때(예:OutlineColour가 큐의 배경을 설정함)OutlineColour스타일 설정을 지원합니다. (#8435) - CEA-708: 데이터를 여러 서비스 블록으로 파싱하고 현재 선택한 서비스 번호와 연결되지 않은 블록을 무시합니다.
- Google 내부 자막 형식을 처리하는 데만 사용된
RawCcExtractor를 삭제합니다.
- 추출기:
- UI:
useController=false인 경우PlayerView에 설정된OnClickListener로 이벤트 전달을 수정합니다. (#9605) 또한 모든 뷰 구성에서OnLongClickListener로의 이벤트 전달을 수정합니다.ACTION_UP전에PlayerView의 경계를 종료하는 터치 이벤트 시퀀스를 클릭으로 잘못 처리하는 문제를 수정했습니다. (#9861)- 탭할 때 컨트롤이 숨겨지는 대신 재생이 전환될 수도 있는
PlayerView접근성 문제를 수정했습니다. (#8627) ExoPlayer가 아닌Player인터페이스에서 작동하도록TrackSelectionView및TrackSelectionDialogBuilder를 다시 작성합니다. 이렇게 하면 뷰를 다른Player구현과 함께 사용할 수 있고 UI 모듈에서 ExoPlayer 모듈로의 종속 항목을 삭제할 수 있습니다. 브레이킹 체인지에 해당합니다.PlayerView트랙 선택기에서 강제 텍스트 트랙을 표시하지 않고 '없음'이 선택된 경우 적절한 강제 텍스트 트랙을 선택된 상태로 유지합니다. (#9432)
- DASH:
- DTS
AudioChannelConfiguration요소에서 채널 수를 파싱합니다. 그러면 DTS 스트림의 오디오 패스 스루가 다시 사용 설정됩니다. (#10159) DashMediaSource.Factory.setCompositeSequenceableLoaderFactory에null을 전달하는 것을 허용하지 않습니다. 필요한 경우DefaultCompositeSequenceableLoaderFactory인스턴스를 명시적으로 전달할 수 있습니다.
- DTS
- HLS:
- 재생목록 CODECS 속성에 오디오 코덱이 포함되어 있지 않은 경우 청크 포함 준비로 대체합니다. (#10065)
HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory,HlsMediaSource.Factory.setPlaylistParserFactory,HlsMediaSource.Factory.setPlaylistTrackerFactory에null을 전달하는 것을 허용하지 않습니다. 필요한 경우DefaultCompositeSequenceableLoaderFactory,DefaultHlsPlaylistParserFactory인스턴스 또는DefaultHlsPlaylistTracker.FACTORY참조를 명시적으로 전달할 수 있습니다.
- 원활한 스트리밍:
SsMediaSource.Factory.setCompositeSequenceableLoaderFactory에null을 전달하는 것을 허용하지 않습니다. 필요한 경우DefaultCompositeSequenceableLoaderFactory인스턴스를 명시적으로 전달할 수 있습니다.
- RTSP:
- H263용 RTP 리더를 추가합니다. (#63)
- MPEG4용 RTP 리더를 추가합니다. (#35)
- HEVC용 RTP 리더를 추가합니다. (#36)
- AMR용 RTP 리더를 추가합니다. 현재 모노 채널의 경우만 인터리브 처리되지 않은 AMR 스트림이 지원됩니다. 복합 AMR RTP 페이로드는 지원되지 않습니다. (#46)
- VP8용 RTP 리더를 추가합니다. (#47)
- WAV용 RTP 리더를 추가합니다. (#56)
- RTSP 기본 승인 헤더를 수정합니다. (#9544)
- ExoPlayer에 필요하지 않으므로 필수 SDP 필드를 더 이상 확인하지 않습니다. (#10049)
- RTSP 타이밍을 파싱할 때 변수가 확인된 예외가 발생합니다. (#10165)
- VP9용 RTP 리더를 추가합니다. (#47)
- OPUS용 RTP 리더를 추가합니다. (#53)
- 데이터 소스:
DummyDataSource의 이름을PlaceholderDataSource로 바꿉니다.- OkHttp 인터럽트 처리 문제를 해결합니다.
- 세션:
- 요청의 비동기 해결을 허용하도록
MediaSession.MediaItemFiller를MediaSession.Callback.onAddMediaItems로 대체합니다. MediaController가 기존 미디어 세션에 연결될 때setMediaItems(s)메서드를 지원합니다.MediaController.setMediaUri및MediaSession.Callback.onSetMediaUri를 삭제합니다.MediaController.setMediaItem및MediaSession.Callback.onAddMediaItems를 사용하여 동일한 기능을 달성할 수 있습니다.- 레거시
MediaController호출을 전달하여 미디어를onSetMediaUri대신MediaSession.Callback.onAddMediaItems로 재생합니다. MediaNotification.Provider및DefaultMediaNotificationProvider를 추가하여 알림 맞춤설정을 제공합니다.- 예술작품 이미지를 다운로드하기 위한
BitmapLoader및SimpleBitmapLoader를 추가합니다. MediaSession.setCustomLayout()을 추가하여 기존 세션과의 하위 호환성을 제공합니다.MediaSession.setSessionExtras()를 추가하여 기존 세션과의 기능 패리티를 제공합니다.MediaSession.MediaSessionCallback을MediaSession.Callback으로,MediaLibrarySession.MediaLibrarySessionCallback을MediaLibrarySession.Callback으로,MediaSession.Builder.setSessionCallback을setCallback으로 바꿉니다.MediaControllerImplLegacy의 NPE를 수정합니다. (#59)- 타임라인 변경 시 세션 위치 정보를 업데이트합니다. (#51)
- 컨트롤러 출시 후
MediaControllerImplBase의 NPE를 수정합니다. (#74)
- 요청의 비동기 해결을 허용하도록
- 광고 재생/IMA:
- 미디어 평가 위원회(MRC) 추천에 맞게 광고 폴링 속도를 100밀리초 빈도에서 200밀리초 빈도로 줄입니다.
- FFmpeg 확장 프로그램:
- Android 스튜디오의 Gradle 동기화 실패를 야기하는 CMake 버그를 방지하기 위해 CMake 버전을
3.21.0+로 업데이트합니다. (#9933)
- Android 스튜디오의 Gradle 동기화 실패를 야기하는 CMake 버그를 방지하기 위해 CMake 버전을
- 지원 중단된 기호 삭제:
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)를 삭제합니다. 대신Player.Listener.onTracksChanged(Tracks)를 사용합니다.Player.getCurrentTrackGroups및Player.getCurrentTrackSelections를 삭제합니다. 대신Player.getCurrentTracks를 사용합니다.ExoPlayer.getCurrentTrackGroups및ExoPlayer.getCurrentTrackSelections를 계속 사용할 수도 있지만 이러한 메서드는 지원 중단된 상태입니다.DownloadHelperDEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT및DEFAULT_TRACK_SELECTOR_PARAMETERS상수가 삭제됩니다. 가능하다면getDefaultTrackSelectorParameters(Context)를 대신 사용하고 그렇지 않으면DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT를 사용합니다.- 생성자
DefaultTrackSelector(ExoTrackSelection.Factory)가 삭제됩니다. 대신DefaultTrackSelector(Context, ExoTrackSelection.Factory)를 사용합니다. Transformer.Builder.setContext가 삭제됩니다. 대신Context를Transformer.Builder생성자에 전달해야 합니다.
버전 1.0.0-alpha03
2022년 3월 14일
androidx.media3:media3-*:1.0.0-alpha03이 출시되었습니다.
버전 1.0.0-alpha03에 포함된 커밋을 확인하세요.
이는 ExoPlayer 2.17.1 출시에 해당합니다.
- 오디오:
- HLS에서 Dolby Atmos(E-AC3-JOC)의 오디오 기능을 확인하는 중에 발생하는 오류를 수정했습니다.
- 추출기:
- FMP4: v0 및 v1 emsg atom이 모두 포함된 스트림에 관해 emsg 샘플 메타데이터가 잘못된 순서로 출력될 수 있는 문제를 수정했습니다. (#9996)
- 텍스트:
SubtitleConfiguration필드의 우선순위를 지정하고 설정되지 않은 경우Factory값으로 대체하도록SingleSampleMediaSource.Factory.setTrackId및MediaItem.SubtitleConfiguration.Builder.setId의 상호작용을 수정합니다. (#10016)
- 광고 재생:
- 실시간 HLS SSAI 스트림에서 광고 기간 사이의 오디오 언더런을 수정합니다.
버전 1.0.0-alpha02
2022년 3월 2일
androidx.media3:media3-*:1.0.0-alpha02가 출시되었습니다.
버전 1.0.0-alpha02에 포함된 커밋을 확인하세요.
이는 ExoPlayer 2.17.0 출시에 해당합니다.
- 핵심 라이브러리:
buildVideoRenderers()또는buildAudioRenderers()를 재정의하는DefaultRenderersFactory의 서브클래스가 코덱 어댑터 팩토리에 액세스하여 자신이 만든MediaCodecRenderer인스턴스에 이를 전달할 수 있도록 보호된 메서드DefaultRenderersFactory.getCodecAdapterFactory()를 추가합니다.Player.Listener.onMediaMetadataChanged()를 통해 앱에 도달할 수 있도록 ICY 헤더 필드name및genre를 각각MediaMetadata.station및MediaMetadata.genre에 전파합니다. (#9677)DefaultHttpDataSource#getResponseHeaders에서 null 키를 삭제합니다.MediaCodec인스턴스 생성이 실패하면 절전 모드로 들어가 다시 시도합니다. 이렇게 하면 보안 코덱에서 다른 코덱으로 표시 경로를 전환할 때 일부 기기에서 발생하는 문제를 피할 수 있습니다. (#8696)- 사용자가
MediaCodec에서 측정항목 데이터를 가져올 수 있도록MediaCodecAdapter.getMetrics()를 추가합니다. (#9766) - Maven 종속 항목 해결을 수정합니다. (#8353)
- 지연 시간이 짧은 기능도 없고 속도 설정을 위한 사용자 요청도 없는 실시간 스트림에는 자동 속도 조정을 사용 중지합니다. (#9329)
DecoderCounters#inputBufferCount의 이름을queuedInputBufferCount로 바꿉니다.SimpleExoPlayer.renderers를 비공개로 설정합니다. 렌더기에는ExoPlayer.getRenderer를 통해 액세스할 수 있습니다.- 일부
AnalyticsListener.EventFlags상수 값이Player.EventFlags의 값과 일치하도록 업데이트되었습니다. - 앱에 필요하지 않은 경우 R8을 통해 제거할 수 있도록
AnalyticsCollector를 인터페이스와 기본 구현으로 분할합니다.
- 트랙 선택:
- 트랙 선택 시 선호하는 동영상 역할 플래그를 지원합니다. (#9402)
- 조정할 여러 동영상 트랙을 선택할 때 선호하는 MIME 유형과 역할 플래그를 고려하도록 동영상 트랙 선택 로직을 업데이트합니다. (#9519)
- 조정 대상을 선택할 때 디코더 및 하드웨어 지원 수준이 동일한 형식만 선택하도록 동영상 및 오디오 트랙 선택 로직을 업데이트합니다. (#9565)
- 기본 하드웨어 가속 디코더가 여러 코덱을 지원하는 경우 더 효율적인 코덱을 우선 사용하도록 동영상 트랙 선택 로직을 업데이트합니다. (#4835)
- 기술적 트랙 선택 제약 조건(예: 선호되는 MIME 유형 또는 최대 채널 수)보다 오디오 콘텐츠 환경설정(예: '기본' 오디오 트랙 또는 시스템 언어와 일치하는 트랙)을 우선 적용합니다.
- 한 트랙 그룹을 재정의해도 동일한 유형의 다른 트랙 그룹은 중지되지 않는 트랙 선택 문제를 수정합니다. (#9675)
- 비어 있지 않은 트랙 재정의와 빈 트랙 재정의의 조합이 제대로 적용되지 않는 트랙 선택 문제를 수정합니다. (#9649)
TrackGroupArray에서 중복된TrackGroup을 금지합니다.TrackGroup은TrackGroup생성자에id를 설정하여 언제든지 구별할 수 있습니다. 이를 통해 활성 트랙 재정의로 앱을 백그라운드로 전환한 후 재생을 다시 시작할 때 발생하는 비정상 종료가 수정됩니다. (#9718)- 라이브 에지와 매우 가까운 곳에서 재생되더라도 네트워크 대역폭이 충분하면 품질이 향상될 수 있도록
AdaptiveTrackSelection의 로직을 수정합니다. (#9784)
- 동영상:
- 필요한 경우 호환되는 H264/H265 디코더를 사용하도록 Dolby Vision의 디코더 대체 로직을 수정합니다.
- 오디오:
- 필요한 경우 호환되는 E-AC3 디코더를 사용하도록 Dolby Atmos(E-AC3-JOC)의 디코더 대체 로직을 수정합니다.
null대신AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES를 명시적으로 전달할 것을 요구하도록AudioCapabilitiesAPI를 변경합니다.AudioTrackBufferSizeProvider를DefaultAudioSink에 삽입하여AudioTrack버퍼 사이즈 계산의 맞춤설정을 허용합니다. (#8891)- 요청된 버퍼 사이즈가 1MB를 초과하는 경우
AudioTrack생성을 다시 시도합니다. (#9712)
- 추출기:
- 텍스트:
- DRM:
DrmSessionManager.(pre)acquireSession에서playbackLooper를 삭제합니다. 맞춤MediaSource에서 앱이DrmSessionManager를 사용하는 경우 대신playbackLooper를DrmSessionManager.setPlayer에 전달해야 합니다.
- 광고 재생/IMA:
- IMA 동적 광고 삽입(DAI) 지원을 추가합니다. (#8213)
- 광고그룹을 재설정하여 다시 재생할 수 있도록
AdPlaybackState에 메서드를 추가합니다. (#9615) - 광고 재생 중에는 재생 속도를 1.0으로 적용합니다. (#9018)
- 로드되지 않은 광고그룹으로 인해 재생이 즉시 재설정되는 문제를 해결합니다. (#9929)
- UI:
- DASH:
- HLS:
- RTSP:
- 변환기:
- 필요한 최소 API 버전을 21로 높입니다.
- 이제 변환 중에 발생하는 오류를 설명하는 데
TransformationException이 사용됩니다. - 변환 옵션을 지정하기 위한
TransformationRequest를 추가합니다. - 여러 리스너를 등록할 수 있도록 허용합니다.
- 코덱 출력을 부분적으로 읽었을 때 변환기가 멈추는 문제를 수정합니다.
- Muxer가 해제될 때
Transformer.getProgress의 잠재적 NPE를 수정합니다. - 변환 적용을 위한 데모 앱을 추가합니다.
- MediaSession 확장 프로그램:
- 기본적으로 이제
MediaSessionConnector는 중지 시 재생목록을 지웁니다. 재생목록을 보관하려는 앱은 커넥터에서setClearMediaItemsOnStop(false)를 호출할 수 있습니다.
- 기본적으로 이제
- Cast 확장 프로그램:
- FFmpeg 확장 프로그램:
build_ffmpeg.sh가 GNU의 bin utils 대신 LLVM의 bin utils를 사용하도록 설정합니다. (#9933)
- Android 12 호환성:
com.google.android.gms:play-services-cast-framework:20.1.0을 사용하도록 Cast 확장 프로그램을 업그레이드합니다. 이전 버전의play-services-cast-framework는 Android 12를 타겟팅하는 앱과 호환되지 않으며,PendingIntent를 생성할 때IllegalArgumentException과 함께 비정상 종료됩니다. (#9528)
- 지원 중단된 기호 삭제:
Player.EventListener를 삭제합니다. 대신Player.Listener를 사용합니다.MediaSourceFactory#setDrmSessionManager,MediaSourceFactory#setDrmHttpDataSourceFactory,MediaSourceFactory#setDrmUserAgent가 삭제됩니다. 대신MediaSourceFactory#setDrmSessionManagerProvider를 사용합니다.MediaSourceFactory#setStreamKeys가 삭제됩니다. 대신MediaItem.Builder#setStreamKeys를 사용합니다.MediaSourceFactory#createMediaSource(Uri)가 삭제됩니다. 대신MediaSourceFactory#createMediaSource(MediaItem)을 사용합니다.DashMediaSource,HlsMediaSource,SsMediaSource에서setTag가 삭제됩니다. 대신MediaItem.Builder#setTag를 사용합니다.DashMediaSource#setLivePresentationDelayMs(long, boolean)을 삭제합니다. 매니페스트를 재정의하려면MediaItem.Builder#setLiveConfiguration과MediaItem.LiveConfiguration.Builder#setTargetOffsetMs를 사용하고 대체 값을 제공하려면DashMediaSource#setFallbackTargetLiveOffsetMs를 사용합니다.(Simple)ExoPlayer.setThrowsWhenUsingWrongThread가 삭제됩니다. 더 이상 스레드 적용을 선택 해제할 수 없습니다.ActionFile및ActionFileUpgradeUtil이 삭제됩니다.ActionFileUpgradeUtil을 사용하여 기존 작업 파일을DefaultDownloadIndex에 병합하려면 ExoPlayer 2.16.1 이전 버전을 사용합니다.ProgressiveMediaSource#setExtractorsFactory가 삭제됩니다. 대신ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)생성자를 사용합니다.ProgressiveMediaSource.Factory#setTag및ProgressiveMediaSource.Factory#setCustomCacheKey가 삭제됩니다. 대신MediaItem.Builder#setTag및MediaItem.Builder#setCustomCacheKey를 사용합니다.DefaultRenderersFactory(Context, @ExtensionRendererMode int)및DefaultRenderersFactory(Context, @ExtensionRendererMode int, long)생성자가 삭제됩니다. 대신DefaultRenderersFactory(Context)생성자와DefaultRenderersFactory#setExtensionRendererMode및DefaultRenderersFactory#setAllowedVideoJoiningTimeMs를 사용합니다.- 모든 공개
CronetDataSource생성자가 삭제됩니다. 대신CronetDataSource.Factory를 사용합니다.
- 다음
IntDefs만@Target(TYPE_USE)로 변경됩니다. 이로 인해 Kotlin에서 사용 관련 컴파일이 중단될 수 있습니다. 주석을 이동하여 유형(Int)을 주석 처리함으로써 문제를 해결할 수 있습니다.@AacAudioObjectType@Ac3Util.SyncFrameInfo.StreamType@AdLoadException.Type@AdtsExtractor.Flags@AmrExtractor.Flags@AspectRatioFrameLayout.ResizeMode@AudioFocusManager.PlayerCommand@AudioSink.SinkFormatSupport@BinarySearchSeeker.TimestampSearchResult.Type@BufferReplacementMode@C.BufferFlags@C.ColorRange@C.ColorSpace@C.ColorTransfer@C.CryptoMode@C.Encoding@C.PcmEncoding@C.Projection@C.SelectionReason@C.StereoMode@C.VideoOutputMode@CacheDataSource.Flags@CaptionStyleCompat.EdgeType@DataSpec.Flags@DataSpec.HttpMethods@DecoderDiscardReasons@DecoderReuseResult@DefaultAudioSink.OutputMode@DefaultDrmSessionManager.Mode@DefaultTrackSelector.SelectionEligibility@DefaultTsPayloadReaderFactory.Flags@EGLSurfaceTexture.SecureMode@EbmlProcessor.ElementType@ExoMediaDrm.KeyRequest.RequestType@ExtensionRendererMode@Extractor.ReadResult@FileTypes.Type@FlacExtractor.Flags(com.google.android.exoplayer2.ext.flac패키지 내)@FlacExtractor.Flags(com.google.android.exoplayer2.extractor.flac패키지 내)@FragmentedMp4Extractor.Flags@HlsMediaPlaylist.PlaylistType@HttpDataSourceException.Type@IllegalClippingException.Reason@IllegalMergeException.Reason@LoadErrorHandlingPolicy.FallbackType@MatroskaExtractor.Flags@Mp3Extractor.Flags@Mp4Extractor.Flags@NotificationUtil.Importance@PlaybackException.FieldNumber@PlayerNotificationManager.Priority@PlayerNotificationManager.Visibility@PlayerView.ShowBuffering@Renderer.State@RendererCapabilities.AdaptiveSupport@RendererCapabilities.Capabilities@RendererCapabilities.DecoderSupport@RendererCapabilities.FormatSupport@RendererCapabilities.HardwareAccelerationSupport@RendererCapabilities.TunnelingSupport@SampleStream.ReadDataResult@SampleStream.ReadFlags@StyledPlayerView.ShowBuffering@SubtitleView.ViewType@TextAnnotation.Position@TextEmphasisSpan.MarkFill@TextEmphasisSpan.MarkShape@Track.Transformation@TrackOutput.SampleDataPart@Transformer.ProgressState@TsExtractor.Mode@TsPayloadReader.Flags@WebvttCssStyle.FontSizeUnit
버전 1.0.0-alpha01
2021년 10월 27일
androidx.media3:media3-*:1.0.0-alpha01이 출시되었습니다.
버전 1.0.0-alpha01에 포함된 커밋을 확인하세요.
새로운 기능
Media3은 ExoPlayer 등의 미디어 지원 라이브러리를 위한 새로운 공간입니다. 첫 번째 알파 버전에는 다음과 같은 미디어 사용 사례 구현을 위한 라이브러리의 초기 기능 구현이 포함되어 있습니다.
- 맞춤설정과 확장이 쉬운 Android용 애플리케이션 수준 미디어 플레이어인 ExoPlayer.
- 재생을 노출하고 제어하는 미디어 세션 기능. 이 새로운 세션 모듈은 ExoPlayer와 같은
Player인터페이스를 사용합니다. - 미디어 재생 사용자 인터페이스를 빌드하는 UI 구성요소.
- ExoPlayer와 함께 사용할 다른 라이브러리의 모듈 래핑 기능(예: IMA SDK를 통한 광고 삽입).
자세한 내용은 Media3 GitHub 프로젝트를 참고하세요.
ExoPlayer는 이전에 별도의 ExoPlayer GitHub 프로젝트에서 호스팅되었습니다. Media3에서 패키지 이름은
androidx.media3.exoplayer입니다. Google에서는 앱에 Media3으로 이전할 시간을 제공하기 위해 한동안 ExoPlayer GitHub 프로젝트를 계속 유지하고 출시할 계획입니다. Media3은 모든 ExoPlayer 모듈을 대체합니다. 단, 기존 media2 및 mediasession 확장 프로그램은 예외인데 이는 새 media3-session 모듈로 대체됩니다. 따라서 어댑터/커넥터 클래스를 사용하지 않고도 플레이어와 미디어 세션을 직접 통합할 수 있습니다.