Media3
| 최근 업데이트 | 안정화 버전 | 출시 후보 버전 | 베타 버전 | 알파 버전 |
|---|---|---|---|---|
| 2026년 10월 26일 | 1.11.1 | - | - | 1.12.0-alpha02 |
종속 항목 선언
Media3의 종속 항목을 추가하려면 프로젝트에 Google Maven 저장소를 추가해야 합니다. 자세한 내용은 Google Maven 저장소를 읽어보세요.
다음과 같이 앱 또는 모듈의 build.gradle 파일에 필요한 아티팩트의 종속 항목을 추가합니다.
Groovy
dependencies { def media3_version = "1.11.1" // 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 Jetpack Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs using Jetpack Compose with Material Design 3 implementation "androidx.media3:media3-ui-compose-material3:$media3_version" // For building media playback UIs using Views implementation "androidx.media3:media3-ui:$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 inspecting media files implementation "androidx.media3:media3-inspector:$media3_version" // For extracting and processing video frames implementation "androidx.media3:media3-inspector-frame:$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 applying Lottie effects on video frames implementation "androidx.media3:media3-effect-lottie:$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.11.1" // 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 inspecting media files implementation("androidx.media3:media3-inspector:$media3_version") // For extracting and processing video frames implementation("androidx.media3:media3-inspector-frame:$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 applying Lottie effects on video frames implementation("androidx.media3:media3-effect-lottie:$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.12.0
버전 1.12.0-alpha02
2026년 10월 26일
버전 1.12.0-alpha02에는 다음 커밋이 포함되어 있습니다.
- 효과 Play 서비스:
- 동영상 자동 개선 기능을 위한
EnhancementSessionDecorator및 오디오 소스 분리를 위한StudioSoundAudioProcessor를 비롯하여 Google Play 서비스 미디어 효과를 제공하는 새로운media3-effect-play-services모듈을 도입합니다.
- 동영상 자동 개선 기능을 위한
버전 1.12.0-alpha01
2026년 10월 21일
버전 1.12.0-alpha01에는 다음 커밋이 포함되어 있습니다.
- 공통 라이브러리:
C.COLOR_SPACE_DISPLAY_P3를 추가하고MediaFormatUtil및ColorInfoISO 색상 매핑에서 Display P3 색공간을 지원합니다.- 실험용 기능 플래그 및 단계적 출시를 관리하기 위해 중앙
Flags레지스트리를 추가했습니다 (Flags.setCanaryModeEnabled). 새 플래그 API를 사용하도록 기존@ExperimentalApi메서드를 많이 이전했습니다. MediaMetadata.playlistId,MediaMetadata.Builder.setPlaylistId(String),MediaMetadata.categories,MediaMetadata.Builder.setCategories(List<String>)를 추가합니다.androidx.media3.common.util.NonNullApi를 JSpecifyorg.jspecify.annotations.NullMarked로 바꿉니다.
- ExoPlayer:
- 다음 기간의 첫 번째 청크가 로드되지 않을 때 DASH 다중 기간 재생이 중단되는 문제를 해결합니다(#3396).
- 로드 재시도가 소진되면
AnalyticsListener.onLoadError및MediaSourceEventListener.onLoadError에서wasCanceled = true를 보고합니다. ExoPlayer.addVideoFrameMetadataListener및ExoPlayer.removeVideoFrameMetadataListener를 사용하여 여러VideoFrameMetadataListener인스턴스 등록을 지원하고ExoPlayer.setVideoFrameMetadataListener및ExoPlayer.clearVideoFrameMetadataListener를 지원 중단합니다.- 각 기간의
AdPlaybackState를 분할하고 오프셋하여 다중 기간 콘텐츠 (예: DASH)의 광고 지원을 추가합니다. - 진행 중인 준비 요청을 취소해도 백그라운드 다운로드가 시작될 수 있는
PreCacheHelper의 경합 상태를 수정합니다. ProgressiveMediaSource및DefaultMediaSourceFactory의setLoadOnlySelectedTracks(true)을 제한하여 선택되지 않은 동영상 및 이미지 트랙만 필터링합니다. 오디오 및 텍스트 트랙은 항상 로드되어 다시 버퍼링하지 않고도 원활한 트랙 전환이 가능합니다.ProgressiveMediaSource및DefaultMediaSourceFactory에서 기본적으로setLoadOnlySelectedTracks(true)를 사용 설정합니다. 이렇게 하면 메모리가 절약되고 일부 트랙만 선택된 경우DefaultLoadControl버퍼 할당 계산이 더 정확하게 작동합니다. 선택되지 않은 동영상 또는 이미지 트랙이 재생 중에 새로 사용 설정되면 추가 버퍼링이 발생할 수 있습니다.- 동적 예약이 사용 설정된 경우
Player.getCurrentPosition()가 오래된 값을 반환할 수 있는 문제 (초당 몇 번만 업데이트됨)를 수정했습니다 (#3286). AudioTrack재생 헤드 위치가 예기치 않게 감소하거나 재설정되는 경우 정수 오버플로로 잘못 처리되어 버퍼링 중에 재생이 중단되는 문제를 해결합니다(#3407).- 실험용
DefaultMediaCodecAdapterFactory.setAsyncCryptoSynchronizationEnabled(boolean)를 삭제합니다. - 전면 광고 또는 광고에서 끝부분이 잘린 콘텐츠로 돌아갈 때 불필요한 렌더러 재사용 설정 및 결함을 방지합니다(#3371).
Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION가 사용 설정된 경우 예정된 재생목록 항목의 렌더러 오류로 인해 현재 재생이 조기에 중단될 수 있는 문제를 수정했습니다.Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION가 사용 설정된 경우ExoPlayer가 렌더러를 준비되지 않은 미디어 기간으로 전환하면 발생할 수 있는NullPointerException를 수정했습니다.Flags.FLAG_VIDEO_RENDERER_DURATION_TO_PROGRESS가 사용 설정된 경우 동적 예약 중에 동영상 프레임이 예기치 않게 건너뛰거나 삭제될 수 있는 문제를 수정합니다.- 라이브 스트림에서 광고 중에 재생을 중지할 때 분석 리스너에서 발생하는
ArrayIndexOutOfBoundsException를 수정했습니다. (#3423) preload()가 호출되지 않을 때PreloadMediaSource가 예기치 않게 사전 로드 이벤트를 게시할 수 있는 문제를 수정했습니다(#3408).- 메타데이터 트랙에서
Format.subsampleOffsetUs가 무시되어 디코딩된 SCTE-35 스플라이스 명령어에서 재생 타임스탬프가 잘못되는 문제를 수정했습니다 (#3413). - 동일한 소스에서
preload()가 여러 번 호출될 때PreloadMediaSource및DefaultPreloadManager의 메모리 누수를 수정했습니다(#3445). - 콘텐츠 타임라인 새로고침이 대기 중인 동안
AdsMediaSource를 출시할 때 발생하는NullPointerException를 수정했습니다. (#3442) - 탐색 후 로드 (또는 0이 아닌 위치에서 재생을 시작할 때)가 실패하고 재시도될 때 프로그레시브 미디어 재생이 잘못된 위치로 이동할 수 있는 문제를 해결했습니다(#3440).
- 원활한 해상도 변경 시 Xiaomi TV Stick 4K (MiTV-AYFR0) H.264 디코더가 정지되는 문제의 해결 방법을 추가합니다(#3457).
- 게시된 로드 완료 또는 오류 콜백이 실행되기 전에 추적기가 중지될 때
SteeringManifestTracker의NullPointerException를 수정했습니다 (#3443). - MP4 파일의
mebx박스 메타데이터 트랙에서 HAGC (ST 2094-50) 시간 제한 메타데이터 재생을 지원합니다. - 재생목록에서 준비 속도가 느린 미디어 기간을 건너뛸 수 있는 문제를 해결합니다.
- CompositionPlayer:
- 재생 워크플로에
Composition.Builder.setVideoFrameAggregationParameters를 사용하여 동영상 프레임 집계의 프레임 속도 구성을 지원합니다. - 프레임 집계 중에 타임스탬프가 가장 가까운 프레임을 선택하여 타임스탬프 양자화 또는 반올림 불일치로 인해 발생하는 다중 시퀀스 컴포지션의 프레임 드롭을 수정합니다. 이는 동영상 시퀀스당 하나의 추가 프레임을 전송 중에 유지해야 하므로 API 29에서만 사용 설정됩니다.
- 재생 워크플로에
- 변환기:
- 내보내기 워크플로에
Composition.Builder.setVideoFrameAggregationParameters를 사용하여 동영상 프레임 집계의 프레임 속도 구성을 지원합니다. - 프레임 집계 중에 타임스탬프가 가장 가까운 프레임을 선택하여 타임스탬프 양자화 또는 반올림 불일치로 인해 발생하는 다중 시퀀스 컴포지션의 프레임 드롭을 수정합니다. 이는 동영상 시퀀스당 하나의 추가 프레임을 전송 중에 유지해야 하므로 API 29에서만 사용 설정됩니다.
AudioProcessors를 사용할 때Transformer#setAudioMimeType(AUDIO_RAW)를 준수합니다. 이 수정 전에는MimeTypes.AUDIO_RAW를 요청하고AudioProcessor를 적용하면 출력이 압축되었습니다.
- 내보내기 워크플로에
- 트랙 선택:
- 일부 기기에서 지원되는 Dolby Vision 트랙보다 SDR 트랙이 잘못 선호되는 문제를 수정합니다. (#3135)
- 추출기:
- Mp4Extractor: MP4의 Opus에서
dOps상자 파싱을 수정했습니다. 여기서PreSkip,InputSampleRate,OutputGain가 빅 엔디안에서 리틀 엔디안으로 변환되지 않아 수정 목록이 없을 때 오디오의 처음 약 299ms가 삭제되었습니다(#3431). - H.264 및 H.265의 GOP 내 샘플 종속 항목 파싱이 기본적으로 사용 설정되므로
Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES,Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265,FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES,FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265를 삭제합니다. - Mp4Extractor: 고도 좌표가 포함된
xyz상자에서 위치 메타데이터 파싱을 수정하여Mp4LocationData를 채웁니다. ExtractorUtil.getFramesPerEncodedSample를 추가하여 인코딩된 오디오 형식의 샘플당 오디오 프레임 수를 계산합니다(#3367).Mp4Extractor에FLAG_READ_XMP_METADATA를 추가하여 최상위 UUID 상자에서 XMP 메타데이터를 추출합니다.- 페이로드가 오디오 리더에 전달되기 전에
PsExtractor의 각 PES 패킷에서private_stream_1하위 스트림 헤더를 제거하여 DVD 스타일 MPEG-PS 콘텐츠를 재생할 때 손상된 AC-3, DTS, LPCM 오디오를 수정합니다 (#3327). - 버전 1
tfdt상자가 음수baseMediaDecodeTime를 인코딩할 때FragmentedMp4Extractor의 실패를 수정했습니다(#3412). - MPEG-TS: H.264 및 H.265 프레임 패킹 배열 SEI 메시지를 파싱하여
Format.stereoMode를 채우도록 지원합니다(#3419). - Dolby Vision 프로필 20 구성 데이터를 파싱하고 잘못된 색상의 표준 HEVC로 재생하는 대신 지원되지 않는 Dolby Vision 프로필을 거부합니다 (#3427).
- MP3: 많은
MediaCodecMP3 디코더와 호환되지 않으므로 LAME/Xing 인코더 지연 및 패딩 메타데이터 조정을 되돌립니다(#3425). - Matroska: 중첩된
ChapterAtom요소를 파싱할 때NullPointerException를 수정합니다 (#3438). - Ogg: 크기가 255바이트의 배수이고 페이지 경계에서 끝나는 패킷이 다음 패킷과 병합되는 버그를 수정했습니다.
- MP4:
Mp4Extractor및FragmentedMp4Extractor에서mebx박스형 시간 제한 메타데이터 트랙을 파싱합니다.it35키를 전달하는 트랙은MimeTypes.APPLICATION_ITUT_T35로 노출됩니다 (HAGC 재생 사용 설정).FLAG_EMIT_RAW_MEBX_DATA가 설정되지 않는 한 다른mebx트랙은 무시됩니다. 이 경우 모든mebx트랙은 원시MimeTypes.APPLICATION_MEBX로 내보내집니다. - Ogg: 끊김 없는 재생을 위해 Opus 종료 패딩 추출을 지원하고(#2576) 연속 패킷으로 시작하는 페이지를 탐색한 후 샘플 타임스탬프를 수정합니다.
- Ogg: 스트림 중간의 Opus ID 및 주석 헤더 패킷을 무시하여 연결된 Ogg Opus 스트림의 디코딩 오류 및 약 1초 타임스탬프 점프를 수정합니다.
- Mp4Extractor: MP4의 Opus에서
- 검사기:
MetadataRetriever를 사용하여 MP4 파일에서 XMP 메타데이터를 가져오는 기능을 지원합니다.MediaExtractorCompat에서mebx박스형 시간 제한 메타데이터 트랙을MimeTypes.APPLICATION_MEBX로 추출하는 기능을 지원합니다.
- 검사기 프레임:
FrameExtractor를 사용하여 울트라 HDR 프레임을 추출할 때 SDR 기본 이미지에서 넓은 색 영역 BT.2020 색상의 클리핑을 수정합니다. 색 영역을 벗어난 색상은 이제 고정되는 대신 sRGB 색 영역으로 부드럽게 압축됩니다.
- 오디오:
- 잘못된 스레드에서
android.media.AudioDeviceCallback를 호출하는 기기의 해결 방법을 추가합니다(#3386). - 압축 오프로드를 사용한 트랙 전환 후 재생이 중단될 수 있는 문제를 수정합니다.
- 기간 전환 중에 AC-3 오디오가 정지될 수 있는 Amazon Fire TV 스틱의 문제를 해결합니다(#3448).
- Ogg 및 WebM/Matroska Opus 끊김 없는 재생을 위한 스트림 끝 인코더 패딩 자르기를 지원합니다(#2576).
- 트랙 전환 중에 동적 오프로드 끊김 없는 지연 및 패딩 업데이트를 수정하여 재생 중인 트랙이 아닌 수신 트랙에 적용되도록 합니다.
- 재생목록 중간의 끊김 없는 전환 외에도 단일 스트림 및 재생목록의 최종 스트림에서 인코더 끝 패딩을 자릅니다(#2576).
- 스트림 시작 인코더 지연 자르기가 완료되고 스트림 끝 패딩을 자를 필요가 없는 경우
TrimmingAudioProcessor에서 불필요한 오디오 버퍼 복사를 방지합니다.
- 잘못된 스레드에서
- 동영상:
- 출시 타임스탬프가 동일한 지연 동영상 프레임의 보고를 수정하여 건너뛰는 대신 삭제된 것으로 보고합니다.
- 텍스트:
- 효과:
- StudioSound GMSCore 모듈을 사용하여 오디오 소스 분리를 위한
SoundSeparationAudioProcessor를 구현합니다.
- StudioSound GMSCore 모듈을 사용하여 오디오 소스 분리를 위한
- 멀티플렉서:
PreSkip,InputSampleRate,OutputGain가 빅 엔디안 대신 리틀 엔디안으로 작성된Mp4Muxer및FragmentedMp4Muxer의 Opus에 대한dOps상자 작성을 수정합니다(#3431).Mp4Muxer를 사용하여Mp4LocationData에 GPS 고도 쓰기를 지원합니다.ParcelFileDescriptor에 직접 멀티플렉싱을 허용하려면Muxer.Factory.create(ParcelFileDescriptor)를 추가합니다.- 조각화된 MP4 파일의
traf상자에 기본적으로tfdt(트랙 조각 기본 미디어 디코딩 시간) 상자를 작성하여 미디어 디코딩 타임스탬프를 제공합니다. Mp4Muxer에서 E-AC-3 및 E-AC-3 JOC (Dolby Atmos)dec3컨테이너 상자 작성을 지원합니다.MediaMuxerCompat에 WebM 형식 지원을 추가합니다.FLAG_READ_MFRA_FOR_SEEK_MAP를 사용하여FragmentedMp4Extractor에서 탐색할 수 있도록 프래그먼트 MP4 파일 끝에mfra(영화 프래그먼트 무작위 액세스) 상자를 작성합니다.- 다른 샘플이 작성되기 전에 EOS 샘플을 작성할 때
Mp4Writer및FragmentedMp4Writer에서 발생하는 비정상 종료를 수정합니다. - 컨테이너 헤더에
dby1호환 브랜드를 알려 Dolby 콘텐츠를 MP4 또는 프래그먼트 MP4 파일로 다중화할 때 컨테이너 규정 준수를 수정합니다 (#3369). Mp4Muxer및FragmentedMp4Muxer에서 32비트 부동 PCM 오디오 트랙을 지원합니다(#3389).- 트랙을 추가할 때
Mp4Muxer및FragmentedMp4Muxer에서 지원되지 않는 Dolby Vision 프로필을 거부합니다. Mp4Muxer및FragmentedMp4Muxer에서 24비트 및 32비트 정수 PCM 오디오 트랙을 지원합니다.
- IMA 확장 프로그램:
ImaServerSideAdInsertionMediaSource에서 플레이어 일시중지 및 재개 이벤트를 IMA SDK에 전달합니다.
- 세션:
MediaConstants.EXTRAS_KEY_PLAYLIST_ID,MediaConstants.EXTRAS_KEY_PLAYLIST_TITLE,MediaConstants.EXTRAS_KEY_PLAYLIST_ARTWORK_URI,MediaConstants.EXTRAS_KEY_CATEGORIES를 추가하여 기존 메타데이터 및 설명에서 재생목록 및 항목 메타데이터를 채우고MediaConstants.EXTRAS_KEY_SUGGESTED_TYPE및MediaConstants.EXTRAS_KEY_TTL_SECONDS를 추가하여 추천LibraryParams.extras를 채웁니다.- 엄격한
PendingIntent제한을 적용하는 기기에서MediaSession를 만들거나 해제할 때 발생하는SecurityException비정상 종료 문제를 해결했습니다. MediaSessionService가 아직 포그라운드에 있지 않을 때 Android 12 (API 31 및 32)에서 재생 요청 중에MediaSession.getControllerForCurrentRequest()가null를 반환하는 문제가 해결되었습니다.MediaController가 음수 최대 볼륨을 보고하는 기존 세션에 연결할 때 발생하는IllegalArgumentException비정상 종료를 수정합니다.- 일시중지된 기존
MediaSessionCompat에서MediaController.setMediaItem또는setMediaItems를 호출한 후play()를 호출하면onPlayFrom*대신 지원되지 않는onPrepareFrom*콜백을 전달하거나 요청된 미디어 항목을 다시 초기화하지 않고onPlay()를 전달할 수 있는 문제가 수정되었습니다. - 커스텀 명령어 응답을 수신할 때 기존
MediaBrowser의NullPointerException를 수정했습니다(#3432). - 기본
Bundle에 중복 키가 있는 기존 메타데이터를 수신할 때 발생하는IllegalArgumentException비정상 종료를 수정합니다. - 기존
MediaSessionCompat를 제어할 때 동일한Looper반복 내에서 이루어진 발신MediaControllerCompat.TransportControls호출을 병합합니다 (예: 이제setMediaItem,prepare,play를 함께 호출하면 단일onPlayFrom*콜백이 전달됨).
- UI:
- 양방향 텍스트 줄바꿈이 사용 설정된 경우 RTL 자막 구두점 위치 지정 및 스팬 범위 유지를 수정합니다(#3454, #3455).
TrackSelectionState및TrackSelectionParametersState클래스와 이에 상응하는 구성 가능한 상태 기억 함수를media3-ui-compose모듈에 추가합니다.PresentationState.videoAspectRatio를 도입하고Modifier.resizeWithContentScale가sourceSizeDp: Size?대신aspectRatio: Float?를 사용하도록 합니다.- 플레이어의 현재 큐를 수신 대기하기 위해
CuesState클래스와rememberCuesState컴포저블을media3-ui-compose모듈에 추가합니다. ProgressSlider가ExoPlayer또는CompositionPlayer를 기반으로 하는 경우 스크러빙 모드 지원을 추가합니다.PresentationState에showArtwork지원을 추가하고 이를 사용하여ContentFrame및Player에서 제공된 선택적artwork컴포저블의 렌더링 시간을 측정합니다.artwork슬롯의 기본값으로 사용할Artwork컴포저블을 추가합니다.PlayPauseButtonState(showBuffering,showRetry,showReplay)에 새 필드를 추가하고PlayPauseButton에서 사용하여 더 많은 아이콘과 버퍼링 표시기를 렌더링합니다.- 맞춤 재생 상태 관찰을 허용하는
PlaybackState클래스를 추가하고BufferingIndicator를 버튼 독립 구성요소로 도입합니다. - 다중 기간 라이브 스트림의 라이브 포스트롤 자리표시자에 대해
PlayerView및PlayerControlView가 기간 경계에 광고 마커를 표시하는 문제가 해결되었습니다. Player,ContentFrame,PlayerDefaults,MiniController의 컴포저블 슬롯은 더 이상 플레이어 또는 컨트롤 공개 상태를 매개변수로 수신하지 않습니다. 대신 호출 범위에서 캡처합니다 (예:topControls가 이제@Composable BoxScope.() -> Unit임). 이는 불안정한 API에 관한 브레이킹 체인지입니다.alignment매개변수를ContentFrame,Player,Modifier.resizeWithContentScale에 추가하여 조정된 콘텐츠를 컨테이너 내에 배치하고ContentFrame의 콘텐츠를 경계에 맞게 잘라ContentScale.Crop로 조정된 동영상이 더 이상 경계 외부에 그려지지 않도록 합니다.isLive및liveOffsetMs를 노출하여ProgressSlider,ProgressStateWithTickCount,ProgressStateWithTickInterval에 라이브 스트림 UI 지원을 추가합니다.LiveButton컴포저블을media3-ui-compose-material3에 추가합니다(#2213).
- Ktor 확장 프로그램:
KtorDataSource가 스트림 중간 연결 실패를HttpDataSourceException를 발생시키는 대신 입력 종료로 처리할 수 있는 문제를 수정했습니다(#3460).
- HLS 확장 프로그램:
EXT-X-STREAM-INF및EXT-X-I-FRAME-STREAM-INF의VIDEO-RANGE(PQ및HLG)를Format.colorInfo로 파싱합니다(#3441).- PES 미디어 샘플이 포함된 MPEG-TS
EXT-X-MAP초기화 세그먼트를 파싱할 때NullPointerException를 수정합니다(#3456). - 노출된 HLS 트랙의
Format.id및Format.metadata가null인 회귀를 수정합니다. (#3402) - 애셋 목록 광고를
X-PLAYOUT-LIMIT로 자르고 한도를 완전히 초과하는 광고는 건너뜁니다. 전면 광고에서X-RESUME-OFFSET를 생략하고X-PLAYOUT-LIMIT가 설정되어 있어도 지속 시간을 알 수 없는 경우 콘텐츠 재개 오프셋을 기본값인 0으로 설정합니다. X-ASSET-LIST전면 광고를 해결하면 동일한 광고 그룹에 있는 다른 전면 광고의 콘텐츠 재개 오프셋 기여도가 덮어쓰여지는 문제가 해결되었습니다.
- DASH 확장 프로그램:
DashManifestParser에서 대체 MPD 삽입(urn:mpeg:dash:event:alternativeMPD:insert:2025) 및 대체(urn:mpeg:dash:event:alternativeMPD:replace:2025) 이벤트 파싱을 지원하고Period.alternativeMpdEvents에서AlternativeMpdEvent인스턴스로 노출합니다. 이는DashManifestParser를 서브클래스로 분류하는 앱의 브레이킹 체인지입니다. 이제DashManifestParser.buildPeriod는 추가List<AlternativeMpdEvent>매개변수를 사용하며 이전 오버로드는 삭제되었습니다.DashManifestParser.parseEventStream(XmlPullParser)를 재정의하는 앱은 대신DashManifestParser.parseEventStream(XmlPullParser, String)를 재정의해야 합니다. 전자는 지원 중단되었으며 향후 출시에서 비공개로 설정될 예정이기 때문입니다.EssentialProperty및SupplementalProperty설명자에서 CICP 색상 정보 (ColourPrimaries,TransferCharacteristics,MatrixCoefficients,VideoFullRangeFlag)를Format.colorInfo로 파싱합니다(#3426).- 트릭 모드(
http://dashif.org/guidelines/trickmode) 설명어@value속성에서 공백으로 구분된@id값 목록을 지원합니다 (#3315). DashManifestParser에서<ProducerReferenceTime>파싱을 지원하고,AdaptationSet.producerReferenceTimes에서 노출하고, VOD 스트림의Timeline.Window.presentationStartTimeMs및Timeline.Window.windowStartTimeMs를 채우는 데 사용합니다.- DASH 콘텐츠 조정 지원을 추가합니다. (#1689)
<UTCTiming>요소에 누락된 속성이 있는 DASH 매니페스트를 파싱할 때 발생할 수 있는NullPointerException를 수정했습니다(#3436).
- RTSP 확장 프로그램:
- RTSP 클라이언트가 종료된 후 지연된 네트워크 응답을 처리할 때 발생하는
IllegalStateException비정상 종료를 수정했습니다. - 빠른 스크러빙으로 인해 TCP 프로토콜 대체 메커니즘이 잘못 트리거되는 문제가 해결되었습니다.
- 트랙 재선택, 세션 해제 또는 URI 리디렉션 중에 RTSP 클라이언트가 상태를 재설정한 후 지연된 네트워크 응답을 처리할 때 발생할 수 있는
IllegalStateException비정상 종료를 수정합니다. - 재생을 다시 시작하기 전에 다시 탐색하면
IllegalStateException이 비정상 종료되는 문제를 수정했습니다. - 탐색이 이미 대기 중인 상태에서 뒤로 탐색하면 오디오 끊김 및 동영상 재생 정지가 발생할 수 있는 문제를 해결했습니다.
- 집계 또는 비IDR 패킷으로 끝나는 H.264 및 H.265 키프레임 액세스 단위가 키프레임으로 플래그 지정되지 않아 재생이 버퍼링 상태로 유지되는 문제를 해결합니다(#3434).
- RTSP 클라이언트가 종료된 후 지연된 네트워크 응답을 처리할 때 발생하는
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1 등):
- Opus 확장 프로그램: 잘못된 Opus 데이터를 디코딩할 때 발생하는 JNI 비정상 종료 문제를 수정했습니다.
- Opus 확장 프로그램: 사전 건너뛰기 및 삭제 패딩이 동일한 패킷에 속할 때 삭제 패딩이 무시되는 문제를 수정했습니다(#2576).
- Cast 확장 프로그램:
- 세션을 사용할 수 없는 이유를 나타내는
SessionAvailabilityListener.SessionUnavailableReason를 도입하고 이를 노출하는SessionAvailabilityListener.onCastSessionUnavailable의 오버로드된 메서드를 제공합니다. - Cast 세션을 중지한 후 로컬에서 재생이 예기치 않게 재개되는 문제가 해결되었습니다.
RemoteCastPlayer에서RemoteMediaClient작업 (예: 재생, 일시중지, 속도 변경, 반복 모드, 볼륨, 음소거, 트랙 선택)이 실패하면 오류를 로깅합니다(#3373).- 탐색 작업이 대기 중인 동안 Cast 수신기 대기열이 변경되거나 축소될 때
RemoteCastPlayer의ArrayIndexOutOfBoundsException를 수정했습니다(#3372). - 기본 Cast 수신기의 문제로 인해 타임라인이 전체 재생목록이 아닌 활성 항목을 바로 둘러싼 미디어 항목만 채우는 문제를 해결합니다(#3129).
- 재생목록 (
setMediaItems,addMediaItems,moveMediaItems,removeMediaItems)을 수정하거나RemoteCastPlayer에서 탐색할 때 타임라인과 재생 위치를 즉시 업데이트하고 연속 재생목록 작업을 큐에 추가하여 순서대로 안정적으로 실행합니다. (#2639, #3272) RemoteCastPlayer의 빈 대기열에서addMediaItems를 호출하면 Cast 수신기에서 미디어 항목을 로드하지 못하는 문제를 해결합니다(#2402).RemoteCastPlayer에서 Cast 수신기 큐의 끝에 도달하면 재생목록을 유지하는 대신 타임라인을 지우는 문제를 수정했습니다.- 미디어 항목을 로드하기 전에
RemoteCastPlayer에 설정된 경우playWhenReady,repeatMode,playbackParameters가 전송되거나 적용되지 않는 문제를 수정했습니다 (예:CastPlayer에서 로컬에서 원격으로 재생 전송 중). (#889)
- 세션을 사용할 수 없는 이유를 나타내는
- 데모 앱:
- DRM으로 보호된 미디어 항목과 추가 HLS 샘플 스트림에 대한 지원을 세션 데모 앱 카탈로그에 추가합니다.
- 전송 중에 자막 및 오디오 트랙 선택을 사용 설정하려면 세션 데모 앱에서
CastTrackSelector를 사용하여RemoteCastPlayer를 구성합니다.
- 지원 중단된 기호 삭제:
DashUtil.buildDataSpec(Representation, RangedUri, int)및DashUtil.buildDataSpec(Representation, String, RangedUri, int)를 삭제합니다. 대신DashUtil.buildDataSpec(Representation, BaseUrl, RangedUri, int, Map<String, String>)를 사용하세요.
- 빌드:
- Gradle
minSdk을 24로 늘립니다.
- Gradle
버전 1.11.0
1.11.1
2026년 9월 10일
- ExoPlayer:
- 프로그레시브 미디어의 HAGC 메타데이터를 사용 설정/사용 중지하는 플래그를
MediaSource.Factory에서ExtractorsFactory로 이동합니다. 이전setExperimentalEnableHagcPlayback메서드가 삭제되고ExtractorsFactory.setParseHagcMetadata로 대체됩니다. 이렇게 하면 Matroska/WebM 컨테이너에서 사용 중지가 작동하지 않는 문제도 해결됩니다. - 비전이적 보조 렌더기를 미리 준비할 때 발생하는 재생 중단 문제를 수정합니다.
- 탐색이 두 렌더러를 모두 재설정하고 사용 중지할 때
Surface가 기본 렌더러로 반환되어야 하는 사전 준비 문제가 해결되었습니다. - 실시간 타임라인 새로고침으로 인해 기본 위치가 현재 재생 중인 서버 측 삽입 광고를 지나 이동할 때 발생하는
ArrayIndexOutOfBoundsException를 수정했습니다. (#3348) ScrubbingModeParameters.allowSkippingMediaCodecFlush가 사용 설정된 상태에서 탐색할 때 오래된 동영상 프레임이 잠시 표시될 수 있는 스크러빙 모드 문제가 해결되었습니다.
- 프로그레시브 미디어의 HAGC 메타데이터를 사용 설정/사용 중지하는 플래그를
- 추출기:
- Matroska: 클러스터 뒤에 배치된 트랙으로 인해 탐색 가능한 타임라인이 생성되지 않는 문제를 해결합니다(#3377).
- 오디오:
- 최소 무음 지속 시간이 프레임 크기로 인해 잘못 축소되지 않도록
SilenceSkippingAudioProcessor의 버퍼 사이즈 계산을 수정합니다 (#3271). - Android에서 정의한 대로 샘플을 부호 없는 것으로 처리하도록
PcmAudioUtil에서 8비트 PCM 처리를 수정합니다(#3271). - 제한된 하드웨어 버퍼 사이즈로 인해 프리롤 또는 끊김 없는 전환 중에 플레이백이 중단될 수 있는 오프로드 문제를 수정합니다.
- 재생 스레드가 더 이상 활성 상태가 아닐 때 출시 횟수가 감소하지 않는
DefaultAudioSink의 버그를 수정했습니다(#3338).
- 최소 무음 지속 시간이 프레임 크기로 인해 잘못 축소되지 않도록
- 세션:
- HLS 확장 프로그램:
- DASH 확장 프로그램:
presentationTimeOffset가 있는 이미지 트랙의 잘못된 샘플 타임스탬프 계산을 수정합니다(#3334).
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1 등):
- Opus: 여러
OpusDecoder인스턴스가 동시에 초기화될 때 발생하는 메모리 손상을 수정합니다. - MPEG-H:
MpeghUiManager에 명령어를 전송할 때 메모리 누수, ASCII가 아닌 문자의 잘림, 메모리가 부족한 상황에서 발생할 수 있는 네이티브 충돌을 수정합니다(#3365).
- Opus: 여러
버전 1.11.0
2026년 8월 5일
- 공통 라이브러리:
Format.channelMask를 추가하여 오디오 채널 마스크를 명시적으로 나타내고, 새로운Util.getAudioTrackChannelConfig(Format)오버로드를 추가하여 안전하게 해결합니다.- Kotlin을 2.0.20에서 2.2.0으로 업그레이드합니다.
- ExoPlayer:
- ExoPlayer에서
IllegalStateException또는IndexOutOfBoundsException를 일으킬 수 있는 타이밍 종속 동시 실행 버그를 수정합니다. AdsMediaSource에서 광고 그룹 수 확인을 완화하여 광고 그룹이 완전히 처리되면(hasUnplayedAds()가false) 광고 그룹 수가 감소하도록 허용하고 재설정 워크플로 중에 동적 광고 그룹 크기 조정을 수용합니다.- 스트림이 플래그를 보고할 수 있도록
getFlags()및FLAG_STRICT_DURATION를SampleStream에 추가하고 이러한 플래그를 동적으로 확인하도록 렌더러를 업데이트합니다. - 스트림 형식이 유효한 값을 제공하지 않는 경우
MediaCodecVideoRenderer의 프레임 속도 추정기와MediaCodecAudioRenderer의 코덱 출력 형식으로 대체하여 코덱 작동 속도를 계산하고 불필요한 코덱 재설정을 방지합니다. - 핵심 플레이어에서 클라이언트 측 삽입 광고의 콘텐츠 클리핑을 삭제합니다. 대신
AdsMediaSource가 클리핑 로직을 처리합니다. 내부적으로 콘텐츠 클리핑을 구현하려면 맞춤 클라이언트 측 삽입 광고 소스를 업데이트해야 합니다. - 형식이 올바르지만 인식되지 않는 코덱 프로필 또는 수준이 있는 트랙을
supported=YES(프로필 또는 수준 정보가 누락되거나 형식이 잘못된 트랙이 표시되는 방식) 대신supported=NO_EXCEEDS_CAPABILITIES로 표시합니다. 이렇게 하면 더 잘 지원되는 대안이 있는 경우 기기에서 지원되지 않을 가능성이 높은 트랙이 선택되지 않습니다. DefaultPreloadManager.SimpleRankingDataComparator를 추가합니다. 이는 현재 재생 중인 미디어 항목의 색인까지의 거리를 기준으로 미디어 항목의 순위를 비교하는RankingDataComparator입니다. 더 세밀하게 조정된 비교 로직이 필요한 경우 앱에서compare(Integer, Integer)메서드를 재정의할 수 있습니다. 커스텀SimpleRankingDataComparator는DefaultPreloadManager.Builder의 새 생성자를 통해 삽입할 수 있습니다.- 사용 가능한 힙 메모리가 부족한 경우 버퍼 바이트 크기 한도로 대체하여
DefaultLoadControl.prioritizeTimeOverSizeThresholds의 OOM 위험을 줄입니다. MediaItem.imageDurationUs가 설정되지 않은 경우 정지 이미지 처리를 정렬합니다. 이제 JPEG 및 HEIC 정지 이미지가 매우 짧은 기본 시간으로 '재생'됩니다 (PNG 및 기타 이미지가 이전에 작동한 방식과 동일).MediaSource.prepareSource(MediaSourceCaller, PlayerId, BandwidthMeter)를 추가하여BandwidthMeter를MediaSource에 연결합니다. 커스텀 구현이 포함된 지원 중단된 메서드는 기본적으로 계속 호출되지만, 새 메서드를 구현하고BandwidthMeter.getTransferListener()를 사용하여 이전 메서드와 패리티를 맞추는 것이 좋습니다.DefaultBandwidthMeter에서 맞춤InitialBitrateSupplier지원을 추가합니다. 이렇게 하면 앱이 초기 비트 전송률 추정치를 결정하는 자체 로직을 제공할 수 있으며, 이 로직은DefaultBandwidthMeter생성 시와 네트워크 유형 변경 시 사용됩니다. 공급업체는DefaultBandwidthMeter.Builder.setInitialBitrateSupplier()을 통해 설정할 수 있습니다.- 기본적으로 동적 예약을 사용 설정합니다.
ExoPlayer재생 작업 루프는 정적 간격이 아닌 동적으로 실행됩니다. - 프리롤 샘플이 있는 트랙을 활성 재생에 조인할 때 발생할 수 있는 불필요한 재설정을 삭제합니다.
DefaultBandwidthMeter에서getInitialBitrateCountryGroupAssignment를 최적화하여 배열 대신 32비트 정수로 압축된 국가 그룹 할당을 반환하여 코드 크기를 줄이고 할당을 방지합니다.- 버퍼 크기를 절반으로 줄이는 다른 재시도가 실패할 경우 재시도 로직이 항상 최소 1초의 버퍼 크기를 시도하도록 하여 일부 기기에서
AudioTrack초기화 실패를 수정합니다(#3207). - 입력 버퍼를 수신하기 전에 이전에 플러시된 경우 코덱이 모든 샘플을 삼키는 일부 기기의 코덱 문제를 수정했습니다.
- 스트림별로 미디어 처리를 진행할 수 있도록 실험용
ExoPlayer.Builder.enablePerStreamMediaProgression()를 추가합니다. 이렇게 하면 재생목록 항목 간의 시작 지연 시간이 줄어들고 매우 짧은 콘텐츠로 인해 재생이 '중단'되는 것을 방지할 수 있습니다(#3122). setAudioSessionId에서 설정한 값 대신ExoPlayer에서 자동 생성한 초기 오디오 세션 ID가 사용되는 오디오 세션 ID 사용과 관련된 경합 상태를 수정합니다(#3241).- 프로그레시브 미디어 (예: MP4, Matroska)에 대한 실험용 HAGC (ST 2094-50) 시간 제한 메타데이터 재생 지원을 추가합니다. 플레이어는 HAGC 메타데이터 트랙을 연결된 동영상 트랙과 자동으로 병합하고 API 37 이상 기기의 디코더에 대역 외 메타데이터를 전송합니다. 이 동작은
DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false)를 통해 사용 중지할 수 있습니다. - 트랙 선택에서
Format의 상대적 환경설정을 나타내는Format.selectionPriority를 추가합니다(#3236). - '스트림 끝'으로 탐색할 때 스크러빙이 중단될 수 있는 잠재적인 스크러빙 모드 문제를 수정합니다.
- ExoPlayer에서
- CompositionPlayer:
TrackSelector인스턴스가 해제되지 않는 문제가 해결되었습니다.
- 변환기:
ExportResult.fileSizeBytes가 과다 보고될 수 있는 문제를 수정했습니다.
- 트랙 선택:
BaseTrackSelection.DEFAULT_FORMAT_COMPARATOR를 노출하고AdaptiveTrackSelection.Factory.setTrackFormatComparator를 추가하여 비트 전송률 전용 순서 지정 외에 맞춤 형식 순서 지정 및 ABR 선택 우선순위를 허용합니다.- 트랙 선택 매개변수를 빠르게 순차적으로 업데이트하면 일부 업데이트가 손실되거나 덮어쓰기될 수 있는 타이밍 종속 동시 실행 문제를 수정합니다.
- 추출기:
- MP4, MP3, FLAC: 컨테이너 파싱 중에 첨부된 사진과 커버 이미지 메타데이터를 삭제하여 런타임 메모리 소비를 줄일 수 있도록
FLAG_DISABLE_ARTWORK_METADATA를 추가했습니다(#2077). 이는DefaultExtractorsFactory.setDisableArtworkMetadata를 통해 중앙에서 사용 설정할 수도 있습니다. - MP4: ITU-T T.35 (
it35) 시간 제한 메타데이터 트랙 추출 지원을 추가합니다. - MP4: 챕터 메타데이터 (Nero 및 QuickTime 형식 모두) 추출 지원을 추가합니다. 둘 다 있는 경우 QuickTime 챕터가 선호됩니다. 추출된 챕터 정보는 트랙의
Metadata내에서Chapter항목으로 노출되어 MP4, M4A, M4B 파일 (예: 오디오북, 팟캐스트)에서 네이티브 챕터 탐색이 가능합니다(#2803). - WAV, Matroska, MP4: 64비트 부동 소수점 PCM 오디오 지원을 추가합니다(#3090).
- Matroska: 코덱 비트스트림 메타데이터를 사용하여 정확한
ColorInfo를 채웁니다. - MP4:
sidx상자가 없는 경우mfra상자를 사용하여 분할된 MP4 파일에서 탐색을 지원합니다. 이를 사용 설정하려면FLAG_READ_MFRA_FOR_SEEK_MAP를FragmentedMp4Extractor에 제공합니다. 이 작업은 이제DefaultExtractorsFactory에서 기본적으로 실행됩니다(#3088). - 지원되지 않는 버전의
av1C데이터를 무시합니다. - MP4:
fpcm상자에 빅 엔디안 부동 소수점 PCM 지원을 추가합니다. - Matroska: 트랙의
Metadata에서 챕터 정보를Chapter항목으로 파싱합니다. - MPEG-TS: 코어 및 확장 하위 스트림을 단일 샘플로 결합하여 DTS-HD 및 DTS Express 스트림 추출을 개선하고, 이전에 두 스트림이 별도의 샘플로 출력되던 재생 문제를 해결합니다(#3147).
- MP4: 빈
ilst메타데이터 태그 항목을 파싱할 때 무한 루프 및 경계를 벗어난 읽기를 방지합니다(#3191). - MPEG-TS: 마지막 PES 패킷의 길이가 알려진 스트림의 마지막 프레임이 렌더링되는지 확인합니다(#3206).
- MP3: Xing 및 VBRI 헤더가 있는 파일의 비트 전송률 보고를 수정합니다.
- Matroska: 마지막 클러스터에 정의된 트랙을 처리합니다(#3250).
- Matroska: ALAC 지원을 추가합니다(#3268).
- MP4: 단편화된 MP4 파일에서 가변 길이
sgpd상자를 허용합니다(#3243). - AVI: 오디오 트랙에 키프레임 플래그가 없는 파일을 재생하면 오디오 손실 및
OutOfMemoryError가 발생하는 문제를 수정했습니다. - MP3: Xing/Info 헤더에서 끊김 없는 재생을 인식하는 재생 시간을 사용합니다(#3183).
- MP3: 디코딩된 PCM 자르기와 일치하도록 LAME/Xing 인코더 지연 및 패딩 메타데이터를 조정합니다(#3200).
- MP4, MP3, FLAC: 컨테이너 파싱 중에 첨부된 사진과 커버 이미지 메타데이터를 삭제하여 런타임 메모리 소비를 줄일 수 있도록
- 오디오:
- 준비 상태에서 준비되지 않은 상태로 전환할 때 ExoPlayer의 오디오 렌더기에 100ms의 유예 기간을 추가하여 일시적인 언더런을 디바운스하고 활성 재생 중에 예기치 않은 버퍼링 상태를 방지합니다(#3210).
DefaultAudioTrackBufferSizeProvider의 기본 PCM 버퍼 사이즈 로직을 변경하여 고정된 500ms 버퍼를 사용함으로써 기기 종속성을 줄입니다.- 플랫폼 디코더에서 공간 channelMask를 추출하도록
MediaCodecAudioRenderer를 업데이트하여DefaultAudioSink가 채널 수에서 마스크를 추론하는 대신 이 명시적 마스크를 사용할 수 있도록 합니다. AudioSink.configure의 매개변수를 데이터 클래스로 변환합니다.ForwardingAudioSink.configure의 맞춤 재정의를 새 메서드 서명으로 이전해야 합니다.EditedMediaItem.Builder#setSpeed(SpeedParameters)를 사용하여 오디오 스트림을 타임 스트레칭할 때 피치를 유지하는 지원을 추가합니다.- 8비트 PCM, 16비트 빅 엔디안 PCM, 64비트 부동 소수점 PCM을 32비트 부동 소수점 PCM으로 변환하도록
ToFloatPcmAudioProcessor를 개선했습니다 (#3090). DecoderAudioRenderer.getChannelMapping의 반환 값을ImmutableIntArray로 변경합니다.- 압축 오프로드 모드에서 끊김 없는 오디오 재생목록을 재생할 때 재생이 멈추는 버그를 수정합니다.
Timeline및 기간 UID를AudioSink.configure및AudioProcessor.StreamMetadata에 전달하여 오디오 프로세서에 재생목록 컨텍스트를 제공합니다 (#418).- 시간 기반 오디오 처리를 허용하도록 올바른
AudioProcessor.StreamMetadata.positionOffsetUs를 설정합니다(#418). - 빅 엔디안 32비트 및 64비트 부동 소수점 PCM 지원을 추가합니다.
- Google Pixel 기기의 표준 EAC3 디코더는 EAC3-JOC 스트림을 디코딩할 수 없으므로 Google Pixel 기기에서 재생할 수 있도록 EAC3-JOC에서 EAC3로의 대체 경로를 삭제합니다(#3257).
- 동영상:
- 조인 중에 삭제된 버퍼를 삭제된 버퍼가 아닌 건너뛴 버퍼로 계산하도록 동영상 조인 로직을 수정합니다.
- 자리표시자 표시 경로를 지원하지 않는 기기에서 프레임 드롭을 방지하기 위해 새 표시 경로를 설정할 때 즉각적인 렌더링 결정을 수정합니다.
- 삭제되거나 건너뛴 프레임을 고려하여
MediaCodecVideoRenderer의 프레임 속도 추정을 더 정확하게 수정합니다. - 프레임을 조기에 예약하는 데 사용되는 기준점을 구성할 수 있습니다. 기본값은 50ms이지만
MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold()를 통해 값을 맞춤설정할 수 있습니다. - 디스플레이 변경으로 인해 기본 스레드에서 중복
Choreographer콜백과 과도한 CPU 절전 모드 해제가 트리거될 수 있는VideoFrameReleaseHelper의 버그를 수정했습니다.
- 텍스트:
- 메타데이터:
MediaMetadata.discSubtitle필드를 추가하고 ID3v2.4TSST및 VorbisDISCSUBTITLE데이터에서 파싱합니다.- ID3
TPOS프레임에서 디스크 번호 및 개수를 파싱합니다.
- 효과:
- 탐색 시 플레이어가 정지되지 않도록 플러시할 때
FinalShaderProgramWrapper에서 다시 그리기 상태를 지웁니다.
- 탐색 시 플레이어가 정지되지 않도록 플러시할 때
- 멀티플렉서:
- 새
addTrackReferenceAPI를 통해Mp4Muxer에서 트랙 참조 (tref상자) 지원을 추가합니다. 이를 통해 메타데이터 트랙을 설명하는 동영상 트랙에 연결하는 등 트랙 간의 관계를 설정할 수 있습니다. OggMuxer를 추가하여OPUS또는VORBIS미디어 스트림을ogg파일 형식으로 다중화할 수 있습니다.- WAV 파일 생성을 위해
WavMuxer를 추가합니다 (정수 및 부동 소수점 PCM 지원). InAppMp4Muxer.Factory에setAttemptStreamableOutputEnabled를 추가하여 예약된 공간 없이 스트리밍할 수 없는 작은 파일을 쓸 수 있도록 합니다.Mp4Muxer및FragmentedMp4Muxer에 IAMF 오디오 지원을 추가합니다.
- 새
- IMA 확장 프로그램:
ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setPauseAdSlot를 추가하여 일시중지 상태 광고에 사용할 광고 슬롯을 제공할 수 있도록 합니다.- 건너뛸 수 있는 VAST 광고가 연속으로 게재될 때 두 번째 광고에서 건너뛰기 버튼이 즉시 표시되는 버그를 수정했습니다(#3165).
- 세션:
- 백그라운드 스레드 플레이어 루퍼가 있는 세션을 사용할 때
MediaNotificationManager내에서 발생할 수 있는 교착 상태 및IllegalStateException비정상 종료를 수정했습니다. MediaSession메서드에 더 엄격한 스레딩 요구사항을 적용합니다. 이제 void 메서드는 애플리케이션 루퍼 스레드에 실행을 자동으로 게시하고, 상태 접근자 (getter)는 애플리케이션 루퍼가 아닌 스레드에서 호출되는 경우IllegalStateException를 명시적으로 발생시킵니다.- 세션 측에서 컨트롤러별로 상태 일관성을 추적하여 범위를 벗어난 타임라인 병합 비정상 종료 (
MediaUtils.mergePlayerInfo의IllegalStateException)를 수정합니다. androidx.media3.session.MediaSessionManager을 추가하여 활성 미디어 세션을 쿼리하고 Media3SessionToken인스턴스를 반환하는 기능을 지원합니다.- 메서드가 신뢰할 수 없는 컨트롤러에 읽기 액세스 권한만 제공하도록 재정의되지 않은 경우
MediaSession.Callback.onConnect의 기본 동작을 변경합니다. - 새 API
MediaSession.Builder#setPackageNameOverride를 통해MediaSession를 만드는 동안 패키지 이름을 재정의하는 지원을 추가합니다. 호출자에게는 세션의 패키지 이름을 재정의할 수 있는android.permission.OVERRIDE_MEDIA_SESSION_OWNER권한이 있어야 합니다. MediaSession.Callback.onConnectAsync()를 추가합니다. 새 메서드를 사용하면 컨트롤러의 연결 시도를 비동기식으로 처리할 수 있습니다. 앱은Futures.immediateFuture(ConnectionResult)를 사용하여 즉시Future를 반환하여 이전 동작을 달성할 수 있습니다.Callback.onConnect는 지원 중단될 예정이므로 새 메서드로 이전하는 것이 좋습니다.- API 36 및 37에서 블루투스 AVRCP 탐색이
MediaLibraryService를 인식하지 못하는 문제를 수정했습니다. - 이미지 크기가 플랫폼 한도에 가까울 때
MediaSession에서 아트워크의 이중 다운스케일링을 수정하여 알림의 흐림 문제를 해결합니다(#3134). - 앱이 백그라운드에 있는 동안 비동기 아트워크 비트맵 로드 콜백이 포그라운드 서비스를 시작하려고 할 때
MediaNotificationManager에서ForegroundServiceStartNotAllowedException비정상 종료가 발생하는 문제를 수정했습니다 (#3270). MediaController에서 수신한PositionInfo객체에 원래TimelineUID가 누락되는 문제를 수정했습니다. 이제 세션은 상태 업데이트 중에 이러한 UID를 안정적으로 변환하고 전파합니다.MediaSessionService.stopSelfSafely()에서ForegroundServiceStartNotAllowedException를 포착하여 비정상 종료를 수정합니다(#3310).- 동일한 미디어 항목 내에서 탐색할 때
MediaController에서 예기치 않은onMediaItemTransition()콜백을 수정합니다(#3248).
- 백그라운드 스레드 플레이어 루퍼가 있는 세션을 사용할 때
- UI:
- 재생 중에
ContentFrame가 재구성될 때 첫 번째 프레임이 잘못된 크기로 렌더링되는 문제를 수정했습니다(#3238). CurrentMediaItemState클래스와 상응하는rememberCurrentMediaItemState컴포저블을media3-ui-compose모듈에 추가합니다. 이 상태 홀더는demo-compose에서 현재 재생 중인MediaItem에 관한 다양한 메타데이터 정보를 표시하는 데 사용됩니다.PlaylistState클래스와 상응하는rememberPlaylistState컴포저블을media3-ui-compose모듈에 추가합니다. 이 상태 홀더는demo-compose에서 플레이어에 설정된MediaItems에 관한 다양한 메타데이터 정보를 표시하는 데 사용됩니다.PlaybackSpeedState에 빨리 감기/슬로 모션 API를 추가합니다.demo-compose에서 이 기능을 사용하여 길게 누르기로 빨리 감기를 보여줍니다.media3-ui-compose-material3모듈에MiniController컴포저블을 추가합니다. 현재 미디어 항목의 제목, 아티스트, 포스터, 진행 상황을 표시하면서Player를 제어할 수 있는 컴팩트한 어포던스를 제공합니다.ErrorState클래스와 상응하는rememberErrorState컴포저블을media3-ui-compose모듈에 추가합니다.ErrorText컴포저블을media3-ui-compose-material3에 추가하고Player의 기본 오버레이로 만듭니다.TopControls,CenterControls,BottomControls,ErrorOverlay의 컴포저블을 사용하여PlayerDefaults객체를 게시합니다.FocusRequester를Player컴포저블 및 콘텐츠 슬롯에 추가합니다.PlayerPool(common-ktx) 및rememberPooledPlayer(ui-compose)를 게시하여 슬라이딩 윈도우 UI 환경에서MediaItems미리 로드를 지원합니다. 새ShortFormPlayerScreen를 사용하여demo-compose에서 이 기능을 보여줍니다.- 기간 UID 조회를 지원하지 않는 타임라인에서 비정상 종료를 일으키는
PlayerView및 ComposePresentationState의 셔터 억제 버그를 수정했습니다(#3264).
- 재생 중에
- 다운로드:
- 다운로드를 위해 가져올 때 미디어 재생목록에서 HLS 변수를 확인합니다(#3258).
- Ktor 확장 프로그램:
- HLS 확장 프로그램:
- HLS 콘텐츠 조정 및 경로 클론 지원을 추가합니다(#1689).
- 앱이 완전히 처리된 애셋 목록 전면 광고를 주문형 재해결을 위해 사용할 수 없는 상태로 다시 재설정할 수 있도록
setWithAssetListReset를HlsInterstitialsAdsLoader에 추가합니다. EXT-X-STREAM-INF및EXT-X-I-FRAME-STREAM-INF의SCORE속성을 파싱하고Format.selectionPriority에 채웁니다(#3236).- 재생목록이 더 이상 기본 또는 활성 상태가 아니더라도 예약된 HLS 재생목록 새로고침이 계속되는 버그를 수정했습니다(#3254).
- 전면 광고 확장 소재 목록을 확인할 때 콘텐츠 재개 오프셋 계산을 수정합니다 (#3322).
- 재생목록 요청 실패 후 지연 시간이 짧은 실시간 재생을 재개할 때 발생하는 예기치 않은 오디오 트랙 타임스탬프 불연속성을 수정합니다(#3311).
- 오디오 변환의 ID3 트랙이 자막으로 간주되는
HlsMediaPeriod.getStreamKeys()의 버그를 수정했습니다(#3333).
- DASH 확장 프로그램:
- RTSP 확장 프로그램:
- UDP 포트 바인딩 오류로 인해 RTSP 재생 준비 중에 발생하는 일시적인 재생 중단 또는 실패를 수정합니다.
- Cast 확장 프로그램:
Cast.initialize(CastParams)를 호출하여 Cast를 구성할 수 있도록 새CastParams클래스를 추가합니다.- 새
CastParams.getShowSystemOutputSwitcherOnCastIconClick()옵션을 추가합니다. 이 옵션은 사용 가능한 경우 인앱 전송 기기 선택 도구 대신 SystemUI 출력 전환기를 사용하도록 트리거합니다. MediaRouteButtonState및rememberMediaRouteButtonState를 추가하여 미디어 경로 선택 도구의 공개 상태 관찰을 지원하고state매개변수를MediaRouteButton에 추가합니다(#3172).- 트랙 선택 후
RemoteCastPlayer가 트랙 마스킹 상태에서 영구적으로 멈춰 Cast 수신기의 후속 트랙 업데이트를 무시하는 버그를 수정했습니다(#3237). - Media3가 아닌 발신자에서 시작된 전송 세션에 참여하려고 할 때
DefaultMediaItemConverter에서NullPointerException이 발생하는 버그를 수정했습니다. - 활성 플레이어를 변경할 때
CastPlayer가 재생할 수 없는MediaItems를 전송하지 못하도록 합니다(#3199). - 구성되지 않은 라이브 스트림 (
liveConfiguration == UNSET)이STREAM_TYPE_BUFFERED로 대기열에 추가되는 버그를 수정했습니다(#3318).
- 테스트 유틸리티:
DataSourceContractTest를 확장하여 헤더 및 본문이 있는POST요청에 대한 지원을 포함하고, 일부POST리소스를HttpDataSourceTestEnv에 추가하고,WebServerDispatcher에서 예상되는 HTTP 메서드, 헤더 및 본문에 대한 어설션을 추가합니다.DataSource.open()에서 반환된 길이에 대해DataSourceContractTest의 어설션을 강화합니다.C.LENGTH_UNSET를 발생시킬 수 있는 리소스는TestResource.Builder.setMayResolveToUnknownLength(boolean)를 사용하여 이를 나타내야 합니다.setPlaybackLooper를TestExoPlayerBuilder에 추가합니다.
- 지원 중단된 기호 삭제:
androidx.media3.exoplayer.MetadataRetriever가 삭제됩니다. 대신androidx.media3.inspector.MetadataRetriever를 사용합니다.androidx.media3.exoplayer.MediaExtractorCompat가 삭제됩니다. 대신androidx.media3.inspector.MediaExtractorCompat를 사용합니다.Mp4Extractor.FLAG_READ_MOTION_PHOTO_METADATA가 삭제됩니다. 대신HeifExtractor를 사용하여 HEIC 파일에서 모션 사진 메타데이터를 추출합니다.androidx.media3.extractor.metadata.mp4.MotionPhotoMetadata가 삭제됩니다. 대신androidx.media3.extractor.metadata.MotionPhotoMetadata를 사용합니다.androidx.media3.extractor.DummyTrackOutput가 삭제됩니다. 대신androidx.media3.extractor.DiscardingTrackOutput를 사용합니다.androidx.media3.extractor.DummyExtractorOutput가 삭제됩니다. 대신androidx.media3.extractor.NoOpExtractorOutput를 사용합니다.androidx.media3.common.C.generateAudioSessionIdV21가 삭제됩니다. 대신androidx.media3.common.util.Util.generateAudioSessionId를 사용합니다.
- 빌드
- Gradle 복합 빌드 (
includeBuild)를 사용하도록 로컬에서 Media3에 종속되는README.md안내를 업데이트했습니다.core_settings.gradle스크립트가 삭제되었으며androidxMediaModulePrefix및androidxMediaEnableMidiModule속성은 더 이상 사용되지 않습니다.
- Gradle 복합 빌드 (
1.11.0-rc01
1.11.0 안정화 버전을 사용합니다.
1.11.0-beta01
2026년 7월 7일
1.11.0 안정화 버전을 사용합니다.
1.11.0-alpha01
2026년 6월 24일
1.11.0 안정화 버전을 사용합니다.
버전 1.10.0
1.10.1
2026년 5월 12일
- 공통 라이브러리:
SimpleBasePlayer및ForwardingSimpleBasePlayer에서onAudioSessionIdChanged처리를 수정합니다.
- ExoPlayer:
- 트랙 선택:
VideoTrackInfo의 트랙 선택 로직을 조정하여 대체 MIME 유형을 해결하고 HDR 및 코덱 점수 환경설정을 품질 환경설정으로 이동합니다 (#3135).
- 추출기:
- MP3: Xing 데이터 길이가 알려진 스트림 길이보다 긴 경우 무시합니다 (#3117).
FLAG_OMIT_TRACK_SAMPLE_TABLE가 설정되어 있고 트랙에 동기화 샘플(stss) 상자가 없는 경우Mp4Extractor의ArrayIndexOutOfBoundsException를 수정합니다.
- 오디오:
- 여러 오디오 렌더러가 플레이어에 추가된 경우 오디오 이벤트가 잘못 라우팅될 수 있는 버그를 수정했습니다.
- 동영상:
- API 30 미만에서 프레임 속도 변경 시 코덱 재사용 로직을 조정하여 유용하지 않은 코덱 재설정을 방지합니다(#3120).
- API 31 이상의 경우
queueSecureInputBuffer에서 강제 동기화 해결 방법을 사용 중지합니다. 이 해결 방법은 복호화를 순차적으로 실행하도록 강제하는 인위적인 병목 현상으로, API 31 이전에 존재하던 프레임워크 문제로 인해 동영상이 왜곡되는 것을 방지했습니다.
- 이미지:
- 사용자가 '스크러빙을 중지'할 때만 이미지 업데이트가 적용되는 스크러빙 모드의 문제를 수정했습니다(#2815).
- 세션:
- 애플리케이션 스레드가 기본 스레드가 아닌 경우
ForegroundServiceStartNotAllowedException가 스레드 경계를 넘어 전파되지 않는 버그를 수정했습니다(#2499). - 다른 항목으로의 탐색을 지원하지만 재생목록 수정은 지원하지 않는 플랫폼 전용 세션에 연결할 때
MediaController에서COMMAND_SEEK_TO_MEDIA_ITEM를 사용할 수 없는 버그를 수정했습니다. PREPARE_FROM작업을 허용하지 않는 플랫폼 미디어 세션에서MediaController가 미디어 항목을 설정할 수 없는 문제를 수정했습니다.- 플랫폼 컨트롤러를 통해 연결할 때 API 27 이하에서 자체 프로세스가
Controller.isTrusted()로 표시되지 않는 버그를 수정했습니다.
- 애플리케이션 스레드가 기본 스레드가 아닌 경우
- HLS 확장 프로그램:
- DASH 확장 프로그램:
- 현재 취소 중인 청크를 탐색할 때
SampleQueue에서 발생하는 비정상 종료 문제를 수정했습니다.
- 현재 취소 중인 청크를 탐색할 때
1.10.0
2026년 3월 26일
- 공통 라이브러리:
Player.mute()및Player.unmute()를UnstableApi에서 안정화 버전으로 승격합니다.Format.pcmEncoding및C.PcmEncoding를UnstableApi에서 안정화 버전으로 승격합니다.Format.primaryTrackGroupId를 추가하여 삽입된Format인스턴스의 기본 그룹을 식별합니다(#294).
- ExoPlayer:
AdsMediaSource에 클리핑 기능을 추가합니다.MediaCodecVideoRenderer에 동적 예약 지원을 추가하여 예약 작업과 CPU 절전 모드 해제 주기를 동영상 프레임을 처리할 수 있는 시점에 더 잘 맞춥니다.DefaultRenderersFactory에서experimentalSetEnableMediaCodecVideoRendererDurationToProgressUs()를 사용하여 이 기능을 사용 설정할 수 있습니다.DefaultPreloadManager.Builder에서 커스텀DataSource.Factory를 설정할 수 있습니다.- 일부 기본 상수를
ExoPlayer.Builder로 이동하여 Robolectric 없이ExoPlayer를 모의할 수 있도록 허용합니다. 이 복잡한 인터페이스를 모의하는 것은 일반적으로 권장되지 않으며, 사용이 최소/단순/부수적인 경우에만 권장됩니다(#2985).- 이를 위해서는
DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MS를ExoPlayer에서ExoPlayer.Builder로 이동해야 했습니다 (지원 중단 없이).
- 이를 위해서는
ProgressiveMediaSource가 오래된 타임라인 정보를 플레이어에 전파하고 대기열에 추가된 기간이 예기치 않게 삭제되는 버그를 수정했습니다. (#3016)- 전화 통화 중에 재생이 요청될 때 ExoPlayer가 지연된 오디오 포커스를 요청하지 않는 문제를 수정했습니다.
- 주문형 콘텐츠에서 라이브 콘텐츠로 전환할 때 주문형 콘텐츠 끝부분에서 다시 버퍼링이 발생할 수 있는 버그를 수정했습니다. (#3052)
- Dolby Vision 프로필 10 지원을 추가합니다(#2830).
- 초기화되지 않은 프리롤 광고에서
ArrayIndexOutOfBoundsException이 발생하는 버그를 수정했습니다. (#3125)
- CompositionPlayer:
EditedMediaItem.removeVideo에 대한 지원을 추가합니다.
- 변환기:
- 이제
EditedMediaItem.Builder.setFrameRate()에서 동영상의 최대 출력 프레임 속도를 설정할 수 있습니다. 이는setSpeed()로 미디어 속도를 높일 때 특히 유용합니다.
- 이제
- 트랙 선택:
- 트랙 재정의로 자동 입력된 출력 배열을 매개변수로 포함하도록
DefaultTrackSelector.selectAllTracks의 서명을 변경합니다. - 해당 기본 트랙이 선택되었는지와 관계없이 삽입된 메타데이터 트랙이 선택되는 문제를 수정합니다(#294).
preferredVideoLanguages,preferredVideoLabels,preferredAudioLabels,preferredTextLabels,selectTextByDefault의TrackSelectionParameters옵션을 안정화합니다.
- 트랙 재정의로 자동 입력된 출력 배열을 매개변수로 포함하도록
- 추출기:
- MP4:
moov와 같은 다른 상자 앞에 큰uuid상자가 있는 파일을 지원합니다 (#3046). - MP4: MP4 컨테이너에 다목적 동영상 코딩 (VVC) 트랙 지원을 추가합니다.
- MP4:
- 검사기:
- 브레이킹 체인지:
FrameExtractor를 삭제합니다. 이제 사용자는 새:media3-inspector-frame모듈을 사용하고 가져오기를androidx.media3.inspector.frame.FrameExtractor로 업데이트해야 합니다. - 디코딩된 동영상 프레임을 추출하고 처리하는 새 모듈을 도입합니다.
- 브레이킹 체인지:
- 오디오:
- IAMF 디코더 확장 프로그램의 기본 디코딩 라이브러리를
libiamf에서iamf_tools로 변경합니다. - IAMF 디코딩은 디코더 (IAMF 디코더 확장 프로그램을 사용하는 경우) 또는 Android Spatializer를 통해 바이노럴 출력을 지원합니다.
- Automotive 시나리오에서 AC-4 디코더 지원을 평가할 때
AC4Profile22및 기타 기존 프로필에 대한 지원을 올바르게 삭제합니다(#2609). DefaultAudioSink에서AudioOutput초기화의 재시도 로직을 개선합니다. (#2905)- IAMF를 디코딩할 때 IAMF 확장 프로그램과 미디어 코덱 디코더를 모두 사용하여 스피커 (또는 해당하는 경우 Spatializer)의 출력 레이아웃을 일치시키려고 시도합니다. 이는 AudioCapabilities 및 AudioCapabilitiesReceiver의 새로운 필드와 로직에 의해 지원됩니다.
- 압축 오프로드 모드에서 끊김 없는 오디오 재생목록을 재생할 때 재생이 멈추는 버그를 수정합니다.
- IAMF 디코더 확장 프로그램의 기본 디코딩 라이브러리를
- 텍스트:
- VobSub: 항상 기본값인 5초로 설정하는 대신
START및STOPSPU 제어 명령어를 사용하여 큐 지속 시간을 도출합니다(#2935).
- VobSub: 항상 기본값인 5초로 설정하는 대신
- 메타데이터:
- HLS 변형 및 표현에서 게시하는 모든 잠재적 메타데이터 트랙을 처리할 수 있도록 메타데이터 렌더러의 기본 수를 4개로 늘립니다(#3043).
- 효과:
LottieOverlay를 새:media3-effect-lottie모듈로 이동합니다 (이름을androidx.media3.effect.LottieOverlay에서androidx.media3.effect.lottie.LottieOverlay로 바꾸는 작업도 포함됨).
- 효과 Lottie:
- 동영상 프레임에 lottie 효과를 적용하는 기능을 제공하는 새로운
:media3-effect-lottie모듈을 도입합니다.
- 동영상 프레임에 lottie 효과를 적용하는 기능을 제공하는 새로운
- IMA 확장 프로그램:
- 최신 광고 미디어 정보 API에 액세스하려면 IMA SDK 버전을 3.39.0으로 업데이트하세요.
- 광고 MIME 유형이 IMA LOADED 이벤트에 제공된 MIME 유형과 일치하지 않는 버그가 수정되었습니다. 이제 IMA에서 제공하는 광고 미디어 정보를 사용하여 광고 MIME 유형을 매핑합니다.
setEnableCustomTabs를ImaAdsLoader및ImaServerSideAdInsertionMediaSource에 추가하여 사용자가 맞춤 탭을 사용하여 광고 클릭연결 URL을 실행할지 여부를 제어할 수 있습니다.adTagUri를 구성하는 대체 방법을 제공하는 클래스인ImaAdTagUriBuilder를 추가합니다. 여기에는setPreferredLinearOrientationAPI가 포함되어 있습니다. 선형 광고에 선호하는 방향을 설정할 수 있는 알파 테스트 중인 API입니다. 알파 테스트 그룹에 참여하려면 계정 파트너에게 문의하세요.
- 세션:
MediaMetadata.artworkData의 큰 배열로 인해 앱이 비정상 종료될 수 있는 버그를 수정했습니다.ActionFactory인터페이스에서@Player.Command인수에 int 유형을 사용합니다 (#2933).MediaSessionService및MediaLibraryService를LifecycleService로 만들어 수명 주기 인식 작업을 서비스 수명 주기에 연결할 수 있습니다(#187).- 로컬 재생을 위한
MediaController및MediaBrowser의 기기 볼륨 변경 명령어 지원을 중지합니다. 앱은 로컬 기기 볼륨을 변경해서는 안 되며, 필요한 경우 이 목적으로AudioManagerAPI를 사용할 수 있습니다. - 서비스를 포그라운드 서비스로 시작한 비활성
Intent인스턴스를 감지합니다. 이렇게 하면 시스템에서ForegroundServiceDidNotStartInTimeException이 발생하는 것을 방지할 수 있습니다. 이는 새 필수 메서드가 있으므로 맞춤MediaNotification.Provider를 구현하는 앱의 불안정한 API에 관한 브레이킹 체인지입니다. - 홈 화면 위젯과 함께 사용할
PendingIntent인스턴스의 빌더를 추가합니다 (#2933). - Compose 기반 홈 화면 위젯의
Intent인스턴스를 만들기 위한 정적 메서드를 추가합니다(#2933). - 불연속 이유 'AUTO' 및 'SEEK'로 인해 재생이 지정된 미디어 항목 색인에서 동일한 미디어 항목이 있는 다른 색인으로 전환될 때 미디어 항목 전환이 컨트롤러에 보고되지 않는 버그를 수정했습니다(#2997).
- 시스템 UI 버튼 배치 해결 방법이 Android Auto와 같은 다른 UI 표시 경로 또는 해결 방법이 필요하지 않은 제조업체에 부정적인 영향을 미치는 문제를 수정합니다 (#3041).
- 구독 액세스가 동기화되지 않는 문제를 수정합니다(#3056).
- 특정 크기의 미디어 세션 아트워크가 SysUI를 다운시키고 기기를 강제로 재부팅할 수 있는 API 29의 SysUI 버그를 해결합니다(#3118).
- Android Q에서 알림 아트워크 아이콘 크기 조정을 수정합니다(#3084).
- UI:
- 재생 속도를 표시하고 수정하기 위해
media3-ui-compose에PlaybackSpeedControl컴포저블을 추가합니다. - 재생 속도를 제어하기 위해
media3-ui-compose-material3에PlaybackSpeedToggleButton컴포저블을 추가합니다. ProgressSlider컴포저블을media3-ui-compose-material3에 추가하여 플레이어 진행 상황을 표시하고 드래그 및 탭을 사용하여 탐색을 실행합니다 (#2288).- PlayerControlView 애니메이션에서 큰 오프스크린 버퍼를 피합니다.
ContentFrame를 상단, 중앙, 하단에 정렬된 맞춤설정 가능한 컨트롤과 결합하는Player컴포저블을media3-ui-compose-material3에 추가합니다.PlayerControlView가 표시될 때 공지사항이 계속 업데이트되지 않도록 접근성 서비스에서 재생 위치를 숨깁니다.
- 재생 속도를 표시하고 수정하기 위해
- HLS 확장 프로그램:
- DASH 확장 프로그램:
- RTSP 확장 프로그램:
- 여러 RTP 패킷에 걸쳐 있는 동일한 액세스 단위의 샘플을 잘못 파싱하는 H.264 및 H.265 스트리밍의 회귀를 수정했습니다. 이로 인해 동영상에 시각적 아티팩트와 손상이 발생했습니다(#3121).
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1 등):
- MPEG-H 디코더 확장 프로그램에 MPEG-H UI 관리자 지원을 추가합니다(#3066).
- Cast 확장 프로그램:
- Cast 재생의 트랙 선택 구현을 사용 설정하는
RemoteCastPlayer.Builder#setTrackSelector메서드를 추가합니다.
- Cast 재생의 트랙 선택 구현을 사용 설정하는
- 지원 중단된 기호 삭제:
ExperimentalFrameExtractor가 삭제됩니다. 대신androidx.media3.inspector.frame.FrameExtractor를 사용합니다.ChannelMixingMatrix.create()가 삭제됩니다. 대신ChannelMixingMatrix.createForConstantGain()를 사용합니다.androidx.media3.extractor.metadata.flac.VorbisComment가 삭제됩니다. 대신androidx.media3.extractor.metadata.vorbis.VorbisComment를 사용합니다.MediaSource.prepareSource(MediaSourceCaller, TransferListener)가 삭제됩니다. 대신MediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId)를 사용합니다.
1.10.0-rc03
2026년 3월 25일
1.10.0 안정화 버전을 사용합니다.
1.10.0-rc02
2026년 3월 16일
1.10.0 안정화 버전을 사용합니다.
1.10.0-rc01
2026년 3월 10일
1.10.0 안정화 버전을 사용합니다.
1.10.0-beta01
2026년 2월 25일
1.10.0 안정화 버전을 사용합니다.
1.10.0-alpha01
2026년 2월 6일
1.10.0 안정화 버전을 사용합니다.
버전 1.9.0
1.9.4
2026년 5월 16일
버전 1.9.4에는 다음 커밋이 포함되어 있습니다.
- 효과:
- 서피스 없는 컨텍스트에서 전환할 때
GL_DRAW_BUFFER및GL_READ_BUFFER를 명시적으로 설정합니다.
- 서피스 없는 컨텍스트에서 전환할 때
1.9.3
2026년 3월 16일
버전 1.9.3에는 다음 커밋이 포함되어 있습니다.
- 오디오:
- 압축 오프로드 모드에서 끊김 없는 오디오 재생목록을 재생할 때 재생이 멈추는 버그를 수정합니다.
1.9.2
2026년 2월 6일
버전 1.9.2에 포함된 커밋을 확인하세요.
- ExoPlayer:
ProgressiveMediaSource가 오래된 타임라인 정보를 플레이어에 전파하고 대기열에 추가된 기간이 예기치 않게 삭제되는 버그를 수정했습니다. (#3016)
- 세션:
- 시스템 UI 버튼 배치 해결 방법이 Android Auto와 같은 다른 UI 표시 경로 또는 해결 방법이 필요하지 않은 제조업체에 부정적인 영향을 미치는 문제를 수정합니다 (#3041).
- Cast 확장 프로그램:
- Cast에서 로컬 재생으로 전환하는 기능이 작동하지 않는 버그를 수정했습니다.
1.9.1
2026년 1월 26일
버전 1.9.1에 포함된 커밋을 확인하세요.
- 공통 라이브러리:
- 시간대 오프셋에 시간만 있는 날짜-시간 문자열을 지원합니다(#2929).
- ExoPlayer:
- 재생 시작 시 더 원활한 A/V 동기화를 지원하기 위해 오디오가 시작된 후에만 동적 예약이
doSomeWork간격을 늦추도록 허용합니다. FileNotFoundException및 유사한 예외 유형이 여러 번 재시도되는DefaultLoadErrorHandlingPolicy의 버그를 수정했습니다.- 다음
doSomeWork의 계산된 시간이 현재doSomeWork반복의 경과 시간만큼 잘못 줄어드는 동적 예약 버그를 수정합니다. 이 문제를 해결하면 CPU 유휴 시간이 연장되고 전력이 절약됩니다. - 대체 AVC 또는 HEVC 코덱을 사용하려고 할 때 Dolby Vision 파일의 일부 재생이 실패하는 문제를 수정합니다.
- 재생목록에서 현재 재생 중인 항목을 삭제할 때 재생이 종료된 후에도 로드가 계속되는 버그를 수정했습니다. (#2873)
- 동일한 항목에서
ExoPlayer.replaceMediaItem를 반복적으로 사용할 때MediaItem인스턴스가 누출되지 않도록 합니다(#2993). - 긴급 wake lock 해제로 인해 발생할 수 있는 ANR을 방지합니다(#2979).
- 재생 시작 시 더 원활한 A/V 동기화를 지원하기 위해 오디오가 시작된 후에만 동적 예약이
- 추출기:
- MP3: LAME ReplayGain 데이터를 파싱합니다(#2840).
- 오디오:
- Automotive 시나리오에서 AC-4 디코더 지원을 평가할 때
AC4Profile22및 기타 기존 프로필에 대한 지원을 올바르게 삭제합니다(#2609).
- Automotive 시나리오에서 AC-4 디코더 지원을 평가할 때
- 동영상:
- 콘텐츠 프레임 속도가 변경될 때 API 30 미만 기기에서 동영상 코덱을 삭제하여 끊김 현상을 방지합니다(#2941).
- 텍스트:
- VobSub: 단일 제어 시퀀스만 포함하거나 여러 제어 시퀀스에 걸쳐 중요한 정보가 분할된 SPU를 올바르게 처리하여 누락된 자막을 수정합니다(#2935).
- IMA 확장 프로그램:
- 버그 수정: 광고 MIME 유형이 IMA LOADED 이벤트에 제공된 MIME 유형과 일치하지 않는 문제가 해결되었습니다. 이제 광고 모음 색인과 광고 게재순위를 사용하여 광고 MIME 유형을 매핑합니다.
getAdsManager()및AdEvent.getAd()의 결과에 액세스하기 전에 null 확인을 추가합니다.
- 세션:
- 광고 재생 중에 중지가 발생한 경우 플랫폼 세션에 연결된
MediaController를 중지하면 앱이 비정상 종료되는 버그를 수정했습니다. (#2948) - 다른 프로세스에서 전송된 잘못된 형식의
Bundle인스턴스로부터 보호하기 위해 다양한 클래스의extrasBundle인스턴스에 추가 인증을 추가합니다. COMMAND_SEEK_NEXT또는COMMAND_SEEK_BACK의 누락된 명령어로 인해 시스템 미디어 알림에 공백이 발생할 수 있는 문제를 해결합니다(#2976).- 알림 아이콘의 비트맵 크기 조정을 기본 스레드 외부로 이동합니다(#2829).
- 기존
MediaMetadataCompat및MediaDescriptionCompat에서 변환할 때 작성자, 작가, 작곡가가 대체로 사용되지 않는 버그를 수정했습니다(#3018).
- 광고 재생 중에 중지가 발생한 경우 플랫폼 세션에 연결된
- 다운로드:
PriorityTooLowException가SegmentDownloader에 의해 처리될 때 발생할 수 있는 무한 루프를 수정합니다 (DASH, HLS, SmoothStreaming). 보호된execute메서드를 사용하는SegmentDownloader의 맞춤 재정의는 다시 만들 수 있도록Supplier로 래핑된 작업을 제공해야 합니다 (#2931).
- HLS 확장 프로그램:
- 원시 애셋 목록 JSON 문서를
Listener.onAssetListLoadCompleted콜백에 전달합니다. 이는 불안정한 API의 브레이킹 체인지로, 이 콜백을 구현하는 앱은JSONObject유형의 추가 인수를 추가해야 합니다(#2950).
- 원시 애셋 목록 JSON 문서를
- RTSP 확장 프로그램:
- 래핑되는 타임스탬프가 있는 RTP 패킷을 올바르게 처리합니다. (#2930)
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1 등):
- 첫 번째 동영상 프레임을 처리하기 전에 탐색할 때 발생할 수 있는
NullPointerException를 수정했습니다. (#2965)
- 첫 번째 동영상 프레임을 처리하기 전에 탐색할 때 발생할 수 있는
- Cast 확장 프로그램:
- 재생목록을 교체할 때
RemoteCastPlayer타임라인이 올바르게 업데이트되지 않는 버그를 수정합니다.
- 재생목록을 교체할 때
1.9.0
2025년 12월 17일
- 공통 라이브러리:
- 다른 AndroidX 라이브러리에 맞게
minSdk를23로 업데이트합니다. Player인스턴스 간에 재생 상태를 전송하는 데 도움이 되는PlayerTransferState를 추가합니다.- Player에
void mute()및void unmute()메서드를 추가하여 Player의 볼륨을 0으로 설정하기 전과 후에 볼륨을 보존하고 복원합니다. - 이전에
ExoPlayer에서 내부적으로 사용한 유틸리티 클래스WakeLockManager,WifiLockManager,AudioFocusManager,AudioBecomingNoisyManager,StuckPlayerDetector를 게시하여 다른 플레이어에 재사용할 수 있도록 합니다(#1893). - 기본 대리자 플레이어가 리스너 인스턴스를 비교하기 위해 참조 동등성을 사용하는 경우
ForwardingPlayer리스너 처리를 수정합니다(#2675). - 작업을 수행해야 하는 특정
Player.Events를 지정하는Player.listenTo정지 확장 함수를media3-common-ktx라이브러리에 추가합니다. - 보고된 버퍼링 위치가 보고된 재생 시간보다 비정상적으로 훨씬 큰 경우 정수 오버플로로 인해 발생하는
BasePlayer.getBufferedPercentage의 비정상 종료를 수정했습니다(#2750). - 맞춤 샘플 MIME 유형을 무시하지 않고 컨테이너 MIME 유형에서 잠재적으로 잘못된 트랙 유형을 사용하도록 대체하여
TrackGroup트랙 유형의 자동 감지를 수정합니다(#2860).
- 다른 AndroidX 라이브러리에 맞게
- ExoPlayer:
- 플레이어가 중단된 것으로 보이는 경우
StuckPlayerException플레이어 오류를 트리거하는 중단된 플레이어 감지를 추가합니다. 이는 다음과 같은 경우에 발생하며, 필요한 경우ExoPlayer.Builder에서 각 기본 제한 시간을 구성할 수 있습니다.- 재생을 시도하는 동안 10분 동안
STATE_BUFFERING가 표시되고 버퍼링이 진행되지 않습니다. - 재생을 시도하는 동안
STATE_READY가 10초 동안 지속되고 재생 진행률이 없는 경우 - 선언된 기간을 초과하여 1분 동안
STATE_READY가 발생하고 항목의 끝에 도달하지 않은 경우 - 재생을 시도하는 동안 재생 억제 이유가 있는 상태로 10분이 지난 후
- 재생을 시도하는 동안 10분 동안
- 백그라운드 재생 중 버퍼링 문제를 해결하기 위해 기본적으로 wake lock 처리를 사용 설정합니다. 이는
ExoPlayer.Builder.setWakeMode를C.WAKE_MODE_LOCAL로 설정하는 것과 같습니다. ExoPlayer.Builder에 원래 전달된Context에 변경사항이 보고되면 가상 기기 ID를 자동으로 업데이트하는 리스닝 로직을 추가합니다.ExoPlayer.setVirtualDeviceId를 추가하여ExoPlayer.Builder에 전달된Context에서 가져온 가상 기기 ID를 수동으로 업데이트합니다.- 렌더러가 현재 항목이 끝나기 10초 전까지 다음 재생목록 항목의 데이터를 소비하지 않도록 합니다.
setSeekBackIncrementMs,setSeekForwardIncrementMs,setMaxSeekToPreviousPositionMs를ExoPlayer에 추가하여 구성 후 이러한 설정을 업데이트합니다(#2736).DefaultPreloadManager에 사전 캐싱 기능을 추가합니다. 이제 앱은TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData)를 통해DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs)또는DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs)를 반환하여 미디어 항목을 사전 캐싱해야 함을 나타낼 수 있습니다.- 짧은 형식 데모 앱에서
DefaultPreloadManager의 사전 캐싱 기능을 사용합니다. - 로컬 재생을 위한
DefaultLoadControl.Buildersetter를 추가하고 다양한 로컬 파일에서 잘 작동하도록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('미리 로드')의playerName에 대해DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)를 통해 미리 로드할 타겟 버퍼 바이트를 설정하고DefaultPreloadManager.Builder.setLoadControl(LoadControl)를 통해 생성된DefaultLoadControl를 삽입할 수 있습니다. - 기본 구현을 사용하여
cloneAndSet(int, int)를ShuffleOrder에 추가합니다. (#2834) - 탐색 조정 또는 자동 전환 후 광고 재생을 건너뛸 때 콘텐츠 재개 오프셋을 추가합니다(#2484).
- 오디오 및 동영상 트랙의 코덱 매개변수를 설정하고 관찰하는 API를 추가합니다.
이 기능은
MediaCodec기반 렌더러에 구현되며 API 29 이상이 필요합니다.ExoPlayer.setAudioCodecParameters()및ExoPlayer.setVideoCodecParameters()를 사용하여 매개변수를 적용합니다.ExoPlayer.addAudioCodecParametersChangeListener()및ExoPlayer.addVideoCodecParametersChangeListener()를 사용하여 변경사항을 수신 대기합니다. 공급업체별 키를 관찰하려면 API 31 이상이 필요합니다.
- 0이 아닌 위치로 탐색한 후 비어 있지 않은 미디어 소스로 플레이어를 준비한 후 빈 미디어 소스를 설정하여 발생하는
IllegalStateException를 수정합니다. - 스크러빙 모드에서 다른 미디어 항목으로 탐색하면
IllegalStateException가 발생할 수 있는 버그를 수정했습니다. DefaultPlaybackSessionManager에서 발생할 수 있는NullPointerException를 수정했습니다. (#2885)- 자격 요건을 충족하는 동영상의 탐색 성능 개선을 사용 설정합니다.
- 이 플랫폼 API의 시간 초과 문제가 수정된 API 36 이상에서 MediaCodec의 비동기 복호화 사용을 다시 사용 설정합니다(#1641).
MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUs의 기본값을 15ms로 변경하고, 대상 동영상의 경우 디코딩 전에 동영상 프레임을 더 효율적으로 삭제할 수 있도록 합니다.DefaultLoadControl의 자동 메모리 계산에 최대 메모리 한도를 추가합니다. 이는 과도한 수의 트랙이 선택된 경우에만 적용됩니다. (#2860)- 재생목록 또는 반복 모드에서 재생하는 경우 끝부분 근처의 스크러빙 모드에서 탐색하면 다음 미디어 항목으로 탐색할 수 있는 버그가 수정되었습니다.
- 플레이어가 중단된 것으로 보이는 경우
- CompositionPlayer:
- 새로운
@ExperimentalApi주석 아래에CompositionPlayer를 게시하여 실험에 사용할 수 있지만 아직 개발 중임을 나타냅니다. 일부 API는 향후 출시에서 크게 변경될 수 있으며 일부 사용 사례에는 알려진 문제와 제한사항이 있습니다(일부는 문서화되지 않음). CompositionPlayer에COMMAND_SET_AUDIO_ATTRIBUTES및 오디오 포커스 처리 지원을 추가합니다.CompositionPlayer의 보조 시퀀스에서 속도 변경 지원을 추가합니다.EditedMediaItem.removeVideo에 대한 지원을 추가합니다.
- 새로운
- 변환기:
InAppMp4Muxer를 기본 멀티플렉서로 사용합니다.EditedMediaItem.Builder#setSpeed()를 추가하고Effects#createExperimentalSpeedChangingEffects()를 지원 중단합니다.EditedMediaItemSequence에서forceAudioTrack및forceVideoTrack를trackTypes로 바꿉니다.
- 트랙 선택:
TrackSelectionParameters.selectTextByDefault를 추가하여 더 구체적인 다른 환경설정을 지정하지 않고도 텍스트 트랙을 선택할 수 있습니다.TrackSelectionParameters에preferredVideoLabels,preferredAudioLabels,preferredTextLabels를 추가하여 특정 라벨이 있는 트랙(예: HLS 이름 태그에서 읽은 트랙)의 환경설정을 지정합니다(#1666).
- 추출기:
- FLAC: 헤더 감지를 강화하여 인코딩된 FLAC 데이터에서 가짜 헤더를 찾을 가능성을 줄여 디코딩 오류를 방지합니다(#558).
- MP3: MP3 파일 시작 부분에서 ID3 태그 사이 (및 이전)에 간격을 허용합니다 (#811, #5718).
- MP3: 동기화 바이트의 기존 검색 한도와 일치하도록 스니핑 한도를 128kB로 늘립니다(#2713).
- MP3: 가능한 경우 메타데이터 헤더 (예: Xing 및 VBRI)에서 정보를 탐색하도록
FLAG_ENABLE_INDEX_SEEKING를 변경하고, 다른 탐색 정보가 없는 경우 색인 기반 탐색으로 대체합니다. 이렇게 하면 탐색 메타데이터가 있는 파일의 성능이 개선됩니다(#2839). - MP3:
FLAG_ENABLE_INDEX_SEEKING가 설정된 경우에도 탐색 메타데이터 (예: Xing, VBRI)를 찾을 수 없는 경우Mp3Extractor를 기본적으로 CBR (상수 비트 전송률) 가정으로 변경합니다. 이는 CBR이 표준이고 VBR에 명시적 헤더가 필요한 MP3 사양 기록을 기반으로 합니다. 이렇게 하면 헤더가 없는 VBR 파일의 잠재적 정확성을 희생하면서 메타데이터가 없는 파일의 즉각적인 탐색 가능성이 향상됩니다. CBR 가정을 탐색할 수 없는 경우 (예: 길이가 알려지지 않은 스트림) 이제 색인 탐색이 대체로 사용됩니다(#2848). - MP4: 추출기에서 트랙 형식을 내보내기 전에 첫 번째 샘플의 레이어 값을 확인하여
audio/mpeg(MP3),audio/mpeg-L1,audio/mpeg-L2MIME 유형 간의 모호성을 해소합니다(#2683). - MP4: 1MB보다 큰
stbl상자가 파일이 단편화되지 않아야 함을 의미한다고 가정하여 매우 큰 파일의 스니핑 효율성을 개선합니다(#2650). - MP4:
©mvn(이동 이름) 및©mvi(이동 색인) 메타데이터 지원을 추가합니다. 이제 이러한 메타데이터는 각각MVNM및MVINID를 사용하여Format.metadata에서TextInformationFrame객체로 내보내집니다(#2754). - MP4:
stsd상자가 누락된 트랙을 무시합니다 (전체 파일을 파싱하지 못하는 대신). - Matroska: DTS-HD 감지 지원을 추가합니다(#6225).
MatroskaExtractor에서 트랙이 여러 개인 파일의 탐색이 부정확할 수 있는 문제를 수정했습니다. 이제 큐 포인트가 각 트랙과 올바르게 연결되어 세밀한 탐색이 가능합니다.- MPEG-TS: 타임스탬프가 없는 PES 패킷으로 인해 발생하는
ReorderingBufferQueue의IllegalArgumentException를 수정합니다(#2764). - HEIC 모션 사진 추출 지원을 추가합니다. 이제
HeifExtractor에서 삽입된 동영상 및 오디오 트랙이 포함된 HEIC 파일을 파싱할 수 있습니다.
- 검사기:
- 미디어 검사 유틸리티의 전용 홈 역할을 하는 새로운
:media3-inspector모듈을 도입했습니다. 이 모듈에는 이제 메타데이터와 프레임 추출을 위한 통합 API를 제공하는 새로운androidx.media3.inspector.MetadataRetriever가 포함되어 있습니다. 기존androidx.media3.exoplayer.MetadataRetriever는 이제 이 새 버전으로 대체되어 지원 중단되었습니다. - 프레임 추출을 위한 새로운 공개 API인
androidx.media3.inspector.FrameExtractor를 도입했습니다. 이AutoCloseable클래스는 HDR 동영상, 동영상 효과, 맞춤 디코더 선택을 지원하는 프레임을 추출하는 방법을 제공합니다. 특정MediaItem의Builder를 통해 만들어야 합니다. - FrameExtractor: 특정 타임스탬프 없이 미디어 파일에서 대표 썸네일 프레임을 추출하는
getThumbnail()를 추가합니다. - 미디어 파일에서 인코딩된 원시 미디어 샘플을 추출하는 방법을 제공하는 플랫폼
android.media.MediaExtractor의 드롭인 대체인androidx.media3.inspector.MediaExtractorCompat를 추가합니다. 기존androidx.media3.exoplayer.MediaExtractorCompat는 이제 지원 중단되고 이 새 클래스로 대체됩니다.
- 미디어 검사 유틸리티의 전용 홈 역할을 하는 새로운
- 오디오:
AudioProcessor인스턴스가 탐색을 인식하도록 합니다.- 맞춤 오디오 출력 경로를 지원하기 위해 새
AudioOutputProvider인터페이스를DefaultAudioSink.Builder에 삽입할 수 있습니다. 기본값은AudioTrackAudioOutputProvider입니다. GainProcessor에서 탐색을 처리합니다.- 트랙 형식 지원 평가에서 AC-4 디코더 프로필 및 수준 기능을 활용합니다(#2580).
- 재생 시작 시 라우팅 변경 콜백을 처리하여 발생할 수 있는 지연을 방지합니다(#2646).
- EAC3, EAC3-JOC, AC-4 형식의 코덱 재사용을 허용합니다(#1346).
Sonic에 부동 소수점 PCM 샘플 지원을 추가합니다.ToFloatPcmAudioProcessor에 16비트 PCM 샘플 지원을 추가합니다.
- 동영상:
- 프로필이 다른 Dolby-Vision 콘텐츠의 코덱 재사용을 사용 중지합니다.
- 보안 코덱의 잘못 보고된 성능 포인트에 대한 해결 방법을 다시 사용 설정합니다 (#2856).
- 텍스트:
- Dolby Vision 콘텐츠에서 CEA-6/708 자막 파싱을 수정합니다(#2775).
- 이미지:
- DASH 썸네일 트랙을 스크러빙하는 동안 플레이어가 멈추는 ScrubbingMode 문제를 수정했습니다. (#2815)
- DRM:
- 추가 선택적 정보를 반환할 수 있도록
MediaDrmCallback메서드의 반환 유형을byte[]에서 새로운MediaDrmCallback.Response유형으로 변경합니다. 이는 소스 브레이킹 체인지이지만 반환하기 전에 이전byte[]반환 값을new Response로 래핑하면 브레이킹 체인지를 쉽게 해결할 수 있습니다. - URL 및 지연 시간과 같은 주요 요청 정보를
AnalyticsListener.onDrmKeysLoaded에 추가합니다(#1001). - 프로비저닝 요청 데이터를 URL 매개변수에서 POST 본문으로 이동합니다.
- 추가 선택적 정보를 반환할 수 있도록
- 효과:
Presentation가 단일 변 길이로 생성될 때 설정되지 않은 출력 변을 반올림하려면Presentation.copyWithUnsetSideRoundedTo를 추가합니다.
- 멀티플렉서:
- 프레임워크
MediaMuxer의 드롭인 대체인MediaMuxerCompat를 추가합니다. MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo()를 추가하여 모션 사진 생성을 허용합니다.OPUS,VORBIS,VP8,VP9미디어 스트림을webm파일 형식으로 다중화할 수 있도록WebmMuxer를 추가합니다.
- 프레임워크
- IMA 확장 프로그램:
- 앱에서 IMA Android 보관 파일에 출시된 규칙을 대신 사용할 수 있도록 맞춤 프로가드 규칙이 삭제되었습니다.
- Google Ad Manager 설정에 지정된 대로 광고 식별자를 처리하기 위해 IMA SDK의 Google Ad Manager 네트워크 코드를 설정하는 새로운 API인
ImaServerSideAdInsertionUriBuilder.setNetworkCode를 추가합니다. 네트워크 코드는 선택사항이지만 전체 서비스 스트림 요청에 권장됩니다. 네트워크 코드를 찾으려면 이 도움말을 참고하세요. - IMA 종속 항목을 3.37.0으로 범프합니다. 이 경우 핵심 라이브러리 디슈가링을 사용 설정해야 합니다. 종속 앱에서도 사용 설정해야 합니다. IMA 구성 참고사항을 참고하세요. * SSAI URI 빌더에서 IMA DAI 맞춤 UI 옵션을 지원합니다. 서버 측 광고 삽입을 위한 맞춤 UI 옵션에는 '건너뛸 수 있는 광고' 및 '이 광고에 대한 정보' 렌더링 지원이 포함됩니다. 이 기능은 현재 허용 목록에 있는 일부 게시자에게만 제공됩니다. 이 변경사항은 또한 IMA SDK 버전을 3.38.0 (출시 노트)으로 업그레이드하여 맞춤 UI 옵션 API에 액세스합니다.
- 광고 후 콘텐츠의 콘텐츠 준비 오류가 광고 재생 오류로 잘못 보고되는 문제를 수정합니다(#2656).
- 세션:
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가 플레이어를 시작하지 않고 미디어 키 이벤트Intent가onStartCommand()에 도착하는 버그를 수정했습니다.KEYCODE_MEDIA_PLAY_PAUSE와 마찬가지로 'KEYCODE_HEADSETHOOK'을 처리하여 이 문제를 해결했습니다(#2816).- 세션과 컨트롤러 간에 Surface 크기가 전달되지 않아 데모 세션에서 동영상 효과를 적용하지 못하는 버그를 수정했습니다. 컨트롤러를 사용하는 경우 플레이어가
setVideoSurfaceHolder호출을 처리할 수 없으면 브레이킹 체인지가 될 수 있습니다. - 스팬 스타일 문자열과 같은
String이외의CharSequence메타데이터 값 전파를 수정했습니다(#2853). - 컨트롤러가 의도한 작업을 더 쉽게 트리거할 수 있도록
CommandButton.executeAction를 추가합니다. 또한 일부 플레이어 및 세션 명령어에 매개변수를 지정하여 트리거할 작업을 정의할 수 있습니다. Player.Command또는 커스텀이 아닌SessionCommand를 사용하여 작업을 정의하는CommandButton인스턴스에 하위 호환성을 추가합니다. 이제 이러한 항목이 플랫폼 미디어 세션(예: 시스템 UI 또는 Android Auto)에 올바르게 표시됩니다.MediaController를 플랫폼 미디어 세션에 연결할 때 동일한Bitmap가 여러 번 압축되는 문제를 해결했습니다.
- UI:
ProgressStateWithTickInterval클래스와 해당rememberProgressStateWithTickInterval컴포저블을media3-ui-compose모듈에 추가합니다. 이 상태 홀더는demo-compose에서 현재 위치와 길이를 텍스트 형식으로 표시하는 데 사용됩니다.Player볼륨의 음소거를 처리하는MuteButtonState를ui-compose에 추가합니다. 이 상태 홀더는demo-compose에서 음소거/음소거 해제 전환 버튼을 표시하는 데 사용됩니다.ProgressStateWithTickCount클래스와 상응하는rememberProgressStateWithTickCount컴포저블을media3-ui-compose모듈에 추가합니다. 이 상태 홀더는demo-compose에서 진행률을 가로 읽기 전용 진행률 표시줄로 표시하는 데 사용됩니다.PlayerSurface관리와 가로세로 비율 크기 조절, 셔터로 가리기를 결합하는ContentFrame컴포저블을media3-ui-compose에 추가합니다.- Compose
AndroidView내에서SurfaceView를 사용할 때 동영상이 늘어나거나 잘리고SURFACE_TYPE_SURFACE_VIEW가 있는ContentFrame및PlayerSurface컴포저블에 영향을 미치는 알려진 API 34 플랫폼 버그를 해결했습니다(#1237, #2811). - 새
media3-ui-compose-material3모듈을 만들고 여기에 Material3 테마의 컴포저블 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton)을 추가합니다. TimeText컴포저블을media3-ui-compose-material3에 추가하여 플레이어 진행 상황을 텍스트 형식으로 표시합니다. 현재 위치, 재생 시간 또는 남은 시간을 표시하도록 구성할 수 있습니다.PlayerView에 미디어 경로 버튼을 배치하는 지원을 추가합니다.BidiFormatter를 사용하여 RTL 텍스트 자막에 구두점을 올바르게 표시합니다 (#11214).
- HLS 확장 프로그램:
- HLS 전면 광고 건너뛰기 속성을 파싱합니다.
- HLS 재생목록 및 애셋 목록 문서의 건너뛰기 제어 속성을 공개 액세스를 위해
AdPlaybackState에 매핑합니다. - 시작 시간을 정의하는 EXT-X-PROGRAM-START-DATE 태그가 재생목록에서 삭제될 때 재생목록의 시작 시간이 삭제되는 버그를 수정했습니다 (#2760).
- 이진 검색을 사용하여 재생목록에서 지정된 위치의 세그먼트 색인을 찾습니다 (#2826).
HlsInterstitialsAdsLoader.skipCurrentAd()및skipCurrentAdGroup()와 해당 메서드를 추가하여 색인별로 광고 및 광고 그룹을 건너뜁니다.HlsInterstitialsAdsLoader.Listener.onAdStarted를 추가하여 광고 기간의 시작을 보고합니다(#2859).- ISO 8601 날짜-시간 문자열에서 공백을 날짜/시간 구분자로 허용합니다.
- 세그먼트가 없는
HlsMediaPlaylist의 다음 청크 가져오기를 올바르게 처리합니다 (#2821). - 라이브 스트림의 프리롤에 기본 시작 위치를 사용합니다.
- DASH 확장 프로그램:
- RTSP 확장 프로그램:
- H264 및 H265의 단편화된 NAL 단위를 처리할 때 누락된 RTP 패킷 오류를 처리합니다(#2613).
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1 등):
- AV1 확장 프로그램: AV1 소프트웨어 디코더가 이제 고성능
dav1d라이브러리를 사용하여 이전libgav1구현을 대체하여 디코딩 속도를 개선합니다. - FFmpeg 확장 프로그램:
STREAMINFO블록이 올바르게 파싱되고 디코더에 전달되도록 하여 일부 FLAC 파일이 재생되지 않는 문제를 해결합니다(#2887).
- AV1 확장 프로그램: AV1 소프트웨어 디코더가 이제 고성능
- Cast 확장 프로그램:
CastPlayer.Builder를 추가합니다. 그러면CastPlayer가 로컬 재생과 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를 사용합니다. BitmapFactoryImageDecoder.BitmapDecoder가 삭제됩니다. 대신ExternallyLoadedImageDecoder를 사용합니다.- 지원 중단된
ShadowMediaCodecConfig.forAllSupportedMimeTypes()를 삭제합니다. 대신ShadowMediaCodecConfig.withAllDefaultSupportedCodecs()를 사용합니다. - 지원 중단된
ShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes()를 삭제합니다. 대신ShadowMediaCodecConfig.withNoDefaultSupportedCodecs()를 사용합니다.
- 지원 중단된
1.9.0-rc01
2025년 12월 1일
1.9.0 안정화 버전을 사용합니다.
1.9.0-beta01
2025년 11월 20일
1.9.0 안정화 버전을 사용합니다.
1.9.0-alpha01
2025년 10월 22일
1.9.0 안정화 버전을 사용합니다.
버전 1.8.0
1.8.1
2026년 5월 21일
버전 1.8.1에 포함된 커밋을 확인하세요.
- 효과:
- 서피스 없는 컨텍스트에서 전환할 때
GL_DRAW_BUFFER및GL_READ_BUFFER를 명시적으로 설정합니다.
- 서피스 없는 컨텍스트에서 전환할 때
버전 1.8.0
2025년 7월 30일
버전 1.8.0에 포함된 커밋을 확인하세요.
- 공통 라이브러리:
ForwardingSimpleBasePlayer에서 플레이어 교체 지원을 추가합니다.
- ExoPlayer:
- 셔플 모드의 getter를
ExoPlayer인터페이스에 추가합니다. (#2522) - 여러 스레드에서
DefaultAudioSink에 액세스하는 경우 예외를 더 명확하게 발생시킵니다. 플레이어 외부에서RendererCapabilities.getFormatSupport를 호출하여 이 문제가 발생하면 ExoPlayer의 재생 스레드와 동일한 스레드에서 이 메서드를 호출하거나 재생에 사용된 인스턴스와 다른 인스턴스를 사용해야 합니다(#1191). - TV의 비스테레오 오디오 형식이
DefaultTrackSelector에서 지원되지 않는 것으로 표시될 수 있는 버그를 수정했습니다. - MediaCodec의
DECODE_ONLY플래그 (스크러빙 모드에서 기본적으로 사용 설정됨)를 사용할 때 마지막 프레임이 올바르게 렌더링되는지 확인합니다. ExoPlayer.Builder에 전달된Context의 가상 기기 ID를 사용하기 위한 지원을 추가합니다.- 스크러빙 모드에서 기본적으로 동적 예약을 사용 설정합니다.
- 항목 끝으로 탐색할 때 소스가 불필요하게 새로고침되지 않도록 합니다.
- 스크러빙 모드에서 기본적으로
MediaCodec.BUFFER_FLAG_DECODE_ONLY를 사용합니다. - 미리 로드 스레드와 다른 재생 스레드가 있는
ExoPlayer에서PreloadMediaSource를 재생할 때IllegalStateException를 발생시킵니다 (#2495). - 기본 구현을 사용하여
ShuffleMode에cloneAndMove를 추가합니다(#2226). 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의 지정된 위치에서 미리 로드하는 기능에 대한 지원을 추가합니다.
- 셔플 모드의 getter를
- 변환기:
- 동영상 인코딩 설정의 칩셋별 최적화를 사용 설정하는
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를 사용하도록 Composition Demo 앱을 업데이트하고 맞춤
VideoCompositorSettings를 추가하여 시퀀스를 2x2 또는 PiP 레이아웃으로 정렬합니다.
- 동영상 인코딩 설정의 칩셋별 최적화를 사용 설정하는
- 추출기:
- 분할된 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). - SubStation Alpha (SSA) 자막 파일에서
layer속성 지원을 추가합니다. 이 속성은 화면에 두 개 이상의 큐가 동시에 표시될 때 큐의 z 순서를 정의하는 데 사용됩니다(#2124).
- 메타데이터:
- 미디어 길이 및
Timeline를MetadataRetriever로 가져오는 기능이 추가되었으며 인스턴스 기반AutoCloseableAPI로 이전되었습니다. 새Builder를 사용하여MediaItem의 인스턴스를 만든 다음retrieveTrackGroups(),retrieveTimeline(),retrieveDurationUs()를 호출하여 메타데이터의ListenableFuture를 가져옵니다. 이전 정적 메서드는 이제 지원 중단되었습니다(#2462).
- 미디어 길이 및
- 이미지:
- 매우 큰 이미지 (예: 50MP)를 표시하려고 할 때
PlayerView에서Canvas: trying to draw too large bitmap.로 인해 앱이 비정상 종료되지 않도록 디코딩된 비트맵을BitmapFactoryImageDecoder의 디스플레이 크기로 제한합니다. Context매개변수를 사용하도록DefaultRenderersFactory.getImageDecoderFactory()의 서명을 변경합니다.CompositionPlayer에서 사용되는 최대 비트맵 출력 크기를Transformer에서 이미 사용된 크기와 일치시킵니다 (즉,ExoPlayer와 달리CompositionPlayer는 비트맵을 디코딩할 때 디스플레이 크기를 고려하지 않음).
- 매우 큰 이미지 (예: 50MP)를 표시하려고 할 때
- DRM:
- HTTP 요청 헤더가 올바르게 적용될 수 있도록
MediaItem.DrmConfiguration를 허용하는OfflineLicenseHelper.newWidevineInstance의 새 오버로드를 추가합니다(#2169).
- HTTP 요청 헤더가 올바르게 적용될 수 있도록
- 효과:
- 입력 방향과 관계없이 가장 짧은 면이 항상 지정된 값과 일치하도록 하는
Presentation를 만드는Presentation.createForShortSide(int)를 추가합니다.
- 입력 방향과 관계없이 가장 짧은 면이 항상 지정된 값과 일치하도록 하는
- 멀티플렉서:
- 조각화된 MP4의 오디오 샘플에 올바른 샘플 플래그가 설정되지 않는 버그를 수정했습니다.
writeSampleData()API는 이제MediaCodec.BufferInfo대신 멀티플렉서별BufferInfo클래스를 사용합니다.Muxer.Factory#supportsWritingNegativeTimestampsInEditList를 추가합니다. 기본값은 false입니다.
- 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 확장 프로그램:
- 테스트 유틸리티:
advance(player).untilPositionAtLeast및untilMediaItemIndex를TestPlayerRunHelper에 추가하여 지정된 위치에 도달할 때까지 플레이어를 진행합니다. 대부분의 경우 이러한 메서드는 기존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밀리초로 낮추고 앱에서 이 값을 구성할 수 있도록 실험용 setter를 추가합니다. - 사용자가 알림을 닫은 후 알림이 다시 표시되는 문제를 해결합니다 (#2302).
- 래핑된 플레이어가 실제로 비어 있을 때 세션이 단일 항목 타임라인을 반환하는 버그를 수정했습니다. 이 문제는 래핑된 플레이어에
COMMAND_GET_TIMELINE가 없지만COMMAND_GET_CURRENT_MEDIA_ITEM가 있고 래핑된 플레이어가 비어 있는 경우에 발생했습니다 (#2320). setForegroundServiceTimeoutMs와 같은 서비스와의 다른 상호작용 후MediaSessionService.setMediaNotificationProvider호출이 자동으로 무시되는 버그를 수정했습니다. (#2305)
- 플랫폼
- UI:
PlayerSurface을 사용 설정하여ExoPlayer.setVideoEffects및CompositionPlayer와 함께 작동합니다.PlayerSurface를 새Player로 재구성할 수 없는 버그를 수정했습니다.
- HLS 확장 프로그램:
- HLS 미디어의
CmcdData에서 청크 길이가 설정되지 않아 암호화된 미디어 세그먼트를 처리할 때 어설션 실패가 발생하는 문제를 수정했습니다(#2312).
- HLS 미디어의
- RTSP 확장 프로그램:
- TCP를 사용하도록 RTSP 세션을 구성하는 방법으로 RTSPT 스키마가 있는 URI에 대한 지원을 추가합니다(#1484).
- Cast 확장 프로그램:
- 재생목록 메타데이터 지원을 추가합니다(#2235).
1.6.0
2025년 3월 26일
androidx.media3:media3-*:1.6.0이 출시되었습니다. 버전 1.6.0에 포함된 커밋을 확인하세요.
- 공통 라이브러리:
AudioManagerCompat및AudioFocusRequestCompat를 추가하여androidx.media의 동등한 클래스를 대체합니다.- Kotlin을 1.9.20에서 2.0.20으로 업그레이드하고 Compose Compiler Gradle 플러그인을 사용합니다. KotlinX 코루틴 라이브러리를 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매개변수를 추가합니다.MediaSourceEventListener.onLoadStarted및 해당MediaSourceEventListener.EventDispatcher메서드에retryCount매개변수를 추가합니다.- 실제 콘텐츠와 일치하지 않는 재생 시간의 다중 기간 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).lastRebufferRealtimeMs를LoadControl.Parameter에 추가합니다(#2113).
- 플랫폼
- 변환기:
- 이전 버전과 호환되는 대체 형식으로의 트랜스먹싱 지원을 추가합니다.
- Dolby Vision (프로필 8) 형식의 트랜스코딩 및 트랜스먹싱 지원을 추가합니다.
Format를 사용하도록VideoFrameProcessor.registerInputStream및VideoFrameProcessor.Listener.onInputStreamRegistered의 매개변수를 업데이트합니다.DefaultEncoderFactory를 사용할 때 HDR 정적 메타데이터를 생성합니다.MediaMetricsManager를 사용하여 Android 플랫폼 진단 지원을 사용 설정합니다. Transformer는 수정 이벤트 및 성능 데이터를 플랫폼에 전달하여 기기의 시스템 성능 및 디버깅 정보를 제공하는 데 도움을 줍니다. 기기 사용자가 사용 및 진단 데이터를 공유하도록 설정한 경우 Google이 이 데이터를 수집할 수도 있습니다. 앱은Transformer.Builder.setUsePlatformDiagnostics(false)를 사용하여 Transformer의 플랫폼 진단에 기여하는 옵션을 선택 해제할 수 있습니다.InAppMuxer를InAppMp4Muxer및InAppFragmentedMp4Muxer로 분할합니다.InAppMp4Muxer를 사용하여 단편화되지 않은 MP4 파일을 생성하고InAppFragmentedMp4Muxer는 단편화된 MP4 파일을 생성하는 데 사용됩니다.Muxer인터페이스를media3-muxer에서media3-transformer로 이동합니다.- 화면 녹화를 위해
MediaProjection에서 미디어를 제공하는MediaProjectionAssetLoader를 추가하고 Transformer 데모 앱에 화면 녹화 지원을 추가합니다. Codec인터페이스에#getInputFormat()를 추가합니다.- 가능한 경우
DefaultVideoFrameProcessor및DefaultVideoCompositor에서GlObjectsProvider를 해제하는 책임을 호출자에게 전가합니다.
- 추출기:
- 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를 최종 버전으로 설정합니다.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 타임스탬프를 소수점 이하 3자리로 제한합니다. 이전에는 소수 자릿수를 잘못 파싱했지만 항상 값이 밀리초 단위라고 가정하여 타임스탬프가 잘못되었습니다(#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를 서브클래스화하여 동적 오버레이 설정을 허용할 수 있습니다.
- 멀티플렉서:
- 매우 긴 정규화된 이름을 피하기 위해
MuxerException를Muxer인터페이스 외부로 이동했습니다. Mp4Muxer.Builder및FragmentedMp4Muxer.Builder에서setSampleCopyEnabled()메서드의 이름이setSampleCopyingEnabled()로 변경되었습니다.- 이제
Mp4Muxer.addTrack()및FragmentedMp4Muxer.addTrack()은TrackToken대신int트랙 ID를 반환합니다. Mp4Muxer및FragmentedMp4Muxer는 더 이상Muxer인터페이스를 구현하지 않습니다.- 기본적으로
Mp4Muxer샘플 일괄 처리 및 복사를 사용 중지합니다. - 오디오 트랙만 작성될 때 많은 프래그먼트를 만드는
FragmentedMp4Muxer의 버그를 수정합니다.
- 매우 긴 정규화된 이름을 피하기 위해
- 세션:
- 재생이 일시중지, 중지 또는 실패할 때 포그라운드 서비스 상태를 10분 더 유지합니다. 이렇게 하면 사용자가 다양한 기기에서 포그라운드 서비스 제한 없이 이 제한 시간 내에 재생을 재개할 수 있습니다.
onTaskRemoved를 재정의할 때player.pause()를 호출하는 것만으로는 더 이상stopSelf()전에 포그라운드 서비스를 중지할 수 없습니다. 대신MediaSessionService.pauseAllPlayersAndStopSelf()를 사용하세요. - 재생이 오류 또는 중지 상태로 전환될 때 알림을 계속 표시합니다. 알림은 재생목록이 지워지거나 플레이어가 해제된 경우에만 삭제됩니다.
- 사용 가능한 명령어에 따라 하나만 설정하고 하나만 설정된 경우에도 수락하도록 Android 플랫폼 MediaSession 작업 ACTION_PLAY 및 ACTION_PAUSE의 처리를 개선합니다.
Context를MediaButtonReceiver.shouldStartForegroundService에 매개변수로 추가합니다(#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 Level-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로 늘리세요 (안드로이드 Lollipop). 이는 다른 모든 AndroidX 라이브러리와 일치합니다.- Common 라이브러리를 기반으로 빌드된 Kotlin 관련 기능을 제공하는
androidx.media3:media3-common-ktx아티팩트를 추가합니다. Player.listen정지 확장 함수를 추가하여 코루틴을 실행하고media3-common-ktx라이브러리에Player.Events를 수신 대기합니다.- 런타임 클래스 인증 실패를 방지하도록 설계된 수동으로 아웃라인 처리된 내부 클래스에서
@DoNotInline주석을 삭제합니다. 최신 버전의 R8은 이제 이와 같은 호출을 자동으로 아웃오브라인하여 런타임 실패를 방지합니다 (따라서 수동 아웃오브라인이 더 이상 필요하지 않음). 라이브러리의 모든 Gradle 사용자는compileSdk = 35로 인해 이 작업을 실행하는 R8 버전을 사용하는 Android Gradle 플러그인 버전을 이미 사용하고 있어야 합니다. Gradle 이외의 빌드 시스템을 사용하는 라이브러리 사용자는 런타임 클래스 인증 실패를 방지하기 위해 R8과 동등한 축소/난독화 단계에서 유사한 자동 아웃라이닝 프로세스를 실행해야 합니다. 이 변경사항은 다른 AndroidX 라이브러리에서 이미 완료되었습니다.
- 완전한 일관성과 리스너 처리를 보장하면서 약간의 조정으로 다른 플레이어로 전달할 수 있는
- ExoPlayer:
- 이제 모든 미디어 항목에 대해
MediaCodecRenderer.onProcessedStreamChange()를 호출할 수 있습니다. 이전에는 첫 번째 항목에 대해 호출되지 않았습니다.MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart()를 사용하여 이 API를 사용 설정합니다. PreloadMediaSource.PreloadControl.onPreloadError를 추가하여 오류가 발생할 때PreloadMediaSource.PreloadControl구현이 작업을 실행할 수 있도록 합니다.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[])를 지원 중단하고 재정의를 방지하기 위해 메서드를 최종으로 표시했습니다. 대신 새DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])를 사용해야 합니다.MergingMediaSource의 보조 소스에서MediaSourceEventListener이벤트를 보고합니다. 이렇게 하면 사이드로드된 자막 (MediaItem.LocalConfiguration.subtitleConfigurations로 추가된 자막)에 대해 로드 시작/오류/취소/완료 이벤트가 보고되며, 이는AnalyticsListener에서 내보낸 중복 로드 이벤트로 표시될 수 있습니다.- 자막 및 메타데이터 오류로 인해 재생이 완전히 중지되는 것을 방지합니다.
대신 문제가 있는 트랙이 사용 중지되고 나머지 트랙의 재생이 계속됩니다(#1722).
- 새 자막 처리 (추출 중)에서 연결된 파싱 (예: 잘못된 자막 데이터) 및 로드 오류 (예: HTTP 404)는
onLoadError콜백을 통해 발생합니다. - 기존 자막 처리 (렌더링 중)에서는 연결된 로드 오류만
onLoadError콜백을 통해 전송되고 파싱 오류는 자동으로 무시됩니다 (기존 동작).
- 새 자막 처리 (추출 중)에서 연결된 파싱 (예: 잘못된 자막 데이터) 및 로드 오류 (예: HTTP 404)는
- 실제 콘텐츠와 일치하지 않는 재생 시간의 다중 기간 DASH 스트림에서 재생목록 항목 또는 기간이 항목 끝에서 프레임 정지를 일으킬 수 있는 버그를 수정했습니다(#1698).
- 클라이언트가 다시 초기화된 후 마지막 업데이트 이후 경과된 최대 시간을 설정하는 setter를
SntpClient에 추가합니다(#1794).
- 이제 모든 미디어 항목에 대해
- 변환기:
Surface를 통해 동영상 데이터를 Transformer에 큐에 추가하는 것을 지원하는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}로 실패하는 대신 MP3 데이터 끝에서 재생을 중지합니다 (#1563). - 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 Level-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()가 'open' 값을 반환하는지 확인합니다.DataSourceContractTest.getNotFoundResources()를 재정의하면 테스트 서브클래스가 여러 '찾을 수 없음' 리소스를 제공하고 예상 헤더도 제공할 수 있습니다. 이렇게 하면 HTTP 404 (헤더 있음)와 '서버를 찾을 수 없음' (헤더 없음)을 구분할 수 있습니다.
- API 수준 34 대신 버전 S 확장 프로그램 7부터 사용할 수 있도록
- 오디오:
- 미디어에 있는 경우 코덱에서 CTA-2075 음량 메타데이터를 자동으로 구성합니다.
- 탐색 시 볼륨이 부드럽게 줄어들도록 합니다.
- 탐색 중에 발생할 수 있는 팝 사운드를 수정합니다.
- Sonic의 시간 확장/피치 이동 알고리즘의 잘림 오류 누적을 수정합니다.
- 출력 프레임이 누락되는
SpeedChangingAudioProcessor의 버그를 수정합니다.
- 동영상:
MediaCodecVideoRenderer는 렌더링되지 않거나 다른 샘플에서 참조로 사용되지 않는 샘플을 디코딩하지 않습니다.- API 35 이상에서
MediaCodecAdapter는 이제configure에서nullSurface를 수신하고 코덱이 이를 지원하는 경우 이전에 설정된Surface를 삭제하기 위해 새 메서드detachOutputSurface를 호출할 수 있습니다(MediaCodecInfo.detachedSurfaceSupported). onOutputFormatChanged을 처리할 때 제공된 경우MediaCodecAdapter제공 픽셀 가로세로 비율 값을 사용합니다(#1371).- 60fps 보안 H264 스트림이 지원되지 않는 것으로 표시되는 Galaxy Tab S7 FE의 기기 문제에 대한 해결 방법을 추가합니다(#1619).
- 스트림 끝 신호를 반환하지 않고 마지막 샘플 이후에 멈추는 코덱의 해결 방법을 추가합니다.
- 텍스트:
- 커스텀
VoiceSpan를 추가하고 WebVTT 음성 스팬에 채웁니다(#1632). - HLS에서 매우 큰 자막 타임스탬프 (마이크로초로 표시되고
90,000MPEG 타임베이스를 곱할 때 64비트long를 오버플로함)가 있는 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). - 기존 서비스에 연결될 때
MediaBrowser에서 전송된 맞춤 명령어가 메서드의MediaBrowserServiceCompat변형 대신MediaSessionCompat.Callback에 전달되는 버그를 수정했습니다. 이로 인해MediaBrowser가 기존 서비스에서 다시 전송한 실제 반환 값을 수신하지 못했습니다(#1474). - 미디어 버튼 인텐트의 broadcast receiver를 설정할 때 특정 제조업체의 기기에서 발생하는
IllegalArgumentException를 처리합니다 (#1730). - 미디어 항목의 명령어 버튼을 추가합니다. 이렇게 하면 기존 라이브러리에서
Custom browse actions로 알려진 항목에 Media3 API를MediaBrowserCompat와 함께 추가합니다. Media3를 사용하면 미디어 항목의 명령어 버튼을MediaBrowser와MediaController모두에 사용할 수 있습니다. 맞춤 탐색 작업 구현을 참고하세요. * Media3 컨트롤러가play()를 요청한 후 세션 앱에서 포그라운드 서비스를 시작하도록 허용하지 못하는 경우가 있는 버그를 수정했습니다. - 콘텐츠 URI만 허용하도록
CommandButton.Builder.setIconUri를 제한합니다. - 기존
MediaBrowserCompat에 연결할 때 Media3 브라우저의 연결 힌트를 초기MediaBrowserCompat에 전달합니다. 서비스는onGetRoot()에 대한 첫 번째 호출에서 루트 힌트로 전달된 연결 힌트를 수신할 수 있습니다. - 브라우저가
parentid를 구독한 후 기존 브라우저 서비스에 연결된MediaBrowser가 서비스에서 전송한 오류를 수신하지 않는 버그가 수정되었습니다. - 기존
MediaBrowserService에 연결된 Media3 브라우저가 상위 요소를 구독할 때parentId의 하위 요소를 두 번 요청하지 않도록 상호 운용성 동작을 개선합니다.
- 앱이 이 메서드를 재정의하여 재생 재개를 위해 들어오는 재생 명령어를 억제할 수 있도록
- UI:
- XML 기반 공유 전환 문제로 인해
PlayerView-in-Compose-AndroidView해결 방법에서 늘어난/잘린 동영상을 선택하도록 합니다.AndroidView내에서PlayerView를 사용하는 앱은 선택하려면PlayerView.setEnableComposeSurfaceSyncWorkaround를 호출해야 합니다(#1237, #1594). PlayerView에setFullscreenButtonState를 추가하여 클릭 상호작용에 반응하지 않고 대역 외에서 전체 화면 버튼의 아이콘을 필요에 따라 업데이트할 수 있도록 합니다(#1590, #184).- 앱 정의 텍스트 트랙 선택 환경설정이 있는 경우 텍스트 선택의 '없음' 선택이 작동하지 않는 버그를 수정합니다.
- XML 기반 공유 전환 문제로 인해
- DASH 확장 프로그램:
- 세그먼트 중간에서 시작하는 기간에 대한 지원을 추가합니다(#1440).
- Smooth Streaming 확장 프로그램:
- 텍스트 트랙이 있는 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 디코더 모듈을 추가합니다.
- Cast 확장 프로그램:
- CastSession 연결이 끊긴 후 타임라인 정리를 중지합니다. 이렇게 하면 연결이 끊긴 후 발신자 앱이 로컬에서 재생을 재개할 수 있습니다.
Context가 제공되면 CastPlayer의DeviceInfo를 채웁니다. 이렇게 하면MediaSession를RoutingSession에 연결할 수 있으며, 이는 출력 전환기를 통합하는 데 필요합니다(#1056).
- 테스트 유틸리티:
- 이제
DataSourceContractTest에 다음을 확인하는 테스트가 포함됩니다.- 입력 스트림
read position이 업데이트되었습니다. - 출력 버퍼
offset가 올바르게 적용됩니다.
- 입력 스트림
- 이제
- 데모 앱
- 데모 짧은 형식 앱의 메모리 누수를 해결합니다. (#1839)
- 지원 중단된 기호 삭제:
- I have removed the deprecated
Player.hasPreviousandPlayer.hasPreviousWindow(). 대신Player.hasPreviousMediaItem()를 사용하세요. - 지원 중단된
Player.previous()메서드를 삭제합니다. 대신Player.seekToPreviousMediaItem()를 사용합니다. - 지원 중단된
DrmSessionEventListener.onDrmSessionAcquired메서드를 삭제합니다. - 지원 중단된
DefaultEncoderFactory생성자를 삭제합니다. 대신DefaultEncoderFactory.Builder를 사용합니다.
- I have removed the deprecated
버전 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값 처리를 수정합니다. - 요청된 출력 시작 시간이
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에 포함된 커밋을 확인하세요.
- 공통 라이브러리:
- 추정된 노옵(no-op) 탐색 호출을 무시하는 대신 보호된
BasePlayer.seekTo()및SimpleBasePlayer.handleSeek()메서드로 전달합니다. 커스텀 플레이어에서 이러한 메서드를 구현하는 경우mediaItemIndex == C.INDEX_UNSET를 사용하여 이러한 추가 호출을 처리해야 할 수 있습니다. - 향상된 Java 8 디슈가링에 대한 컴파일 종속 항목을 삭제합니다(#1312).
MediaItem.Builder.setImageDurationMs()에 전달된 기간이 문서에 설명된 대로 이미지가 아닌MediaItem에 대해 무시되는지 확인합니다.Format.customData를 추가하여Format인스턴스에 관한 앱 제공 맞춤 정보를 저장합니다.
- 추정된 노옵(no-op) 탐색 호출을 무시하는 대신 보호된
- ExoPlayer:
rankingData에서 정의한 우선순위에 따라 여러 소스의 미리 로드를 조정하는BasePreloadManager를 추가합니다. 이 클래스를 확장하여 맞춤설정할 수 있습니다.PreloadMediaSource를 사용하여 소스의 미디어 샘플을 메모리에 미리 로드하고 UI에서 항목의 색인을 나타내는 정수rankingData를 사용하는DefaultPreloadManager를 추가합니다.LoadControl의 대부분 메서드에PlayerId를 추가하여LoadControl구현이 여러 플레이어를 지원하도록 합니다.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()를 추가하여 미리 로드 관리자 인스턴스를 유지하면서 모든 보류 소스를 해제합니다.PriorityTaskManager에서 사용되는 우선순위 값과 API 35의 MediaCodec 중요도를 정의하기 위해ExoPlayer.setPriority()(및Builder.setPriority())를 추가합니다.- 마지막 리버퍼링 시간을 업데이트하여 CMCD에서 잘못된
bs(버퍼 부족) 키가 발생하는 문제를 수정했습니다(#1124). PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)를 추가하여 소스가 끝까지 로드되었음을 나타냅니다. 이렇게 하면DefaultPreloadManager및 맞춤PreloadMediaSource.PreloadControl구현이 다음 소스를 미리 로드하거나 다른 작업을 실행할 수 있습니다.- 항목 끝에서 무음 건너뛰기가 재생 예외를 트리거할 수 있는 버그를 수정합니다.
PreloadMediaSource에clear를 추가하여 미리 로드 기간을 삭제합니다.- 우선순위가 더 높은 작업을 위해 코덱 리소스가 회수될 때 사용되는 새 오류 코드
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED를 추가합니다. AdsMediaSource가 초기 콘텐츠 미디어 준비가 완료되기 전에 프리롤 광고를 로드하도록 합니다(#1358).- 원본 기간이 이미 매니페스트에서 삭제된 후 다중 기간 DASH 라이브 스트림을 다시 준비할 때 재생이
STATE_ENDED로 이동하는 버그를 수정했습니다. PreloadMediaSource.PreloadControl에서onTimelineRefreshed()을onSourcePrepared()로,onPrepared()을onTracksSelected()로 바꿉니다. 이에 따라DefaultPreloadManager.Stage의 IntDef 이름도 바꿉니다.- 동적 예약에 관한 실험용 지원을 추가하여 CPU 절전 모드 해제 주기에 맞춰 작업을 더 잘 조정하고 렌더러가 진행할 수 있을 때까지 절전 모드 해제를 지연합니다.
ExoPlayer 인스턴스를 설정할 때
experimentalSetDynamicSchedulingEnabled()를 사용하여 이 기능을 사용 설정할 수 있습니다. Renderer.getDurationToProgressUs()를 추가합니다.Renderer는 이 메서드를 구현하여 렌더러가 진행하기 위해 재생이 진행되어야 하는 기간을 ExoPlayer에 반환할 수 있습니다.ExoPlayer가experimentalSetDynamicSchedulingEnabled()로 설정된 경우ExoPlayer는 작업 예약 시간을 계산할 때 이 메서드를 호출합니다.MediaCodecRenderer에서 사용할 수 있는 입력 및 출력 버퍼가 있을 때 알림을 표시하도록MediaCodecAdapter#OnBufferAvailableListener를 추가합니다.MediaCodecRenderer는 이러한 콜백을 수신할 때ExoPlayer에 신호를 보내고,ExoPlayer가experimentalSetDynamicSchedulingEnabled()로 설정된 경우ExoPlayer는 렌더러가 진행할 수 있으므로 작업 루프를 예약합니다.- 개별 매개변수 대신
LoadControl메서드에 데이터 클래스를 사용합니다. ExoPlayer.isReleased()를 추가하여Exoplayer.release()가 호출되었는지 확인합니다.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-프레임 전용 HLS 스트림(#1150) 및 H.262 HLS 스트림(#1126)에서 발생한 문제를 해결하기 위한 수정사항을 통합합니다.
- MP3: 기본 스트림에서 보고한 크기 (예: 파일 크기 또는 HTTP
Content-Length헤더)보다Info프레임의 데이터 크기를 선호합니다. 이렇게 하면 재생할 수 없는 트레일러 데이터 (예: 앨범 아트워크)를 고정 비트 전송률 탐색 계산에서 제외하여 탐색이 더 정확해집니다(#1376). - MP3:
Info프레임(있는 경우)의 프레임 수 및 기타 데이터를 사용하여 고정 비트 전송률 탐색의 평균 비트 전송률을 계산합니다.Info프레임 뒤에 있는 프레임의 비트 전송률에서 추정하지 않습니다. 이 비트 전송률은 인위적으로 작을 수 있습니다(예:PCUT프레임)(#1376). - AVI 컨테이너의 PCM 오디오 형식 추출을 수정합니다.
- 오디오:
- 패스 스루 재생을 위한 DTS:X Profile 2 인코딩 속성을 수정합니다(#1299).
- 오프로드된 재생의 경우
AudioTrack.stop()를 호출하기 전에DefaultAudioSink에서 스트림 완료를 위한 추적 필드를 재설정하여 모든 대기 중인 데이터가 재생된 시점을AudioTrack.StreamEventCallback#onPresentationEnded가 올바르게 식별하도록 합니다. SilenceSkippingAudioProcessor에서 서로 다른 오디오 형식 간의 전환 (예: 스테레오에서 모노로)으로 인해 프로세서에서 예외가 발생할 수 있는 버그를 수정했습니다(#1352).- ExoPlayer가 MediaCodecAudioRenderer가 진행될 수 있을 때 기본 작업 루프를 동적으로 예약하도록
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의 단순한 'set pen location' 명령어 처리로 인해 중복된 줄바꿈이 추가되지 않도록 합니다(#1315).
- WebVTT 자막 샘플에 신호가 없는 경우(예: DASH 스트림의 일부)
LegacySubtitleUtil의IllegalArgumentException를 수정합니다(#1516).
- 메타데이터:
- 이미지:
- 정사각형이 아닌 DASH 썸네일 그리드 지원을 추가합니다(#1300).
- API 34 이상에 AVIF 지원을 추가합니다.
null를ExoPlayer.setImageOutput()의 매개변수로 허용하여 이전에 설정된ImageOutput를 삭제합니다.
- DataSource:
package가 현재 애플리케이션의 패키지와 다른android.resource://package/id원시 리소스 URI에 대한 지원을 구현합니다. 이전에는 작동하는 것으로 문서화되지 않았지만 이름이 아닌 다른 패키지의 리소스에 액세스하는 더 효율적인 방법입니다.DataSpec생성자에서url가 null이 아닌지 적극적으로 확인합니다. 이 매개변수는 이미 null이 아닌 것으로 주석 처리되었습니다.ByteArrayDataSource가 구성 시 하드 코딩되는 대신open()중에 URI를 바이트 배열로 변환할 수 있도록 허용합니다(#1405).
- DRM:
DefaultDrmSessionManagerProvider에서LoadErrorHandlingPolicy를 설정할 수 있습니다(#1271).
- 효과:
SpeedChangeEffect에서 동일한EditedMediaItem또는Composition내에서 여러 속도 변경을 지원합니다.- 울트라 HDR 비트맵 입력에서 HLG 및 PQ 출력을 지원합니다.
- EGL_GL_COLORSPACE_BT2020_HLG_EXT 지원을 추가하여 ExoPlayer.setVideoEffect 및 Transformer의 디버그 SurfaceView에서 HLG 표면 출력을 개선합니다.
setOverlayFrameAnchor()에 적용된 x 및 y 값을 뒤집어 문서와 일치하도록 오버레이 행렬 구현을 업데이트합니다.OverlaySettings.Builder.setOverlayFrameAnchor()를 사용하는 경우 x 및 y 값에-1를 곱하여 값을 뒤집습니다.TimestampWrapper를ExoPlayer#setVideoEffects와 함께 사용할 때 비정상 종료되는 버그를 수정했습니다(#821).- 기본 SDR 색상 작업 공간을 선형 색상에서 전기 BT 709 SDR 동영상으로 변경합니다. 원래 색상 공간을 유지하는 세 번째 옵션도 제공합니다.
- EditedMediaItemSequences의 불확정 z 순서를 정의할 수 있습니다(#1055).
- 다양한 HDR 콘텐츠에서 일관된 휘도 범위를 유지합니다 (HLG 범위 사용).
- HDR 콘텐츠에 울트라 HDR (비트맵) 오버레이 지원을 추가합니다.
- API 26 이전에
SeparableConvolution효과를 사용할 수 있도록 허용합니다. - 오버레이와 프레임의 다이내믹 레인지가 일치해야 하므로 사용하지 않는
OverlaySettings.useHdr를 삭제합니다. TextOverlay에 HDR 지원을 추가합니다. 텍스트 오버레이의 휘도는OverlaySettings.Builder.setHdrLuminanceMultiplier()로 조정할 수 있습니다.
- IMA 확장 프로그램:
- 앱에서 DAI 광고 스트림을 재생하는 데 필요한 API를 안정화 버전으로 승격합니다.
- 런타임에 광고 태그 매개변수를 대체할 수 있는
replaceAdTagParameters(Map <String, String>)를ImaServerSideAdInsertionMediaSource.AdLoader에 추가합니다. - 광고 재생 중에 플레이어 오류가 발생했을 때
VideoAdPlayer.VideoAdPlayerCallback.onError()가 호출되지 않는 버그를 수정했습니다. (#1334) data://광고 태그 URI를 사용할 때 발생하는NullPointerException를 수정하기 위해 IMA SDK 버전을 3.33.0으로 범프합니다(#700).
- 세션:
CommandButton.enabled의 기본값을true로 변경하고 연결된 명령어를 사용할 수 있는 경우에도 컨트롤러의 값이 false로 유지될 수 있도록 합니다.- 맞춤 아이콘 리소스 대신 사용해야 하는
CommandButton의 아이콘 상수를 추가합니다. MediaSessionService.isPlaybackOngoing()를 추가하여 앱이onTaskRemoved()에서 서비스를 중지해야 하는지 쿼리할 수 있도록 합니다(#1219).- 모든 세션의 재생을 편리하게 일시중지하고
stopSelf()를 호출하여MediaSessionService의 수명 주기를 종료할 수 있는MediaSessionService.pauseAllPlayersAndStopSelf()를 추가합니다. MediaSessionService.onTaskRemoved(Intent)를 재정의하여 재생이 진행 중인 경우 포그라운드에서 서비스를 계속 실행하고 그렇지 않은 경우 서비스를 중지하는 안전한 기본 구현을 제공합니다.- 플랫폼 세션 메타데이터에 재생 시간을 설정하지 않음으로써 라이브 스트림의 미디어 알림에서 탐색 막대를 숨깁니다(#1256).
MediaMetadata에서MediaDescriptionCompat로의 변환을 정렬하여 media1에서와 같이 메타데이터 속성을 선택할 때 동일한 기본 순서와 로직을 사용합니다.- 심각하지 않은 오류를 Media3 컨트롤러에 전송할 수 있는
MediaSession.sendError()를 추가합니다. 알림 컨트롤러를 사용할 때 (MediaSession.getMediaNotificationControllerInfo()참고) 커스텀 오류는 플랫폼 세션의PlaybackState를 지정된 오류 정보가 있는 오류 상태로 업데이트하는 데 사용됩니다(#543). 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 확장 프로그램:
- Cast 확장 프로그램:
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의 '실제' 동영상 트랙을 선택할 수 있습니다. 이 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-태그)을 건너뜁니다. (#1087)
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1, MIDI 등):
- 추가 Maven 저장소를 구성해야 하므로 기본적으로 MIDI 확장 프로그램을 로컬 종속 항목으로 사용 중지합니다. 로컬 종속 항목에서 이 모듈이 필요한 사용자는 다시 사용 설정할 수 있습니다.
버전 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이며, 이는 동영상 트랙 선택이 우선순위가 높음을 의미합니다.
- 추출기:
- MP4 추출기에 추가 AV1C 파싱을 추가하여
ColorInfo.colorSpace,ColorInfo.colorTransfer,ColorInfo.colorRange값을 가져옵니다(#692). - MP3:
Info헤더 (Xing헤더의 CBR에 상응)가 있는 파일에 상수 비트 전송률(CBR) 탐색을 사용합니다. 이전에는Info헤더의 탐색 테이블을 사용했지만, 이 경우 탐색 테이블을 무시하고 파일이 CBR이라고 가정하는 것보다 세밀한 탐색이 덜 정확해집니다. - MPEG2-TS: DTS, DTS-LBR, DTS:X Profile2 지원을 추가합니다(#275).
- TS 설명자에서 오디오 유형을 추출하고 역할 플래그에 매핑하여 사용자가 더 많은 정보를 바탕으로 오디오 트랙을 선택할 수 있도록 합니다(#973).
- MP4 추출기에 추가 AV1C 파싱을 추가하여
- 오디오:
- 동영상:
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 콘텐츠에서 'clear lead' 암호화되지 않은 샘플을 즉시 재생합니다. 이로 인해 재생 위치가 암호화된 샘플에 도달할 때 키가 아직 준비되지 않은 경우 재생 중간에 중단될 수 있습니다 (하지만 이전에는 이 시점에서 재생이 전혀 시작되지 않았음). 이 동작은
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey또는DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys를 사용하여 사용 중지할 수 있습니다.- IMA 확장 프로그램:
- 적절한 파일 확장자가 없는 DASH 및 HLS 광고를 재생할 수 없는 문제가 해결되었습니다.
- 이후 암호화된 샘플의 키가 아직 준비되지 않은 경우에도 기본적으로 DRM 콘텐츠에서 'clear lead' 암호화되지 않은 샘플을 즉시 재생합니다. 이로 인해 재생 위치가 암호화된 샘플에 도달할 때 키가 아직 준비되지 않은 경우 재생 중간에 중단될 수 있습니다 (하지만 이전에는 이 시점에서 재생이 전혀 시작되지 않았음). 이 동작은
- 세션:
- 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).
- 여러 번 호출될 때
- 동영상:
- Galaxy Tab S7 FE, Chromecast with Google TV, Lenovo M10 FHD Plus에서 60fps AVC 스트림이 지원되지 않는 것으로 표시되는 기기 문제의 해결 방법을 추가했습니다(#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로 'f800'을 파싱합니다(#688).
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1, MIDI 등):
- Cast 확장 프로그램:
- 전송 기기에서 미디어 로드에 실패할 때 앱이 비정상 종료되지 않도록
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). androidx.annotation:annotation-experimental를1.3.1로 업그레이드하여 https://issuetracker.google.com/251172715를 수정합니다.ExoPlayer.setAudioAttributes를Player인터페이스로 이동합니다.
- ExoPlayer:
- 디코딩 전용 샘플을 올바르게 식별하지 못해 발생하는 AC4 스트림의 탐색 문제를 수정합니다. (#11000)
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput를 통해 이 기능을 사용 설정하면 부적합한 오디오 출력 장치 (예: Wear OS 기기의 내장 스피커)에서 재생이 억제됩니다. 적합한 오디오 출력을 사용할 수 없을 때 재생을 시도하거나 재생 중에 적합한 출력이 모두 연결 해제되면 재생 억제 이유가Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT로 업데이트됩니다. 적절한 출력이 연결되면 억제 이유가 삭제됩니다.MediaSource.canUpdateMediaItem및MediaSource.updateMediaItem를 추가하여Player.replaceMediaItem(s)를 통해 생성 후MediaItem업데이트를 허용합니다.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).- CMCD(Common Media Client Data) 로깅에 추가 필드(다음 객체 요청(
nor) 및 다음 범위 요청(nrr))를 추가합니다(#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클래스로 이동합니다. onAudioTrackInitialized및onAudioTrackReleased콜백을AnalyticsListener,AudioRendererEventListener,AudioSink.Listener에 추가합니다.- 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 관련 문제를 방지하려면 API 31 이상에서만
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()를 사용하세요. (#167) - 미디어 알림 컨트롤러를 프록시로 사용하여 알림 및 플랫폼 세션을 채우는 데 사용되는 사용 가능한 명령어와 맞춤 레이아웃을 설정합니다.
MediaSessionService.onStartCommand()에서 수신한 미디어 버튼 이벤트를 플랫폼 세션으로 라우팅한 후 Media3로 다시 라우팅하는 대신 Media3 내에서 변환합니다. 이렇게 하면 호출자 컨트롤러가 항상 미디어 알림 컨트롤러가 되며 앱은 지원되는 모든 API 수준에서 동일한 방식으로 알림에서 오는 호출을 쉽게 인식할 수 있습니다.- 기존
MediaSessionCompat에 연결될 때MediaController.getCurrentPosition()가 진행되지 않는 버그를 수정했습니다. - 편의를 위해
MediaLibrarySession.getSubscribedControllers(mediaId)를 추가합니다. MediaLibrarySession.Callback.onSubscribe()를 재정의하여 컨트롤러가 구독하는 상위 ID의 가용성을 어설션합니다. 성공하면 구독이 수락되고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).- 기존 명령어(
COMMAND_ADJUST_DEVICE_VOLUME및COMMAND_SET_DEVICE_VOLUME)와 새 명령어 (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS및COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS)를 모두 통해volumeControlType를 결정하여PlayerWrapper가VolumeProviderCompat를 만드는 방식을 수정합니다(#554).
- 컨트롤러 상태에 맞춤 레이아웃을 추가하고 이에 액세스할 수 있는 getter를 제공합니다. 맞춤 레이아웃이 변경되면
버전 1.1.0
2023년 7월 5일
- 공통 라이브러리:
- 부적합한 오디오 경로에 대한 억제 이유를 추가하고 준비되면 재생합니다. 너무 오랫동안 억제된 이유를 변경합니다. (#15)
- Player에 명령어를 추가합니다.
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를 추가하고 기존 생성자를 지원 중단합니다.DeviceInfo.routingControllerId를 추가하여 원격 재생의 라우팅 컨트롤러 ID를 지정합니다.- 동일한 위치에서 항목을 추가하고 삭제하는 바로가기로
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()를 추가합니다. sourceId를int가 아닌long로 저장하도록SampleQueue를 업데이트합니다. 이렇게 하면 공개 메서드SampleQueue.sourceId및SampleQueue.peekSourceId의 서명이 변경됩니다.LoadControl메서드shouldStartPlayback및onTracksSelected에 이러한 메서드를 관련MediaPeriod와 연결할 수 있는 매개변수를 추가합니다.- 맵에서 키로 사용되는 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를 추가합니다. - 오디오 기능 변경 후 우회 모드가 가능할 때 오디오 디코더를 삭제하기 위해 새 int 값
DISCARD_REASON_AUDIO_BYPASS_POSSIBLE를DecoderDiscardReasons에 추가합니다. - 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 패키지 외부에서 호출되지 않을 것으로 예상되는
- 멀티플렉서:
- MP4 컨테이너 파일을 만드는 데 사용할 수 있는 새로운 muxer 라이브러리를 추가합니다.
- IMA 확장 프로그램:
- DAI에 다중 기간 라이브 DASH 스트림을 사용 설정합니다. 현재 구현에서는 아직 라이브 스트림 탐색을 지원하지 않습니다. (#10912)
- 연속된 타임라인에서 계산된 콘텐츠 위치가 약간 다르기 때문에 라이브 스트림에 새 광고 그룹이 삽입되는 버그가 수정되었습니다.
- 세션:
- 도우미 메서드
MediaSession.getControllerForCurrentRequest를 추가하여 현재Player메서드를 호출하는 컨트롤러에 관한 정보를 가져옵니다. androidx.media3.session.MediaButtonReceiver를 추가하여 앱이 블루투스 헤드셋과 같은 기기에서 전송된 미디어 버튼 이벤트로 재생 재개를 구현할 수 있도록 합니다. (#167)LocalConfiguration(예: URI)가 있는 경우 요청된MediaItems를Player에 전달할 수 있도록MediaSession.Callback.onAddMediaItems에 기본 구현을 추가합니다(#282).- Android 12 이하의 경우 기본적으로 소형 미디어 알림 뷰에 '이전으로 탐색' 및 '다음으로 탐색' 명령 버튼을 추가합니다(#410).
LocalConfiguration(예: URI)가 있는 경우 요청된MediaItems를Player에 전달할 수 있도록MediaSession.Callback.onAddMediaItems에 기본 구현을 추가합니다(#282).- Android 12 이하의 경우 기본적으로 소형 미디어 알림 뷰에 '이전으로 탐색' 및 '다음으로 탐색' 명령 버튼을 추가합니다(#410).
- 도우미 메서드
- UI:
- 유틸리티 메서드
shouldShowPlayButton및handlePlayPauseButtonAction를 추가하여 재생/일시중지 버튼이 있는 맞춤 UI 요소를 작성합니다.
- 유틸리티 메서드
- RTSP 확장 프로그램:
- DASH 확장 프로그램:
- 여러 기간 DASH 스트림의
MediaLoadData.startTimeMs및MediaLoadData.endTimeMs에서 미디어 시간 오프셋을 삭제합니다. - 여러 기간의 실시간 DASH 미디어 소스를 다시 준비하면
IndexOutOfBoundsException이 발생하는 버그를 수정했습니다. (#10838)
- 여러 기간 DASH 스트림의
- HLS 확장 프로그램:
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)를 추가하여 로드 스레드가TimestampAdjuster초기화를 기다리는 제한 시간을 설정합니다. 제한 시간 전에 초기화가 완료되지 않으면 재생이 끝없이 지연되는 것을 방지하기 위해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생성자 2개를 삭제하고, 추가 필드(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를 삭제하고 대신onPositionDiscontinuity를DISCONTINUITY_REASON_SEEK와 함께 사용합니다. 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).
- 세션:
- 작업을 업데이트하는 기존
MediaSessionCompat에 연결될 때MediaController가 사용 가능한 명령어를 업데이트하지 않는 문제를 수정했습니다. - 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). - 기존
MediaControllerCompat.Callback.onSessionEvent에 누락된MediaSession.broadcastCustomCommand전달을 추가합니다. (#293) MediaSession.setPlayer를 호출해도 사용 가능한 명령어가 업데이트되지 않는 버그를 수정했습니다.MediaController에서 전송된TrackSelectionOverride인스턴스가Format.metadata이 있는 그룹을 참조하는 경우 무시되는 문제를 수정합니다. (#296)- 기존
MediaSessionCompat를 통해 메타데이터에 액세스하려면Player.COMMAND_GET_CURRENT_MEDIA_ITEM를 사용할 수 있어야 하는 문제를 해결합니다. MediaSessionService에서 사용될 때 백그라운드 스레드의MediaSession인스턴스로 인해 비정상 종료가 발생하는 문제를 수정했습니다(#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에 매핑합니다. - Chromecast with Google TV 및 Lenovo M10 FHD Plus에서 60fps AVC 스트림이 지원되지 않는 것으로 표시되는 기기 문제의 해결 방법을 추가합니다(#10898).
- 화면 재생 빈도보다 훨씬 높은 프레임 속도로 미디어를 재생할 때 프레임 해제 성능 문제를 수정합니다.
- HEVC HDR10 형식을
- 전송:
- 미디어 항목 간에 전환할 때 일시적인
STATE_IDLE를 수정합니다(#245).
- 미디어 항목 간에 전환할 때 일시적인
- RTSP:
- 잘못된 RTSP Describe 응답 메시지 파싱에서 발생한 IllegalArgumentException을 포착합니다(#10971).
- 세션:
- 알림 재생/일시중지 버튼이 플레이어 상태에 따라 업데이트되지 않는 버그를 수정했습니다 (#192).
- IMA 확장 프로그램:
- 첫 번째 (광고가 없는 경우 유일한)
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 모듈로 대체됩니다. 따라서 어댑터/커넥터 클래스를 사용하지 않고도 플레이어와 미디어 세션을 직접 통합할 수 있습니다.