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 및 ColorInfo ISO 색상 매핑에서 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를 JSpecify org.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: 많은 MediaCodec MP3 디코더와 호환되지 않으므로 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초 타임스탬프 점프를 수정합니다.
  • 검사기:
    • 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에서 불필요한 오디오 버퍼 복사를 방지합니다.
  • 동영상:
    • 출시 타임스탬프가 동일한 지연 동영상 프레임의 보고를 수정하여 건너뛰는 대신 삭제된 것으로 보고합니다.
  • 텍스트:
    • MediaItem.SubtitleConfiguration.timeOffsetUs를 추가하여 미디어와 관련된 사이드로드된 자막의 타임스탬프를 이동합니다. 오프셋은 재생 중에 Player.replaceMediaItem(int, MediaItem)를 사용하여 재생을 중단하지 않고 변경할 수 있습니다(#1976).
    • SubRip: 바이트 순서 표시 없이 독립형 SubRip 자막의 문자 인코딩을 감지하기 위해 CharsetDetector를 DefaultSubtitleParserFactory에 삽입하는 지원을 추가합니다(#2247).
  • 효과:
    • StudioSound GMSCore 모듈을 사용하여 오디오 소스 분리를 위한 SoundSeparationAudioProcessor를 구현합니다.
  • 멀티플렉서:
    • 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).
  • 디코더 확장 프로그램 (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로 늘립니다.

버전 1.11.0

1.11.1

2026년 9월 10일

  • ExoPlayer:
    • 프로그레시브 미디어의 HAGC 메타데이터를 사용 설정/사용 중지하는 플래그를 MediaSource.Factory에서 ExtractorsFactory로 이동합니다. 이전 setExperimentalEnableHagcPlayback 메서드가 삭제되고 ExtractorsFactory.setParseHagcMetadata로 대체됩니다. 이렇게 하면 Matroska/WebM 컨테이너에서 사용 중지가 작동하지 않는 문제도 해결됩니다.
    • 비전이적 보조 렌더기를 미리 준비할 때 발생하는 재생 중단 문제를 수정합니다.
    • 탐색이 두 렌더러를 모두 재설정하고 사용 중지할 때 Surface가 기본 렌더러로 반환되어야 하는 사전 준비 문제가 해결되었습니다.
    • 실시간 타임라인 새로고침으로 인해 기본 위치가 현재 재생 중인 서버 측 삽입 광고를 지나 이동할 때 발생하는 ArrayIndexOutOfBoundsException를 수정했습니다. (#3348)
    • ScrubbingModeParameters.allowSkippingMediaCodecFlush가 사용 설정된 상태에서 탐색할 때 오래된 동영상 프레임이 잠시 표시될 수 있는 스크러빙 모드 문제가 해결되었습니다.
  • 추출기:
    • Matroska: 클러스터 뒤에 배치된 트랙으로 인해 탐색 가능한 타임라인이 생성되지 않는 문제를 해결합니다(#3377).
  • 오디오:
    • 최소 무음 지속 시간이 프레임 크기로 인해 잘못 축소되지 않도록 SilenceSkippingAudioProcessor의 버퍼 사이즈 계산을 수정합니다 (#3271).
    • Android에서 정의한 대로 샘플을 부호 없는 것으로 처리하도록 PcmAudioUtil에서 8비트 PCM 처리를 수정합니다(#3271).
    • 제한된 하드웨어 버퍼 사이즈로 인해 프리롤 또는 끊김 없는 전환 중에 플레이백이 중단될 수 있는 오프로드 문제를 수정합니다.
    • 재생 스레드가 더 이상 활성 상태가 아닐 때 출시 횟수가 감소하지 않는 DefaultAudioSink의 버그를 수정했습니다(#3338).
  • 세션:
    • Player.Listener 콜백에서 진행 중인 MediaController가 해제될 때 발생하는 NullPointerException를 수정했습니다(#3375).
    • 기존 MediaBrowser가 onGetLibraryRoot() 또는 onConnectAsync()에서 비동기 결과를 반환하는 서비스에 연결할 때 기본 스레드의 교착 상태를 수정합니다(#3393).
  • HLS 확장 프로그램:
    • 스냅할 타겟 세그먼트가 아직 재생목록에 없는 경우 콘텐츠 재개 오프셋 계산을 수정합니다(#3322).
    • 완전히 사용된 HlsMediaChunk가 추출기에서 EOFException를 수신할 때 로드를 재시도하는 문제를 수정했습니다(#3350).
  • DASH 확장 프로그램:
    • presentationTimeOffset가 있는 이미지 트랙의 잘못된 샘플 타임스탬프 계산을 수정합니다(#3334).
  • 디코더 확장 프로그램 (FFmpeg, VP9, AV1 등):
    • Opus: 여러 OpusDecoder 인스턴스가 동시에 초기화될 때 발생하는 메모리 손상을 수정합니다.
    • MPEG-H: MpeghUiManager에 명령어를 전송할 때 메모리 누수, ASCII가 아닌 문자의 잘림, 메모리가 부족한 상황에서 발생할 수 있는 네이티브 충돌을 수정합니다(#3365).

버전 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).
    • '스트림 끝'으로 탐색할 때 스크러빙이 중단될 수 있는 잠재적인 스크러빙 모드 문제를 수정합니다.
  • 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).
  • 오디오:
    • 준비 상태에서 준비되지 않은 상태로 전환할 때 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의 버그를 수정했습니다.
  • 텍스트:
    • TTML: 리전의 경우 style에서 displayAlign로 대체됩니다(#2559).
    • TTML: <p> 요소의 상위 요소에서 큐 시작 시간을 상속합니다(#3246).
  • 메타데이터:
    • MediaMetadata.discSubtitle 필드를 추가하고 ID3v2.4 TSST 및 Vorbis DISCSUBTITLE 데이터에서 파싱합니다.
    • ID3 TPOS 프레임에서 디스크 번호 및 개수를 파싱합니다.
  • 효과:
    • 탐색 시 플레이어가 정지되지 않도록 플러시할 때 FinalShaderProgramWrapper에서 다시 그리기 상태를 지웁니다.
  • 멀티플렉서:
    • 새 addTrackReference API를 통해 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을 추가하여 활성 미디어 세션을 쿼리하고 Media3 SessionToken 인스턴스를 반환하는 기능을 지원합니다.
    • 메서드가 신뢰할 수 없는 컨트롤러에 읽기 액세스 권한만 제공하도록 재정의되지 않은 경우 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 객체에 원래 Timeline UID가 누락되는 문제를 수정했습니다. 이제 세션은 상태 업데이트 중에 이러한 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 및 Compose PresentationState의 셔터 억제 버그를 수정했습니다(#3264).
  • 다운로드:
    • 다운로드를 위해 가져올 때 미디어 재생목록에서 HLS 변수를 확인합니다(#3258).
  • Ktor 확장 프로그램:
    • Ktor HTTP 스택에서 지원하는 KtorDataSource를 제공하는 새 media3-datasource-ktor 확장 프로그램 모듈을 추가합니다.
    • 연결을 열 때 전체 HTTP 응답 본문을 메모리에 로드하는 KtorDataSource를 수정했습니다(#3305).
  • 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 확장 프로그램:
    • 언어에 따라 CEA 자막을 다른 TrackGroup로 분리합니다 (#3113).
    • 매니페스트(MPD)에서 여러 Location 요소를 파싱하고 매니페스트 로드가 실패할 때 DashMediaSource에서 위치 대체 실행을 지원합니다.
    • 빈 <SegmentTimeline/> 요소가 있는 매니페스트를 열 때 발생하는 비정상 종료 (IndexOutOfBoundsException)를 수정했습니다(#3326).
  • 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 속성은 더 이상 사용되지 않습니다.

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:
    • 터널링 모드에서 IllegalStateException를 유발할 수 있는 오디오 세션 ID 생성과 관련된 경합 상태를 수정합니다. (#3099)
    • 렌더러 사전 준비를 통해 디코더 오류에서 복구할 때 발생할 수 있는 앱 비정상 종료 문제를 수정합니다.
    • AV1 기반 Dolby Vision 코덱을 사용할 때 초기화 데이터를 제공하여 동영상 아티팩트가 발생하는 문제를 해결합니다(#3153).
  • 트랙 선택:
    • 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 확장 프로그램:
    • 트랙 선택이 사용 가능한 트랙의 하위 집합인 경우 스트림 대체 중에 ArrayIndexOutOfBoundsException가 발생하는 버그를 수정했습니다 (#3161).
    • 후속 업데이트에서 #EXT-X-MAP 태그가 반복되지 않은 경우 미디어 재생목록 업데이트 전반에서 초기화 세그먼트가 이월되지 않는 문제를 수정했습니다(#3105).
  • 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) 트랙 지원을 추가합니다.
  • 검사기:
    • 브레이킹 체인지: 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의 새로운 필드와 로직에 의해 지원됩니다.
    • 압축 오프로드 모드에서 끊김 없는 오디오 재생목록을 재생할 때 재생이 멈추는 버그를 수정합니다.
  • 텍스트:
    • VobSub: 항상 기본값인 5초로 설정하는 대신 START 및 STOP SPU 제어 명령어를 사용하여 큐 지속 시간을 도출합니다(#2935).
  • 메타데이터:
    • HLS 변형 및 표현에서 게시하는 모든 잠재적 메타데이터 트랙을 처리할 수 있도록 메타데이터 렌더러의 기본 수를 4개로 늘립니다(#3043).
  • 효과:
    • LottieOverlay를 새 :media3-effect-lottie 모듈로 이동합니다 (이름을 androidx.media3.effect.LottieOverlay에서 androidx.media3.effect.lottie.LottieOverlay로 바꾸는 작업도 포함됨).
  • 효과 Lottie:
    • 동영상 프레임에 lottie 효과를 적용하는 기능을 제공하는 새로운 :media3-effect-lottie 모듈을 도입합니다.
  • IMA 확장 프로그램:
    • 최신 광고 미디어 정보 API에 액세스하려면 IMA SDK 버전을 3.39.0으로 업데이트하세요.
    • 광고 MIME 유형이 IMA LOADED 이벤트에 제공된 MIME 유형과 일치하지 않는 버그가 수정되었습니다. 이제 IMA에서 제공하는 광고 미디어 정보를 사용하여 광고 MIME 유형을 매핑합니다.
    • setEnableCustomTabs를 ImaAdsLoader 및 ImaServerSideAdInsertionMediaSource에 추가하여 사용자가 맞춤 탭을 사용하여 광고 클릭연결 URL을 실행할지 여부를 제어할 수 있습니다.
    • adTagUri를 구성하는 대체 방법을 제공하는 클래스인 ImaAdTagUriBuilder를 추가합니다. 여기에는 setPreferredLinearOrientation API가 포함되어 있습니다. 선형 광고에 선호하는 방향을 설정할 수 있는 알파 테스트 중인 API입니다. 알파 테스트 그룹에 참여하려면 계정 파트너에게 문의하세요.
  • 세션:
    • MediaMetadata.artworkData의 큰 배열로 인해 앱이 비정상 종료될 수 있는 버그를 수정했습니다.
    • ActionFactory 인터페이스에서 @Player.Command 인수에 int 유형을 사용합니다 (#2933).
    • MediaSessionService 및 MediaLibraryService를 LifecycleService로 만들어 수명 주기 인식 작업을 서비스 수명 주기에 연결할 수 있습니다(#187).
    • 로컬 재생을 위한 MediaController 및 MediaBrowser의 기기 볼륨 변경 명령어 지원을 중지합니다. 앱은 로컬 기기 볼륨을 변경해서는 안 되며, 필요한 경우 이 목적으로 AudioManager API를 사용할 수 있습니다.
    • 서비스를 포그라운드 서비스로 시작한 비활성 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 확장 프로그램:
    • HLS 전면 광고로 X-PLAYOUT-LIMIT를 지원합니다(#2484).
    • #EXT-X-DEFINE로 QUERYPARAM 속성을 지원합니다. (#1854)
    • 정규 표현식 일치자를 캐싱하여 HLS 재생목록 파싱을 최적화합니다(#3008).
    • 오디오 표현에서 ID3 (EMSG) 메타데이터 트랙을 노출합니다(#3043).
    • 다른 위치의 중복 스트림을 사용할 수 있는 경우 로드 오류가 발생하면 위치 대체 허용(#1988)
    • 시작 및 재개 위치를 올바르게 계산하도록 HLS 인스티셜의 X-SNAP 동작을 수정합니다(#3013).
  • DASH 확장 프로그램:
    • 정렬되지 않은 세그먼트 시작 시간이 있는 트랙으로 인해 재생 시작 시 지연이 발생하거나 샘플이 누락되는 문제를 수정합니다(#3057).
    • 인밴드 EMSG v0 메타데이터의 타임스탬프가 올바르게 설정되지 않는 버그를 수정했습니다 (#3024).
  • RTSP 확장 프로그램:
    • 여러 RTP 패킷에 걸쳐 있는 동일한 액세스 단위의 샘플을 잘못 파싱하는 H.264 및 H.265 스트리밍의 회귀를 수정했습니다. 이로 인해 동영상에 시각적 아티팩트와 손상이 발생했습니다(#3121).
  • 디코더 확장 프로그램 (FFmpeg, VP9, AV1 등):
    • MPEG-H 디코더 확장 프로그램에 MPEG-H UI 관리자 지원을 추가합니다(#3066).
  • Cast 확장 프로그램:
    • Cast 재생의 트랙 선택 구현을 사용 설정하는 RemoteCastPlayer.Builder#setTrackSelector 메서드를 추가합니다.
  • 지원 중단된 기호 삭제:
    • 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).
  • 추출기:
    • MP3: LAME ReplayGain 데이터를 파싱합니다(#2840).
  • 오디오:
    • Automotive 시나리오에서 AC-4 디코더 지원을 평가할 때 AC4Profile22 및 기타 기존 프로필에 대한 지원을 올바르게 삭제합니다(#2609).
  • 동영상:
    • 콘텐츠 프레임 속도가 변경될 때 API 30 미만 기기에서 동영상 코덱을 삭제하여 끊김 현상을 방지합니다(#2941).
  • 텍스트:
    • VobSub: 단일 제어 시퀀스만 포함하거나 여러 제어 시퀀스에 걸쳐 중요한 정보가 분할된 SPU를 올바르게 처리하여 누락된 자막을 수정합니다(#2935).
  • IMA 확장 프로그램:
    • 버그 수정: 광고 MIME 유형이 IMA LOADED 이벤트에 제공된 MIME 유형과 일치하지 않는 문제가 해결되었습니다. 이제 광고 모음 색인과 광고 게재순위를 사용하여 광고 MIME 유형을 매핑합니다.
    • getAdsManager() 및 AdEvent.getAd()의 결과에 액세스하기 전에 null 확인을 추가합니다.
  • 세션:
    • 광고 재생 중에 중지가 발생한 경우 플랫폼 세션에 연결된 MediaController를 중지하면 앱이 비정상 종료되는 버그를 수정했습니다. (#2948)
    • 다른 프로세스에서 전송된 잘못된 형식의 Bundle 인스턴스로부터 보호하기 위해 다양한 클래스의 extras Bundle 인스턴스에 추가 인증을 추가합니다.
    • 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).
  • 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).
  • ExoPlayer:
    • 플레이어가 중단된 것으로 보이는 경우 StuckPlayerException 플레이어 오류를 트리거하는 중단된 플레이어 감지를 추가합니다. 이는 다음과 같은 경우에 발생하며, 필요한 경우 ExoPlayer.Builder에서 각 기본 제한 시간을 구성할 수 있습니다.
      • 재생을 시도하는 동안 10분 동안 STATE_BUFFERING가 표시되고 버퍼링이 진행되지 않습니다.
      • 재생을 시도하는 동안 STATE_READY가 10초 동안 지속되고 재생 진행률이 없는 경우
      • 선언된 기간을 초과하여 1분 동안 STATE_READY가 발생하고 항목의 끝에 도달하지 않은 경우
      • 재생을 시도하는 동안 재생 억제 이유가 있는 상태로 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.Builder setter를 추가하고 다양한 로컬 파일에서 잘 작동하도록 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-L2 MIME 유형 간의 모호성을 해소합니다(#2683).
    • MP4: 1MB보다 큰 stbl 상자가 파일이 단편화되지 않아야 함을 의미한다고 가정하여 매우 큰 파일의 스니핑 효율성을 개선합니다(#2650).
    • MP4: ©mvn (이동 이름) 및 ©mvi (이동 색인) 메타데이터 지원을 추가합니다. 이제 이러한 메타데이터는 각각 MVNM 및 MVIN ID를 사용하여 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 확장 프로그램:
    • 계층 구조가 아닌 data: URI 매니페스트를 사용하여 DASH 스트림을 재생할 때 발생하는 UnsupportedOperationException를 수정했습니다. (#2688)
    • 출시 시점과 사용자가 미디어 항목을 업데이트할 때 DashMediaSource의 MediaItem에서 제공하는 값으로 LiveConfiguration를 재설정합니다. (#2606)
    • 플레이어 오류로 보고되지 않은 잘못된 매니페스트 업데이트로 인한 비정상 종료를 방지합니다(#2805).
  • RTSP 확장 프로그램:
    • H264 및 H265의 단편화된 NAL 단위를 처리할 때 누락된 RTP 패킷 오류를 처리합니다(#2613).
  • 디코더 확장 프로그램 (FFmpeg, VP9, AV1 등):
    • AV1 확장 프로그램: AV1 소프트웨어 디코더가 이제 고성능 dav1d 라이브러리를 사용하여 이전 libgav1 구현을 대체하여 디코딩 속도를 개선합니다.
    • FFmpeg 확장 프로그램: STREAMINFO 블록이 올바르게 파싱되고 디코더에 전달되도록 하여 일부 FLAC 파일이 재생되지 않는 문제를 해결합니다(#2887).
  • 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의 지정된 위치에서 미리 로드하는 기능에 대한 지원을 추가합니다.
  • 변환기:
    • 동영상 인코딩 설정의 칩셋별 최적화를 사용 설정하는 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 플래그를 포함하는 실험용 ExoPlayer API를 추가합니다. 이 플래그는 디코더에 디코딩 전용 버퍼를 건너뛰도록 신호를 보내 더 빠른 탐색을 가능하게 합니다. 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로 가져오는 기능이 추가되었으며 인스턴스 기반 AutoCloseable API로 이전되었습니다. 새 Builder를 사용하여 MediaItem의 인스턴스를 만든 다음 retrieveTrackGroups(), retrieveTimeline(), retrieveDurationUs()를 호출하여 메타데이터의 ListenableFuture를 가져옵니다. 이전 정적 메서드는 이제 지원 중단되었습니다(#2462).
  • 이미지:
    • 매우 큰 이미지 (예: 50MP)를 표시하려고 할 때 PlayerView에서 Canvas: trying to draw too large bitmap.로 인해 앱이 비정상 종료되지 않도록 디코딩된 비트맵을 BitmapFactoryImageDecoder의 디스플레이 크기로 제한합니다.
    • Context 매개변수를 사용하도록 DefaultRenderersFactory.getImageDecoderFactory()의 서명을 변경합니다.
    • CompositionPlayer에서 사용되는 최대 비트맵 출력 크기를 Transformer에서 이미 사용된 크기와 일치시킵니다 (즉, ExoPlayer와 달리 CompositionPlayer는 비트맵을 디코딩할 때 디스플레이 크기를 고려하지 않음).
  • DRM:
    • HTTP 요청 헤더가 올바르게 적용될 수 있도록 MediaItem.DrmConfiguration를 허용하는 OfflineLicenseHelper.newWidevineInstance의 새 오버로드를 추가합니다(#2169).
  • 효과:
    • 입력 방향과 관계없이 가장 짧은 면이 항상 지정된 값과 일치하도록 하는 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 확장 프로그램:
    • 트릭 재생 적응 세트가 기본 적응 세트와 병합되어 잘못된 TrackGroup를 형성하는 문제를 수정했습니다. (#2148)
    • 새 기간을 초과하는 샘플이 렌더링 파이프라인에 의해 이미 읽힌 경우 DASH 기간을 단축하면 예외가 발생할 수 있는 버그를 수정했습니다(#2440).
    • CMCD 쿼리 매개변수를 사용할 때 리디렉션이 실행되지 않는 버그를 수정했습니다(#2475).
  • RTSP 확장 프로그램:
    • RFC 7798#4.4.2에 따라 H265용 RTP 집계 패킷 지원을 추가합니다 (#2413).
    • HTTP 302 응답을 처리할 때 제공된 위치 URI를 사용하도록 RtspClient를 수정했습니다(#2398).
    • 후행 공백 문자가 있는 줄이 포함된 SessionDescriptions에 파싱 지원을 추가합니다(#2357).
  • 디코더 확장 프로그램 (FFmpeg, VP9, AV1 등):
    • DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange가 오디오 디코더 확장 프로그램에 영향을 미치지 않는 버그를 수정했습니다(#2258).
  • Cast 확장 프로그램:
    • setVolume() 및 getVolume() 지원을 추가합니다(#2279).
    • 타임라인이 비어 있는 동안 CastPlayer가 STATE_BUFFERING으로 전환되지 않도록 합니다.
    • getDeviceVolume(), setDeviceVolume(), getDeviceMuted(), setDeviceMuted() 지원을 추가합니다. (#2089)
  • 테스트 유틸리티:
    • 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).
  • 오디오:
    • 짧은 콘텐츠의 재생목록을 재생할 때 위치가 멈출 수 있는 오프로드 문제를 수정했습니다(#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).
  • 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()를 사용합니다.
    • null MediaMetadata를 사용하여 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).
    • 탐색 속도를 높이기 위해 실험용 ExoPlayer AV1 샘플 종속 항목 파싱을 추가합니다. 새 DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies API로 사용 설정합니다.
    • 종속되지 않은 지연된 MediaCodecVideoRenderer 디코더 입력 버퍼를 삭제하는 실험용 ExoPlayer API를 추가합니다. 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).
  • 효과:
    • 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).
  • 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).
  • 데모 앱:
    • 추가 버튼으로 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).
  • 동영상:
    • onOutputFormatChanged를 처리할 때 제공된 경우 MediaCodecAdapter 제공 픽셀 가로세로 비율 값 사용의 롤백(#1371)
  • 텍스트:
    • timeUs에서 활성 상태인 큐 (이전에 시작되었지만 아직 종료되지 않음)가 잘못 삭제되는 ReplacingCuesResolver.discardCuesBeforeTimeUs의 버그를 수정했습니다 (#1939).
  • 메타데이터:
    • Vorbis 주석에서 디스크/트랙 번호 및 장르를 MediaMetadata로 추출합니다(#1958).

버전 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 콜백을 통해 전송되고 파싱 오류는 자동으로 무시됩니다 (기존 동작).
    • 실제 콘텐츠와 일치하지 않는 재생 시간의 다중 기간 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 (헤더 있음)와 '서버를 찾을 수 없음' (헤더 없음)을 구분할 수 있습니다.
  • 오디오:
    • 미디어에 있는 경우 코덱에서 CTA-2075 음량 메타데이터를 자동으로 구성합니다.
    • 탐색 시 볼륨이 부드럽게 줄어들도록 합니다.
    • 탐색 중에 발생할 수 있는 팝 사운드를 수정합니다.
    • Sonic의 시간 확장/피치 이동 알고리즘의 잘림 오류 누적을 수정합니다.
    • 출력 프레임이 누락되는 SpeedChangingAudioProcessor의 버그를 수정합니다.
  • 동영상:
    • MediaCodecVideoRenderer는 렌더링되지 않거나 다른 샘플에서 참조로 사용되지 않는 샘플을 디코딩하지 않습니다.
    • API 35 이상에서 MediaCodecAdapter는 이제 configure에서 null Surface를 수신하고 코덱이 이를 지원하는 경우 이전에 설정된 Surface를 삭제하기 위해 새 메서드 detachOutputSurface를 호출할 수 있습니다(MediaCodecInfo.detachedSurfaceSupported).
    • onOutputFormatChanged을 처리할 때 제공된 경우 MediaCodecAdapter 제공 픽셀 가로세로 비율 값을 사용합니다(#1371).
    • 60fps 보안 H264 스트림이 지원되지 않는 것으로 표시되는 Galaxy Tab S7 FE의 기기 문제에 대한 해결 방법을 추가합니다(#1619).
    • 스트림 끝 신호를 반환하지 않고 마지막 샘플 이후에 멈추는 코덱의 해결 방법을 추가합니다.
  • 텍스트:
    • 커스텀 VoiceSpan를 추가하고 WebVTT 음성 스팬에 채웁니다(#1632).
    • HLS에서 매우 큰 자막 타임스탬프 (마이크로초로 표시되고 90,000 MPEG 타임베이스를 곱할 때 64비트 long를 오버플로함)가 있는 WebVTT가 표시되는지 확인합니다(#1763).
    • Dolby Vision 콘텐츠에서 CEA-608 자막을 지원합니다(#1820).
    • CEA-608 자막이 사용 설정된 경우 DASH 다중 기간 스트림에서 재생이 중단되는 문제를 수정했습니다 (#1863).
  • 메타데이터:
    • icy 또는 vnd.dvb.ait 콘텐츠가 포함된 트랙에 C.TRACK_TYPE_METADATA 유형을 할당합니다.
  • 이미지:
    • Glide 또는 Coil과 같은 외부 이미지 로드 라이브러리와의 통합을 간소화하기 위해 ExternallyLoadedImageDecoder를 추가합니다.
  • 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).
    • 앱 정의 텍스트 트랙 선택 환경설정이 있는 경우 텍스트 선택의 '없음' 선택이 작동하지 않는 버그를 수정합니다.
  • DASH 확장 프로그램:
    • 세그먼트 중간에서 시작하는 기간에 대한 지원을 추가합니다(#1440).
  • Smooth Streaming 확장 프로그램:
    • 텍스트 트랙이 있는 SmoothStreaming 스트림을 재생할 때 발생하는 Bad magic number for Bundle 오류를 수정했습니다(#1779).
  • RTSP 확장 프로그램:
    • 인코딩된 @ 문자가 포함된 URL의 사용자 정보 삭제를 수정합니다(#1138).
    • 헤더 확장자가 있는 RTP 패킷을 파싱할 때 발생하는 비정상 종료를 수정합니다(#1225).
  • 디코더 확장 프로그램 (FFmpeg, VP9, AV1 등):
    • libiamf 네이티브 라이브러리를 사용하여 오디오를 합성하는 IAMF 트랙이 포함된 MP4 파일의 재생을 지원하는 IAMF 디코더 모듈을 추가합니다.
      • 재생은 스테레오 레이아웃과 공간화가 적용된 5.1로 사용 설정되며 선택적 헤드 트래킹이 사용 설정되지만 바이노럴 재생 지원은 현재 사용할 수 없습니다.
    • Android 15에서 디코더 확장 프로그램에 16KB 페이지 지원을 추가합니다(#1685).
  • Cast 확장 프로그램:
    • CastSession 연결이 끊긴 후 타임라인 정리를 중지합니다. 이렇게 하면 연결이 끊긴 후 발신자 앱이 로컬에서 재생을 재개할 수 있습니다.
    • Context가 제공되면 CastPlayer의 DeviceInfo를 채웁니다. 이렇게 하면 MediaSession를 RoutingSession에 연결할 수 있으며, 이는 출력 전환기를 통합하는 데 필요합니다(#1056).
  • 테스트 유틸리티:
    • 이제 DataSourceContractTest에 다음을 확인하는 테스트가 포함됩니다.
      • 입력 스트림 read position이 업데이트되었습니다.
      • 출력 버퍼 offset가 올바르게 적용됩니다.
  • 데모 앱
    • 데모 짧은 형식 앱의 메모리 누수를 해결합니다. (#1839)
  • 지원 중단된 기호 삭제:
    • I have removed the deprecated Player.hasPrevious and Player.hasPreviousWindow(). 대신 Player.hasPreviousMediaItem()를 사용하세요.
    • 지원 중단된 Player.previous() 메서드를 삭제합니다. 대신 Player.seekToPreviousMediaItem()를 사용합니다.
    • 지원 중단된 DrmSessionEventListener.onDrmSessionAcquired 메서드를 삭제합니다.
    • 지원 중단된 DefaultEncoderFactory 생성자를 삭제합니다. 대신 DefaultEncoderFactory.Builder를 사용합니다.

버전 1.5.0-rc02

2024년 11월 19일

1.5.0 안정화 버전을 사용하세요.

버전 1.5.0-rc01

2024년 11월 13일

1.5.0 안정화 버전을 사용하세요.

버전 1.5.0-beta01

2024년 10월 30일

1.5.0 안정화 버전을 사용하세요.

버전 1.5.0-alpha01

2024년 9월 10일

1.5.0 안정화 버전을 사용하세요.

버전 1.4.0

버전 1.4.1

2024년 8월 27일

androidx.media3:media3-*:1.4.1이 출시되었습니다. 버전 1.4.1에 포함된 커밋을 확인하세요.

  • ExoPlayer:
    • PreloadMediaSource에서 미리 로드 콜백을 비동기식으로 처리합니다(#1568).
    • 로드에 실패하면 버퍼링된 시간과 관계없이 재생을 허용합니다(#1571).
  • 추출기:
    • MP3: Info 프레임의 길이 필드를 기반으로 후행 비 MP3 데이터를 올바르게 무시하여 Searched too many bytes 오류를 수정합니다(#1480).
  • 텍스트:
    • TTML: 백분율 tts:fontSize 값이 백분율 값을 가진 상위 노드에서 올바르게 상속되도록 백분율 tts:fontSize 값 처리를 수정합니다.
    • 요청된 출력 시작 시간이 Subtitle의 최종 이벤트 시간보다 크거나 같은 경우를 잘못 처리하여 발생하는 LegacySubtitleUtil의 IndexOutOfBoundsException를 수정합니다(#1516).
  • DRM:
    • L1 Widevine 콘텐츠를 재생하는 API 31 이상 기기에서 android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE 오류를 수정했습니다. 이 오류는 프레임워크 MediaDrm.requiresSecureDecoder 메서드 (#1603)의 불완전한 구현으로 인해 발생합니다.
  • 효과:
    • GlObjectsProvider에 release() 메서드를 추가합니다.
  • 세션:
    • 문서에 설명된 대로 KEYCODE_HEADSETHOOK를 두 번 탭하는 동작을 '다음으로 탐색' 작업으로 변환합니다(#1493).
    • ForegroundServiceDidNotStartInTimeException를 방지하기 위해 무시할지 여부를 결정할 때 MediaButtonReceiver에서 KEYCODE_HEADSETHOOK를 '재생' 명령어로 처리합니다(#1581).
  • 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 인스턴스에 관한 앱 제공 맞춤 정보를 저장합니다.
  • 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).
  • 메타데이터:
    • MP4에서 ID3 정렬 태그로의 매핑을 수정합니다. 이전에는 '앨범 정렬'(soal), '아티스트 정렬' (soar), '앨범 아티스트 정렬' (soaa) MP4 태그가 TSO2, TSOA, TSOP ID3 태그에 잘못 매핑되었습니다(#1302).
    • 값이 1바이트를 초과하는 경우 MP4 (/iTunes) 숫자 gnre (장르) 및 tmpo (템포) 태그 읽기를 수정합니다.
    • ID3 TCON 프레임을 MediaMetadata.genre에 전파합니다(#1305).
  • 이미지:
    • 정사각형이 아닌 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:
    • ExoPlayer에 연결된 경우 PlayerView에 이미지 표시 지원을 추가합니다 (#1144).
    • 전역 재정의가 아닌 PlayerView 인스턴스별로 다양한 드로어블을 허용하도록 XML 속성을 통해 PlayerControlView의 다양한 아이콘 맞춤설정을 추가합니다(#1200).
    • API 34에서 Compose AndroidView 내에 SurfaceView를 사용할 때 동영상이 늘어나거나 잘리는 플랫폼 버그를 해결했습니다(#1237).
  • 다운로드:
    • 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).
  • DASH 확장 프로그램:
    • 여러 기간의 라이브 스트림을 다시 준비하면 IndexOutOfBoundsException이 발생하는 버그를 수정했습니다(#1329).
    • dashif:Laurl 라이선스 URL 지원을 추가합니다(#1345).
  • 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.FormatSupport IntDef 및 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:
    • PreloadMediaPeriod가 다시 미리 로드될 때 스트림을 유지할 수 없는 문제를 수정합니다.
    • 트랙 재선택 시 재생 기간에 올바른 해당 TrackSelectionResult를 적용합니다.
    • 미디어 항목 간에 전환할 때 재생 기간을 진행한 후에만 조기 사용 설정된 렌더러를 시작합니다(#1017).
    • DefaultVideoFrameProcessor.Factory.Builder.build()의 proguard -keepclasseswithmembers 규칙에 누락된 반환 유형을 추가합니다. (#1187)
  • 변환기:
    • API 30 이전에 음수 프레젠테이션 타임스탬프를 지원하지 않는 MediaMuxer로 인해 발생하는 예외의 해결 방법을 추가합니다.
  • 트랙 선택:
    • DefaultTrackSelector: 프레임 속도가 낮거나 설정되지 않은 동영상 트랙보다 '적절한' 프레임 속도(10fps 이상)의 동영상 트랙을 선호합니다. 이렇게 하면 플레이어가 모션 사진에서 추출된 MP4의 '실제' 동영상 트랙을 선택할 수 있습니다. 이 MP4에는 두 개의 HEVC 트랙이 포함될 수 있으며, 그중 하나는 해상도가 높지만 프레임 수가 매우 적습니다(#1051).
  • 추출기:
    • WAV 파일에서 홀수 크기의 청크를 읽을 때 패딩이 건너뛰어지지 않는 문제를 해결합니다 (#1117).
    • MP3: XING 및 VBRI와 같은 메타데이터 프레임에서 Format.averageBitrate를 채웁니다.
    • MPEG-TS: 스트림의 마지막 액세스 단위를 샘플 큐에 전달하여 마지막 프레임이 렌더링되도록 하는 변경사항을 되돌립니다(#7909). 이는 I-프레임 전용 HLS 스트림(#1150) 및 H.262 HLS 스트림 (#1126)에서 새로운 문제를 일으키는 변경사항 때문입니다.
  • 오디오:
    • 오디오 트랙이 오프로드 모드에서 초기화되지 않으면 오프로드를 사용 중지하여 렌더러 복구를 허용합니다.
  • 동영상:
    • Galaxy Tab S7 FE, Chromecast with Google TV, Lenovo M10 FHD Plus에서 60fps H265 스트림이 지원되지 않는 것으로 표시되는 기기 문제의 해결 방법을 추가합니다.
    • API에서 요구하는 대로 기기가 자동으로 이 작업을 실행하지 않더라도 터널링 중에 첫 번째 프레임이 항상 렌더링되도록 하는 해결 방법을 추가했습니다 (#1169). (#966)
    • HDR 색상 정보 처리로 인해 코덱이 오작동하고 SDR 동영상 트랙의 적응형 형식 전환이 방지되는 문제를 수정했습니다(#1158).
  • 텍스트:
    • WebVTT: 연속된 큐가 WebvttParser.parse에서 허위의 추가 CuesWithTiming 인스턴스를 만들지 못하도록 합니다(#1177).
  • DRM:
    • 일부 Android 14 기기에서 ResourceBusyException 또는 NotProvisionedException 대신 MediaDrm 프레임워크에서 발생할 수 있는 NoSuchMethodError를 해결합니다(#1145).
  • 효과:
    • 색상 공간을 변환하여 PQ에서 SDR로의 톤 매핑을 개선했습니다.
  • 세션:
    • 컨트롤러가 현재 항목을 대체할 때 현재 위치가 뒤로 이동하는 문제를 해결합니다(#951).
    • null이 아닌 extras만 있는 MediaMetadata가 미디어 컨트롤러와 세션 간에 전송되지 않는 문제를 수정했습니다. (#1176)
  • 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는 이제 기본적으로 null ImageOutput 및 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).
  • 오디오:
    • 부드러운 볼륨 램프로 무음 건너뛰기 알고리즘을 개선했습니다. 최소 무음 및 더 자연스러운 무음 지속 시간이 유지됩니다(#7423).
    • 건너뛴 무음 구간을 더 명확하게 보고합니다(#1035).
  • 동영상:
    • 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에 제공됩니다.
  • DRM:
    • 이후 암호화된 샘플의 키가 아직 준비되지 않은 경우에도 기본적으로 DRM 콘텐츠에서 'clear lead' 암호화되지 않은 샘플을 즉시 재생합니다. 이로 인해 재생 위치가 암호화된 샘플에 도달할 때 키가 아직 준비되지 않은 경우 재생 중간에 중단될 수 있습니다 (하지만 이전에는 이 시점에서 재생이 전혀 시작되지 않았음). 이 동작은 MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey 또는 DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys를 사용하여 사용 중지할 수 있습니다.
      • IMA 확장 프로그램:
    • 적절한 파일 확장자가 없는 DASH 및 HLS 광고를 재생할 수 없는 문제가 해결되었습니다.
  • 세션:
    • TV 앱의 더블클릭 감지를 사용 중지합니다(#962).
    • null이 아닌 추가 항목만 있는 MediaItem.RequestMetadata가 미디어 컨트롤러와 세션 간에 전송되지 않는 문제가 해결되었습니다.
    • MediaLibraryService 대신 Context만 사용하는 생성자를 MediaLibrarySession.Builder에 추가합니다.
  • HLS 확장 프로그램:
    • HlsMediaPeriod를 package-private 공개 상태로 줄입니다. 이 유형은 HLS 패키지 외부에서 직접 종속되어서는 안 됩니다.
    • 세그먼트 시작 부분으로의 탐색을 더 효율적으로 해결합니다(#1031).
  • 디코더 확장 프로그램 (FFmpeg, VP9, AV1, MIDI 등):
    • MIDI 디코더: SysEx 이벤트 메시지를 무시합니다. (#710)
  • 테스트 유틸리티:
    • TestPlayerRunHelper.playUntilPosition에서 재생을 일시중지하지 않습니다. 테스트는 재생을 재생 상태로 유지하지만 테스트에서 어설션과 추가 작업을 추가할 수 있을 때까지 진행을 정지합니다.
  • 데모 앱:
    • 짧은 형식 콘텐츠 사용 사례를 통해 PreloadMediaSource 사용을 보여주는 짧은 형식 데모 모듈을 추가합니다.

버전 1.3.0-rc01

2024년 2월 22일

1.3.0 안정화 버전을 사용하세요.

버전 1.3.0-beta01

2024년 2월 7일

1.3.0 안정화 버전을 사용하세요.

버전 1.3.0-alpha01

2024년 1월 15일

1.3.0 안정화 버전을 사용하세요.

버전 1.2.0

버전 1.2.1

2024년 1월 9일

  • ExoPlayer:
    • LiveConfiguration.min/maxOffset 범위를 벗어난 수동 탐색으로 인해 오프셋이 min/maxOffset로 다시 조정되는 문제가 해결되었습니다.
    • 3, 5, 6, 7, 8 채널의 OPUS 및 VORBIS 채널 레이아웃이 잘못된 문제를 수정합니다(#8396).
    • 라이브 스트림에서 0으로 이동한 후 트랙을 선택하면 스트림이 기본 위치에서 잘못 시작되는 문제를 수정합니다. (#9347)
    • CmcdData.Factory의 새 인스턴스가 청크 소스에서 bufferedDurationUs에 음수 값을 수신하여 IllegalArgumentException가 발생하는 문제를 수정했습니다. (#888)
  • 변환기:
    • 높은 작동 속도 설정으로 인해 구성 시 인코더가 발생하는 문제를 해결합니다.
  • 추출기:
    • JPEG 모션 사진의 보조 (재생 불가) HEVC 트랙을 ROLE_FLAG_ALTERNATE로 표시하여 해상도가 높기 때문에 재생을 위해 자동으로 선택되지 않도록 합니다.
    • TS H264 스트림의 잘못된 키프레임 감지를 수정합니다(#864).
    • 47,721초보다 긴 TS 스트림의 재생 시간 추정을 수정합니다(#855).
  • 오디오:
    • 여러 번 호출될 때 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 문제를 수정합니다. 이 오류는 보안 디코더를 잘못 사용하여 일반 콘텐츠를 재생했기 때문에 발생했습니다.
  • 세션:
    • 커스텀 키와 값을 MediaMetadataCompat에서 MediaMetadata.extras로, MediaMetadata.extras에서 MediaMetadataCompat로 배치합니다(#756, #802).
    • 기존 컨트롤러의 notifyChildrenChanged 브로드캐스트를 수정합니다. (#644)
    • 사용 중지된 알림의 setWhen 타이머에 음수 시간을 설정하면 일부 기기에서 비정상 종료가 발생하는 버그를 수정했습니다(#903).
    • 첫 번째 알림 업데이트가 요청될 때 미디어 알림 컨트롤러가 연결을 완료하지 않은 경우 IllegalStateException를 수정했습니다 (#917).
  • UI:
    • BottomSheetDialogFragment에서 Material Design과 함께 사용할 때 앞으로 감기 및 되감기 버튼이 표시되지 않는 문제를 수정합니다. (#511)
    • PlayerControlView의 빨리 감기 버튼에 있는 숫자가 잘못 정렬되는 문제를 수정합니다(#547).
  • DASH 확장 프로그램:
    • DASH 매니페스트에서 Dolby의 채널 수 5로 'f800'을 파싱합니다(#688).
  • 디코더 확장 프로그램 (FFmpeg, VP9, AV1, MIDI 등):
    • MIDI: 앞으로 탐색하면 프로그램 변경 이벤트가 건너뛰어지는 문제를 수정했습니다(#704).
    • FFmpeg 6.0으로 이전하고 지원되는 NDK를 r26b으로 업데이트합니다(#707, #867).
  • 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)
  • 동영상:
    • MediaCodecVideoRenderer가 커스텀 VideoFrameProcessor.Factory를 사용하도록 허용합니다.
    • 오디오 스트림이 음수 타임스탬프로 시작하는 경우 첫 번째 프레임을 렌더링할 수 없는 버그를 수정했습니다(#291).
  • 텍스트:
    • ExoplayerCuesDecoder가 삭제됩니다. sampleMimeType = application/x-media3-cues가 있는 텍스트 트랙은 이제 SubtitleDecoder 인스턴스 없이 TextRenderer에서 직접 처리됩니다.
  • 메타데이터:
    • 어차피 구현에서 null을 반환해야 하므로 '디코딩 전용' 샘플에 대해 MetadataDecoder.decode가 더 이상 호출되지 않습니다.
  • 효과:
    • 타임스탬프별로 비트맵 입력을 큐에 추가하는 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).
  • HLS 확장 프로그램:
    • 마지막 로드 완료 시간이 아닌 마지막 로드 시작 시간에서 계산된 간격으로 HLS 실시간 재생목록을 새로고침합니다(#663).
  • DASH 확장 프로그램:
    • 세그먼트 템플릿 URL에서 동일한 DASH 식별자를 여러 개 허용합니다.
    • 추출 중에 자막을 파싱하는 실험용 지원을 추가합니다. 이렇게 하면 자막 세그먼트 간 전환 시 깜박임 해결을 포함하여 겹치는 자막을 병합하는 기능이 더 효과적으로 지원됩니다. DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()를 사용하여 사용 설정할 수 있습니다(#288).
  • RTSP 확장 프로그램:
    • TCP로 대체할 때 IndexOutOfBoundsException이 발생하거나 일부 상황에서 재생이 중단될 수 있는 경합 상태를 수정합니다.
    • RtspMediaPeriod의 로드 상태를 반환할 때 RTSP 설정에서 상태를 확인합니다(#577).
    • Options 응답 공개 헤더에서 맞춤 Rtsp 요청 메서드를 무시합니다(#613).
    • 연결 유지 RTSP 옵션 요청을 전송하는 시간 간격에 RTSP 설정 응답 제한 시간 값을 사용합니다(#662).
  • 디코더 확장 프로그램 (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)
  • 테스트 유틸리티:
    • 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).

버전 1.1.0

2023년 7월 5일

  • 공통 라이브러리:
    • 부적합한 오디오 경로에 대한 억제 이유를 추가하고 준비되면 재생합니다. 너무 오랫동안 억제된 이유를 변경합니다. (#15)
    • Player에 명령어를 추가합니다.
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_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()를 재정의하여 커스텀 키 로깅을 사용 설정합니다.
    • 기본 데모의 매니페스트에 추가 작업을 추가하여 맞춤 *.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) 간의 일관되지 않은 동작을 수정합니다.
  • 변환기:
    • 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가 새 트랙 선택을 트리거합니다.
  • 추출기:
    • Ogg: 재생 시간이 긴 파일에서 탐색할 때 발생하는 버그를 수정했습니다. (#391)
    • FMP4: TimestampAdjuster가 emsg atom의 메타데이터 샘플 시간으로 잘못된 타임스탬프 오프셋을 초기화하는 문제를 수정했습니다(#356).
  • 오디오:
    • 터널링이 사용 설정되고 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)
  • 멀티플렉서:
    • 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 확장 프로그램:
    • MPEG4-LATM의 경우 Describe Response SDP 메시지에 없는 경우 기본 profile-level-id 값을 사용합니다(#302).
    • DESCRIBE 응답 헤더에 있는 경우 RTSP 세션에서 상대 경로 확인을 위해 기본 URI를 사용합니다(#11160).
  • DASH 확장 프로그램:
    • 여러 기간 DASH 스트림의 MediaLoadData.startTimeMs 및 MediaLoadData.endTimeMs에서 미디어 시간 오프셋을 삭제합니다.
    • 여러 기간의 실시간 DASH 미디어 소스를 다시 준비하면 IndexOutOfBoundsException이 발생하는 버그를 수정했습니다. (#10838)
  • 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 출시에 해당합니다.

  • 핵심 라이브러리:
    • API 33에서 네트워크 유형 감지를 수정합니다(#10970).
    • ExoPlayer.isTunnelingEnabled를 호출할 때 NullPointerException를 수정합니다(#10977).
  • 다운로드:
    • 병합할 두 세그먼트의 시작 시간의 최대 차이를 SegmentDownloader 및 서브클래스에서 구성할 수 있도록 합니다(#248).
  • 오디오:
    • 삼성 기기에서 끊김 없는 MP3 재생이 중단되는 문제를 수정했습니다. (#8594)
    • 오디오를 사용 중지한 직후에 설정된 재생 속도가 이전 속도 변경으로 재정의될 수 있는 버그를 수정했습니다(#10882).
  • 동영상:
    • HEVC HDR10 형식을 HEVCProfileMain10 대신 HEVCProfileMain10HDR10에 매핑합니다.
    • Chromecast with Google TV 및 Lenovo M10 FHD Plus에서 60fps AVC 스트림이 지원되지 않는 것으로 표시되는 기기 문제의 해결 방법을 추가합니다(#10898).
    • 화면 재생 빈도보다 훨씬 높은 프레임 속도로 미디어를 재생할 때 프레임 해제 성능 문제를 수정합니다.
  • 전송:
    • 미디어 항목 간에 전환할 때 일시적인 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)
  • 오디오:
    • 압축된 오디오 형식 비트 전송률을 사용하여 직접 재생(패스 스루)에서 AudioTrack의 최소 버퍼 크기를 계산합니다.
  • 텍스트:
    • 자막 파일에 신호가 없는 경우 Subtitle.getEventTime에 잘못된(음수) 색인을 전달하는 TextRenderer를 수정합니다.
    • SubRip: 바이트 순서 표시로 시작되는 경우 UTF-16 파일의 지원을 추가합니다.
  • 메타데이터:
    • ID3 v2.4에서 허용하는 대로 ID3 프레임에서 여러 개의 null로 구분된 값을 파싱합니다.
    • MediaMetadata.mediaType을 추가하여 메타데이터에 설명된 콘텐츠 유형 또는 폴더 유형을 표시합니다.
    • MediaMetadata.folderType 대신 MediaMetadata.isBrowsable을 추가합니다. 폴더 유형은 다음 출시에서 지원 중단됩니다.
  • DASH:
    • 타일 수를 포함하여 이미지 적응 세트에 관한 전체 파싱을 추가합니다. (#3752)
  • UI:
    • 등록된 리스너에 공개 상태 변경사항이 전달되도록 지원 중단된 PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener)를 수정합니다. (#229)
    • 오른쪽에서 왼쪽(RTL) 레이아웃을 사용할 때 PlayerView에서 가운데 플레이어 컨트롤의 순서를 수정합니다. (#227)
  • 세션:
    • 맞춤 플레이어용 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)
  • 다운로드:
    • 동일한 PriorityTaskManager를 사용한 동시 다운로드 및 재생으로 인해 ProgressiveDownloader에서 발생할 수 있는 무한 루프를 수정했습니다. (#10570)
    • 다운로드 알림이 즉시 표시되도록 합니다. (#183)
    • 과도한 스레드 생성을 방지하기 위해 동시 다운로드 삭제를 1개로 제한합니다. (#10458)
  • 동영상:
    • 디스플레이에서 지원하지 않는 경우 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)
  • 메타데이터:
    • 이제 메타데이터를 사용할 수 있을 때 이를 즉시 렌더링하도록 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:
    • H263 분할 패킷 처리를 추가합니다. (#119)
    • MP4A-LATM 지원을 추가합니다. (#162)
  • IMA:
    • IMA SDK가 광고 로드 중에 멈추는 경우를 처리하기 위해 광고 정보 로드 제한 시간을 추가합니다. (#10510)
    • 콘텐츠의 끝을 탐색할 때 미드롤 광고를 건너뛰지 않도록 방지합니다. (#10685)
    • 서버 측에 삽입된 광고를 사용한 실시간 스트림의 기간을 올바르게 계산합니다(예: IMA DAI). (#10764)
  • 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)
  • 추출기:
    • H265 단기 참조 사진 세트의 파싱을 수정합니다. (#10316)
    • esds 상자의 비트 전송률 파싱을 수정합니다. (#10381)
  • DASH:
    • 매니페스트에서 ClearKey 라이선스 URL을 파싱합니다. (#10246)
  • UI:
    • TalkBack에서 재생 컨트롤 메뉴의 현재 활성 속도 옵션을 알려줍니다. (#10298)
  • RTSP:
    • VP8 분할 패킷 처리를 추가합니다. (#110)
  • Leanback 확장 프로그램:
    • LeanbackAdapter의 playWhenReady 변경사항을 리슨합니다. (10420)
  • 전송:
    • CastTimeline에서 Window.mediaItem으로 재생목록 메서드에 전달된 MediaItem을 사용합니다. (#25, #8212)
    • CastPlayer로 Player.getMetadata() 및 Listener.onMediaMetadataChanged()를 지원합니다. (#25)

버전 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 속성의 변경을 모니터링하고 이러한 변경이 있는 경우 새 트랙 선택을 트리거합니다. television UI 모드를 사용하는 기기는 이러한 제약 조건에서 제외되며 채널 수가 가장 많은 형식이 선호됩니다. 이 기능을 사용 설정하려면 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를 삭제합니다.
  • 추출기:
    • AVI 지원을 추가합니다. (#2092)
    • Matroska: Opus 트랙의 DiscardPadding을 파싱합니다.
    • MP4: esds 상자에서 비트 전송률을 파싱합니다.
    • Ogg: 중복된 Opus ID 및 주석 헤더를 허용합니다. (#10038)
  • 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 인스턴스를 명시적으로 전달할 수 있습니다.
  • 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)
  • 지원 중단된 기호 삭제:
    • Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)를 삭제합니다. 대신 Player.Listener.onTracksChanged(Tracks)를 사용합니다.
    • Player.getCurrentTrackGroups 및 Player.getCurrentTrackSelections를 삭제합니다. 대신 Player.getCurrentTracks를 사용합니다. ExoPlayer.getCurrentTrackGroups 및 ExoPlayer.getCurrentTrackSelections를 계속 사용할 수도 있지만 이러한 메서드는 지원 중단된 상태입니다.
    • DownloadHelper DEFAULT_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를 명시적으로 전달할 것을 요구하도록 AudioCapabilities API를 변경합니다.
    • AudioTrackBufferSizeProvider를 DefaultAudioSink에 삽입하여 AudioTrack 버퍼 사이즈 계산의 맞춤설정을 허용합니다. (#8891)
    • 요청된 버퍼 사이즈가 1MB를 초과하는 경우 AudioTrack 생성을 다시 시도합니다. (#9712)
  • 추출기:
    • WAV: RF64 스트림 지원을 추가합니다. (#9543)
    • H.265 SPS NAL 단위의 잘못된 파싱을 수정합니다. (#9719)
    • Ogg Opus 및 Ogg Vorbis 파일의 Vorbis 주석(METADATA_BLOCK_PICTURE 포함)을 파싱합니다.
  • 텍스트:
    • 구성에서 생성된 자막 트랙의 Format.id 필드에 전파되는 MediaItem.SubtitleConfiguration.id 필드를 추가합니다. (#9673)
    • Matroska 컨테이너에 WebVTT 자막에 관한 기본 지원을 추가합니다. (#9886)
    • Cea708Decoder가 선언된 크기의 서비스 블록 이상은 읽지 못하도록 금지합니다.
  • DRM:
    • DrmSessionManager.(pre)acquireSession에서 playbackLooper를 삭제합니다. 맞춤 MediaSource에서 앱이 DrmSessionManager를 사용하는 경우 대신 playbackLooper를 DrmSessionManager.setPlayer에 전달해야 합니다.
  • 광고 재생/IMA:
    • IMA 동적 광고 삽입 (DAI) 지원을 추가합니다(#8213).
    • 광고그룹을 재설정하여 다시 재생할 수 있도록 AdPlaybackState에 메서드를 추가합니다. (#9615)
    • 광고 재생 중에는 재생 속도를 1.0으로 적용합니다. (#9018)
    • 로드되지 않은 광고그룹으로 인해 재생이 즉시 재설정되는 문제를 해결합니다. (#9929)
  • UI:
    • 특정 테마를 사용할 때 StyledPlayerView 되감기 및 빨리 감기 버튼의 숫자 색상을 수정합니다. (#9765)
    • 재생 속도 문자열을 올바르게 변환합니다. (#9811)
  • DASH:
    • 파싱된 필수 속성과 보조 속성을 Representation에 추가합니다. (#9579)
    • forced-subtitle 트랙 역할을 지원합니다. (#9727)
    • main 트랙 역할을 C.SELECTION_FLAG_DEFAULT로 해석하는 것을 중지합니다.
    • DVB 네임스페이스를 선언하지 않는 매니페스트의 기준 URL 제외 로직을 수정합니다. (#9856)
    • 상대 MPD.Location URL을 지원합니다. (#9939)
  • HLS:
    • 오디오 전용 HLS 스트림의 Format.label을 올바르게 채웁니다. (#9608)
    • 기본적으로 청크 없는 준비를 사용하여 시작 시간을 개선합니다. 마스터 재생목록에 선언되지 않은 다중 자막 트랙이 렌더링 결과에 포함된 경우 해당 트랙을 마스터 재생목록에 추가해야 재생에 사용할 수 있습니다. 또는 HlsMediaSource.Factory.setAllowChunklessPreparation(false)를 사용하여 청크 없는 준비를 사용 중지해야 합니다.
    • HLS에서 키 프레임의 정확한 탐색을 지원합니다. (#2882)
  • RTSP:
    • 서버 연결에 사용되는 SocketFactory를 재정의하는 클라이언트 API를 제공합니다. (#9606)
    • 둘 다 존재하는 경우 BASIC보다 DIGEST 인증 방법을 우선 적용합니다. (#9800)
    • RTSP 트랙 타이밍을 사용할 수 없는 경우를 처리합니다. (#9775)
    • 잘못된 RTP-Info 헤더 값을 무시합니다. (#9619)
  • 변환기:
    • 필요한 최소 API 버전을 21로 높입니다.
    • 이제 변환 중에 발생하는 오류를 설명하는 데 TransformationException이 사용됩니다.
    • 변환 옵션을 지정하기 위한 TransformationRequest를 추가합니다.
    • 여러 리스너를 등록할 수 있도록 허용합니다.
    • 코덱 출력을 부분적으로 읽었을 때 변환기가 멈추는 문제를 수정합니다.
    • Muxer가 해제될 때 Transformer.getProgress의 잠재적 NPE를 수정합니다.
    • 변환 적용을 위한 데모 앱을 추가합니다.
  • MediaSession 확장 프로그램:
    • 기본적으로 이제 MediaSessionConnector는 중지 시 재생목록을 지웁니다. 재생목록을 보관하려는 앱은 커넥터에서 setClearMediaItemsOnStop(false)를 호출할 수 있습니다.
  • Cast 확장 프로그램:
    • CastPlayer가 onIsPlayingChanged를 올바르게 호출하지 못하게 하는 버그를 수정합니다. (#9792).
    • DefaultMediaItemConverter를 사용하는 아트워크가 포함된 오디오 메타데이터를 지원합니다. (#9663)
  • 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 모듈로 대체됩니다. 따라서 어댑터/커넥터 클래스를 사용하지 않고도 플레이어와 미디어 세션을 직접 통합할 수 있습니다.