Media3

미디어 사용 사례를 위한 지원 라이브러리입니다.
최근 업데이트 안정화 버전 출시 후보 버전 베타 버전 알파 버전
2024년 11월 27일 1.5.0 - - -

종속 항목 선언

Media3의 종속 항목을 추가하려면 프로젝트에 Google Maven 저장소를 추가해야 합니다. 자세한 내용은 Google Maven 저장소를 읽어보세요.

다음과 같이 앱 또는 모듈의 build.gradle 파일에 필요한 아티팩트의 종속 항목을 추가합니다.

Groovy

dependencies {
    def media3_version = "1.4.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
    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 integrating with Cast
    implementation "androidx.media3:media3-cast:$media3_version"

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version"

    // For transforming media files
    implementation "androidx.media3:media3-transformer:$media3_version"

    // For applying effects on video frames
    implementation "androidx.media3:media3-effect:$media3_version"

    // For muxing media files
    implementation "androidx.media3:media3-muxer:$media3_version"

    // Utilities for testing media components (including ExoPlayer components)
    implementation "androidx.media3:media3-test-utils:$media3_version"
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation "androidx.media3:media3-test-utils-robolectric:$media3_version"

    // Common functionality for reading and writing media containers
    implementation "androidx.media3:media3-container:$media3_version"
    // Common functionality for media database components
    implementation "androidx.media3:media3-database:$media3_version"
    // Common functionality for media decoders
    implementation "androidx.media3:media3-decoder:$media3_version"
    // Common functionality for loading data
    implementation "androidx.media3:media3-datasource:$media3_version"
    // Common functionality used across multiple media libraries
    implementation "androidx.media3:media3-common:$media3_version"
    // Common Kotlin-specific functionality
    implementation "androidx.media3:media3-common-ktx:$media3_version"
}

Kotlin

dependencies {
    val media3_version = "1.4.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
    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 integrating with Cast
    implementation("androidx.media3:media3-cast:$media3_version")

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version")

    // For transforming media files
    implementation("androidx.media3:media3-transformer:$media3_version")

    // For applying effects on video frames
    implementation("androidx.media3:media3-effect:$media3_version")

    // For muxing media files
    implementation("androidx.media3:media3-muxer:$media3_version")

    // Utilities for testing media components (including ExoPlayer components)
    implementation("androidx.media3:media3-test-utils:$media3_version")
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation("androidx.media3:media3-test-utils-robolectric:$media3_version")

    // Common functionality for reading and writing media containers
    implementation("androidx.media3:media3-container:$media3_version")
    // Common functionality for media database components
    implementation("androidx.media3:media3-database:$media3_version")
    // Common functionality for media decoders
    implementation("androidx.media3:media3-decoder:$media3_version")
    // Common functionality for loading data
    implementation("androidx.media3:media3-datasource:$media3_version")
    // Common functionality used across multiple media libraries
    implementation("androidx.media3:media3-common:$media3_version")
    // Common Kotlin-specific functionality
    implementation("androidx.media3:media3-common-ktx:$media3_version")
}

종속 항목에 관한 자세한 내용은 빌드 종속 항목 추가를 참고하세요.

의견

제출하신 의견은 Jetpack을 개선하는 데 도움이 됩니다. Media3 Issue Tracker를 사용하여 질문, 알려진 문제, 기능 요청에 대한 답변을 찾고 새 문제를 제출할 수 있습니다.

버전 1.5

버전 1.5.0

2024년 11월 27일

androidx.media3:media3-*:1.5.0이 출시되었습니다. 버전 1.5.0에는 이 커밋이 포함되어 있습니다.

  • 공통 라이브러리:
    • 전체 일관성과 리스너 처리를 보장하면서 약간의 조정으로 다른 플레이어로 전달할 수 있는 ForwardingSimpleBasePlayer를 추가합니다. (#1183)
    • SimpleBasePlayer.State.playlistgetPlaylist() 메서드로 바꿉니다.
    • 재생목록 구조를 빌드하는 대신 Timeline 및 현재 TracksMetadata를 직접 지정하도록 SimpleBasePlayer.State.Builder.setPlaylist()의 재정의를 추가합니다.
    • minSdk를 21 (Android Lollipop)로 늘립니다. 이는 다른 모든 AndroidX 라이브러리와 일치합니다.
    • 공통 라이브러리를 기반으로 빌드된 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()를 사용하여 이 기능을 사용 설정합니다.
    • 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가 비동기 모드로 작동할 때 MediaCodec.CryptoException가 '예기치 않은 런타임 오류'로 보고되는 경우가 있는 문제를 수정했습니다 (API 31 이상에서 기본 동작).
    • PreloadMediaSource.PreloadControl.onContinueLoadingRequested()와 함께 bufferedPositionUs 대신 bufferedDurationUs를 전달합니다. 또한 DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MSDefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS로 변경합니다. 그러면 앱은 기본 시작 위치에서 특정 시간을 나타내는 값을 전달해야 하며, 이 경우 해당 미디어 소스는 이 IntDef로 미리 로드되어야 합니다.
    • 모든 메서드 호출을 다른 렌더러로 전달하는 ForwardingRenderer 구현을 추가했습니다. (1703)
    • 재생목록의 다음 항목에 재생목록 미리 로드를 추가합니다. 앱은 적절하게 ExoPlayer.setPreloadConfiguration(PreloadConfiguration)를 호출하여 미리 로드를 사용 설정할 수 있습니다. 기본적으로 미리 로드는 사용 중지되어 있습니다. 재생을 방해하지 않도록 선택한 경우 DefaultLoadControl는 플레이어가 재생을 위해 로드되지 않을 때만 미리 로드가 시작되고 계속되도록 제한합니다. 앱은 LoadControl.shouldContinuePreloading()를 적절하게 구현하여 이 동작을 변경할 수 있습니다 (예: DefaultLoadControl에서 이 메서드를 재정의하는 경우). LoadControl의 기본 구현은 앱이 LoadControl의 맞춤 구현을 사용하는 경우 미리 로드를 사용 중지합니다.
    • 서브클래스 리스너의 이벤트 호출을 허용하는 MediaSourceEventListener.EventDispatcher.dispatchEvent() 메서드를 추가합니다. (1736)
    • 일관되게 공유된 구성으로 DefaultPreloadManagerExoPlayer 인스턴스를 빌드하는 DefaultPreloadManager.Builder를 추가합니다.
    • DefaultLoadControl 구현이 ExoTrackSelection[]에서 스트림 유형을 가져올 수 있으므로 LoadControl.onTracksSelected()에서 Renderer[] 매개변수를 삭제합니다.
    • 재정의를 방지하기 위해 DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])를 지원 중단하고 메서드를 final로 표시했습니다. 대신 새 DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])를 사용해야 합니다.
    • MergingMediaSource에서 보조 소스의 MediaSourceEventListener 이벤트를 보고합니다. 이렇게 하면 사이드로드된 자막 (MediaItem.LocalConfiguration.subtitleConfigurations로 추가된 자막)에 로드 시작/오류/취소됨/완료됨 이벤트가 보고되며, 이는 AnalyticsListener에서 내보낸 중복 로드 이벤트로 표시될 수 있습니다.
    • 자막 및 메타데이터 오류로 인해 재생이 완전히 중지되지 않도록 합니다. 대신 문제가 있는 트랙이 사용 중지되고 나머지 트랙의 재생이 계속됩니다. (#1722)
      • 새 자막 처리 (추출 중)에서 연결된 파싱 (예: 잘못된 자막 데이터) 및 로드 오류 (예: HTTP 404)가 onLoadError 콜백을 통해 내보내집니다.
      • 기존 자막 처리 (렌더링 중)에서는 연결된 로드 오류만 onLoadError 콜백을 통해 내보내고 파싱 오류는 자동으로 무시됩니다 (기존 동작).
    • 실제 콘텐츠와 일치하지 않는 길이의 다중 기간 DASH 스트림의 재생목록 항목 또는 기간으로 인해 항목 끝에서 프레임이 멈출 수 있는 버그를 수정했습니다. (#1698)
    • 마지막 업데이트 이후 경과한 최대 시간을 설정하여 클라이언트가 다시 초기화되는 SntpClient에 setter를 추가합니다. (#1794)
  • 변환기:
    • Surface를 통해 Transformer에 동영상 데이터를 큐에 추가하는 SurfaceAssetLoader를 추가합니다.
    • ImageAssetLoaderIllegalStateException을 발생시키는 대신 AssetLoader.onError를 통해 지원되지 않는 입력을 보고합니다.
    • 이미지 내보내기에 MediaItem.Builder.setImageDurationMs를 사용하여 이미지 길이를 설정하는 것이 필수로 되도록 합니다.
    • 오디오 EditedMediaItem 시퀀스의 간격에 대한 내보내기 지원을 추가합니다.
  • 트랙 선택:
    • DefaultTrackSelector: 다른 요소가 동일한 경우 채널 기반 오디오보다 객체 기반 오디오를 선호합니다.
  • 추출기:
    • Mp4ExtractorFragmentedMp4Extractor가 후속 샘플에서 참조로 사용되지 않는 H264 샘플을 식별하도록 허용합니다.
    • AmrExtractor에서 색인 기반 탐색을 사용 설정하는 옵션을 추가합니다.
    • 유효 프레임 간에 128KB를 초과하는 MP3 파일은 잘린 것으로 처리합니다(잘못된 파일로 처리하지 않음). 즉, MP3 바이트 길이를 나타내는 다른 메타데이터가 없고 끝에 MP3가 아닌 데이터가 있는 파일은 이제 ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} 오류가 발생하는 대신 MP3 데이터 끝에서 재생을 중지합니다 (#1563).
    • MP4 파일에서 수정 목록을 처리할 때 키프레임이 아닌 미디어 시작 위치의 프리롤 샘플 처리를 수정합니다. (#1659)
    • Mp4ExtractorFragmentedMp4Extractormdhd 상자에서 미디어 길이를 사용하여 프레임 속도 계산을 개선했습니다. (#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 이상에서는 MediaCodecAdapterconfigure에서 null Surface를 수신할 수 있으며, 코덱이 이를 지원하는 경우(MediaCodecInfo.detachedSurfaceSupported) 새 메서드 detachOutputSurface를 호출하여 이전에 설정된 Surface를 삭제합니다.
    • onOutputFormatChanged을 처리할 때 제공된 경우 MediaCodecAdapter에서 제공된 픽셀 가로세로 비율 값을 사용합니다(#1371).
    • 60fps 보안 H264 스트림이 지원되지 않는 것으로 표시되는 Galaxy Tab S7 FE의 기기 문제에 대한 해결 방법을 추가했습니다. (#1619)
    • 스트림 종료 신호를 반환하지 않고 마지막 샘플 후에 중단되는 코덱을 위한 해결 방법을 추가합니다.
  • 텍스트:
    • 맞춤 VoiceSpan를 추가하고 WebVTT 음성 스팬에 채웁니다(#1632).
    • 매우 큰 자막 타임스탬프 (마이크로초로 표현하고 90,000 MPEG 타임베이스로 곱하면 64비트 long가 오버플로됨)가 있는 HLS의 WebVTT가 표시되도록 합니다(#1763).
    • Dolby Vision 콘텐츠에서 CEA-608 자막을 지원합니다. (#1820)
    • CEA-608 자막이 사용 설정된 경우 DASH 다중 기간 스트림에서 재생이 중단되는 문제를 수정했습니다. (#1863)
  • 메타데이터:
    • icy 또는 vnd.dvb.ait 콘텐츠가 포함된 트랙에 C.TRACK_TYPE_METADATA 유형을 할당합니다.
  • 이미지:
    • Glide 또는 Coil과 같은 외부 이미지 로드 라이브러리와의 통합을 간소화하기 위해 ExternallyLoadedImageDecoder를 추가합니다.
  • DataSource:
    • FileDescriptor에서 읽는 데 사용할 수 있는 새로운 DataSourceFileDescriptorDataSource를 추가합니다. (#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)
    • 미디어 항목의 명령어 버튼을 추가합니다. 이렇게 하면 MediaBrowserCompat가 있는 기존 라이브러리에 Custom browse actions라고 알려진 Media3 API가 추가됩니다. Media3 명령어를 사용하면 미디어 항목의 버튼을 MediaBrowserMediaController 모두에서 사용할 수 있습니다. AAOS의 맞춤 탐색 작업을 참고하세요.
    • Media3 컨트롤러가 play()를 요청한 후 세션 앱이 포그라운드 서비스를 시작하지 못하는 버그가 수정되었습니다.
    • CommandButton.Builder.setIconUri를 콘텐츠 URI만 허용하도록 제한합니다.
    • 기존 MediaBrowserCompat에 연결할 때 Media3 브라우저의 연결 힌트를 초기 MediaBrowserCompat에 전달합니다. 서비스는 onGetRoot()를 처음 호출할 때 루트 힌트로 전달된 연결 힌트를 수신할 수 있습니다.
    • 기존 브라우저 서비스에 연결된 MediaBrowser가 브라우저가 parentid를 구독한 후 서비스에서 전송한 오류를 수신하지 않는 버그를 수정했습니다.
    • 상위 요소를 구독할 때 기존 MediaBrowserService에 연결된 Media3 브라우저가 parentId의 하위 요소를 두 번 요청하지 않도록 상호 운용성 동작을 개선합니다.
  • UI:
    • XML 기반 공유 전환 문제로 인해 PlayerView-in-Compose-AndroidView 해결 방법에서 늘어나거나 자른 동영상을 선택하도록 합니다. AndroidView 내에서 PlayerView를 사용하는 앱은 선택하려면 PlayerView.setEnableComposeSurfaceSyncWorkaround를 호출해야 합니다. (#1237, #1594)
    • PlayerViewsetFullscreenButtonState를 추가하여 전체 화면 버튼 아이콘을 필요에 따라 업데이트할 수 있도록 합니다. 즉, 클릭 상호작용에 반응적으로 업데이트하지 않고 부하 외적으로 업데이트합니다(#1590, #184).
    • 앱에서 정의한 텍스트 트랙 선택 환경설정이 있는 경우 텍스트 선택에서 '없음' 옵션이 작동하지 않는 버그를 수정했습니다.
  • DASH 확장 프로그램:
    • 세그먼트 중간에 시작하는 기간 지원을 추가했습니다. (#1440)
  • 원활한 스트리밍 확장 프로그램:
    • 텍스트 트랙이 있는 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를 채웁니다. 이렇게 하면 MediaSessionRoutingSession에 연결할 수 있으며, 이는 출력 스위처 통합에 필요합니다. (#1056)
  • 테스트 유틸리티:
    • 이제 DataSourceContractTest에는 다음을 확인하는 테스트가 포함됩니다.
      • 입력 스트림 read position가 업데이트됩니다.
      • 출력 버퍼 offset가 올바르게 적용됩니다.
  • 데모 앱
    • 데모 Shorts 앱의 메모리 누수를 해결합니다. (#1839)
  • 지원 중단된 기호 삭제:
    • 지원 중단된 Player.hasPrevious, Player.hasPreviousWindow()를 삭제합니다. 대신 Player.hasPreviousMediaItem()를 사용하세요.
    • 지원 중단된 Player.previous() 메서드를 삭제합니다. 대신 Player.seekToPreviousMediaItem()를 사용합니다.
    • 지원 중단된 DrmSessionEventListener.onDrmSessionAcquired 메서드를 삭제합니다.
    • 지원 중단된 DefaultEncoderFactory 생성자를 삭제했습니다. 대신 DefaultEncoderFactory.Builder를 사용합니다.

버전 1.5.0-rc02

2024년 11월 19일

1.5.0 정식 버전을 사용하세요.

버전 1.5.0-rc01

2024년 11월 13일

1.5.0 정식 버전을 사용하세요.

버전 1.5.0-beta01

2024년 10월 30일

1.5.0 정식 버전을 사용하세요.

버전 1.5.0-alpha01

2024년 9월 10일

1.5.0 정식 버전을 사용하세요.

버전 1.4.0

버전 1.4.1

2024년 8월 27일

androidx.media3:media3-*:1.4.1이 출시되었습니다. 버전 1.4.1에는 이 커밋이 포함되어 있습니다.

  • ExoPlayer:
    • PreloadMediaSource에서 미리 로드 콜백을 비동기식으로 처리합니다. (#1568)
    • 로드에 실패한 경우 버퍼링된 시간과 관계없이 재생을 허용합니다. (#1571)
  • 추출기:
    • MP3: Info 프레임의 길이 필드를 기반으로 MP3가 아닌 후행 데이터를 올바르게 무시하여 Searched too many bytes 오류를 수정합니다. (#1480)
  • 텍스트:
    • TTML: 백분율 tts:fontSize 값이 백분율 tts:fontSize 값이 있는 상위 노드에서 올바르게 상속되도록 백분율 tts:fontSize 값 처리를 수정합니다.
    • 요청된 출력 시작 시간이 Subtitle의 최종 이벤트 시간보다 크거나 같은 경우를 잘못 처리하여 LegacySubtitleUtilIndexOutOfBoundsException를 수정합니다. (#1516)
  • DRM:
    • L1 Widevine 콘텐츠를 재생하는 API 31 이상 기기에서 android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE 오류를 수정했습니다. 이 오류는 프레임워크 MediaDrm.requiresSecureDecoder 메서드의 불완전한 구현으로 인해 발생합니다 (#1603).
  • 효과:
    • GlObjectsProviderrelease() 메서드를 추가합니다.
  • 세션:
    • 문서에 설명된 대로 KEYCODE_HEADSETHOOK의 두 번 탭을 '다음으로 이동' 작업으로 변환합니다. (#1493)
    • ForegroundServiceDidNotStartInTimeException를 방지하기 위해 KEYCODE_HEADSETHOOK를 무시할지 결정할 때 MediaButtonReceiver에서 KEYCODE_HEADSETHOOK를 '재생' 명령어로 처리합니다(#1581).
  • RTSP 확장 프로그램:
    • SDP 파싱에서 잘못된 미디어 설명을 건너뜁니다. (#1087)

버전 1.4.0

2024년 7월 25일

androidx.media3:media3-*:1.4.0이 출시되었습니다. 버전 1.4.0에는 이 커밋이 포함되어 있습니다.

  • 공통 라이브러리:
    • 무시하는 대신 가정된 무작위 탐색 호출을 보호된 BasePlayer.seekTo()SimpleBasePlayer.handleSeek() 메서드로 전달합니다. 맞춤 플레이어에서 이러한 메서드를 구현하는 경우 mediaItemIndex == C.INDEX_UNSET로 이러한 추가 호출을 처리해야 할 수 있습니다.
    • 향상된 Java 8 디슈가링에 대한 컴파일 종속 항목을 삭제했습니다. (#1312)
    • 문서에 설명된 대로 이미지가 아닌 MediaItem의 경우 MediaItem.Builder.setImageDurationMs()에 전달된 기간이 무시되는지 확인합니다.
    • Format.customData를 추가하여 Format 인스턴스에 관한 앱 제공 맞춤 정보를 저장합니다.
  • ExoPlayer:
    • rankingData에 정의된 우선순위에 따라 여러 소스의 미리 로드를 조정하는 BasePreloadManager를 추가합니다. 이 클래스를 확장하여 맞춤설정할 수 있습니다. PreloadMediaSource를 사용하여 소스의 미디어 샘플을 메모리에 미리 로드하고 UI의 항목 색인을 나타내는 정수 rankingData를 사용하는 DefaultPreloadManager를 추가합니다.
    • LoadControl 구현에서 여러 플레이어를 지원할 수 있도록 LoadControl의 대부분의 메서드에 PlayerId를 추가합니다.
    • Buffer.isDecodeOnly()C.BUFFER_FLAG_DECODE_ONLY이 삭제됩니다. 렌더러와 디코더가 타임스탬프를 기반으로 버퍼 건너뛰기를 결정하므로 이 플래그를 설정할 필요가 없습니다. 맞춤 Renderer 구현은 샘플을 표시할지 결정하기 위해 버퍼 시간이 BaseRenderer.getLastResetPositionUs() 이상인지 확인해야 합니다. 맞춤 SimpleDecoder 구현은 필요한 경우 isAtLeastOutputStartTimeUs()를 확인하거나 다른 버퍼를 DecoderOutputBuffer.shouldBeSkipped로 표시하여 건너뛸 수 있습니다.
    • TargetPreloadStatusControl.getTargetPreloadStatus(T)에서 null 값을 반환하여 지정된 rankingDataMediaSource를 미리 로드하지 않도록 허용합니다.
    • remove(MediaSource)BasePreloadManager에 추가합니다.
    • BasePreloadManagerreset()를 추가하여 미리 로드 관리자 인스턴스를 유지하면서 모든 보류 소스를 해제합니다.
    • ExoPlayer.setPriority() (및 Builder.setPriority())를 추가하여 PriorityTaskManager에 사용되는 우선순위 값과 API 35의 MediaCodec 중요도를 정의합니다.
    • CMCD에서 잘못된 bs (버퍼 부족) 키가 발생하는 마지막 재버퍼링 시간을 업데이트하는 문제 수정(#1124).
    • 소스가 끝까지 로드되었음을 나타내는 PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)를 추가합니다. 이렇게 하면 DefaultPreloadManager 및 맞춤 PreloadMediaSource.PreloadControl 구현이 다음 소스를 미리 로드하거나 다른 작업을 실행할 수 있습니다.
    • 항목 끝에서 무음 건너뛰기가 재생 예외를 트리거할 수 있는 버그를 수정했습니다.
    • PreloadMediaSourceclear를 추가하여 미리 로드 기간을 삭제합니다.
    • 우선순위가 더 높은 태스크를 위해 코덱 리소스가 재사용될 때 사용되는 새 오류 코드 PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED를 추가했습니다.
    • 초기 콘텐츠 미디어 준비가 완료되기 전에 AdsMediaSource가 프리롤 광고를 로드하도록 합니다. (#1358)
    • 원래 기간이 이미 매니페스트에서 삭제된 후 다중 기간 DASH 라이브 스트림을 다시 준비할 때 재생이 STATE_ENDED로 이동하는 버그를 수정했습니다.
    • PreloadMediaSource.PreloadControl에서 onTimelineRefreshed()의 이름을 onSourcePrepared()로, onPrepared()의 이름을 onTracksSelected()로 바꿉니다. DefaultPreloadManager.Stage의 IntDefs 이름도 적절하게 바꿉니다.
    • 동적 예약에 대한 실험적 지원을 추가하여 작업을 CPU 절전 모드 종료 주기와 더 잘 일치시키고 렌더러가 진행될 수 있을 때까지 절전 모드 종료를 지연합니다. ExoPlayer 인스턴스를 설정할 때 experimentalSetDynamicSchedulingEnabled()를 사용하여 이를 사용 설정할 수 있습니다.
    • Renderer.getDurationToProgressUs()를 추가합니다. Renderer는 이 메서드를 구현하여 렌더러가 진행되기 위해 재생이 진행되어야 하는 시간을 ExoPlayer에 반환할 수 있습니다. ExoPlayerexperimentalSetDynamicSchedulingEnabled()로 설정된 경우 ExoPlayer는 작업 작업을 예약할 시간을 계산할 때 이 메서드를 호출합니다.
    • MediaCodecRenderer에서 입력 버퍼와 출력 버퍼를 사용할 수 있을 때 알림을 보내도록 MediaCodecAdapter#OnBufferAvailableListener를 추가합니다. MediaCodecRenderer는 이러한 콜백을 수신할 때 ExoPlayer에 신호를 보내고 ExoPlayerexperimentalSetDynamicSchedulingEnabled()로 설정된 경우 렌더러가 진행될 수 있으므로 ExoPlayer가 작업 루프를 예약합니다.
    • LoadControl 메서드에 개별 매개변수 대신 데이터 클래스를 사용합니다.
    • ExoPlayer.isReleased()를 추가하여 Exoplayer.release()가 호출되었는지 확인합니다.
    • ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()를 추가하여 seekToPrevious()가 이전 항목으로 탐색하는 최대 위치를 구성합니다. (#1425)
    • 일부 오디오 포커스 불일치를 수정했습니다. 예를 들어 플레이어가 일시중지된 동안 전체 또는 일시적인 포커스 손실이 보고되지 않았습니다(#1436).
    • 초기 준비 단계 후 추출기가 추가 트랙을 보고하여 발생할 수 있는 IndexOutOfBoundsException를 수정했습니다. (#1476)
    • ExoPlayer.setVideoEffect()Effects는 렌더러 오프셋이 삭제된 타임스탬프를 수신합니다. (#1098)
    • 다른 재생목록 항목을 미리 읽는 동안 발생한 플레이어 오류를 처리할 때 발생할 수 있는 IllegalArgumentException를 수정했습니다. (#1483)
  • 변환기:
    • 출력 파일의 각 트랙이 만들어진 방식을 나타내는 audioConversionProcessvideoConversionProcessExportResult에 추가합니다.
    • 자르기 최적화 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 프로필 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 사양에 따르면 스트림에 있는 값과 관계없이 rowLockcolumnLock는 모두 true로 가정해야 합니다 (columnLock 지원은 구현되지 않으므로 항상 false로 가정됨).
      • 이 변경사항은 원래 1.3.0-alpha01 출시 노트에 포함되었지만 1.3.0-rc01 출시 전에 실수로 되돌려졌습니다. 이제 문제가 해결되어 변경사항이 다시 표시됩니다.
    • CEA-708: ExoPlayer의 'set pen location' 명령어 처리로 인해 중복 줄바꿈이 추가되는 것을 방지합니다. (#1315)
    • DASH 스트림의 일부와 같이 WebVTT 자막 샘플에 신호가 없는 경우 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 지원을 추가합니다.
    • nullExoPlayer.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 출력 지원
    • ExoPlayer.setVideoEffect 및 Transformer의 Debug SurfaceView에서 HLG 노출 영역 출력을 개선하는 EGL_GL_COLORSPACE_BT2020_HLG_EXT 지원을 추가했습니다.
    • setOverlayFrameAnchor()에 적용된 x 및 y 값을 전환하여 문서와 일치하도록 오버레이 행렬 구현을 업데이트합니다. OverlaySettings.Builder.setOverlayFrameAnchor()를 사용하는 경우 x 및 y 값에 -1를 곱하여 뒤집습니다.
    • ExoPlayer#setVideoEffects와 함께 사용할 때 TimestampWrapper가 비정상 종료되는 버그를 수정했습니다. (#821)
    • 기본 SDR 색상 작업 공간을 선형 색상에서 전기 BT 709 SDR 동영상으로 변경합니다. 원래 색상 공간을 유지하는 세 번째 옵션도 제공합니다.
    • EditedMediaItemSequences의 불명확한 z 순서를 정의할 수 있습니다(#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의 아이콘 상수를 추가합니다.
    • 앱이 onTaskRemoved()에서 서비스를 중지해야 하는지 쿼리할 수 있도록 MediaSessionService.isPlaybackOngoing()를 추가합니다. (#1219)
    • 모든 세션의 재생을 일시중지하고 stopSelf()를 호출하여 MediaSessionService의 수명 주기를 종료할 수 있는 편리한 MediaSessionService.pauseAllPlayersAndStopSelf()를 추가합니다.
    • MediaSessionService.onTaskRemoved(Intent)를 재정의하여 재생이 진행 중인 경우 포그라운드에서 서비스를 계속 실행하거나 그렇지 않은 경우 서비스를 중지하는 안전한 기본 구현을 제공합니다.
    • 플랫폼 세션 메타데이터에 길이를 설정하지 않아 라이브 스트림의 미디어 알림에서 탐색바를 숨깁니다. (#1256)
    • media1에서와 동일한 선호 순서와 로직을 사용하여 메타데이터 속성을 선택할 때 MediaMetadataMediaDescriptionCompat로 변환합니다.
    • Media3 컨트롤러에 심각하지 않은 오류를 전송할 수 있는 MediaSession.sendError()를 추가합니다. 알림 컨트롤러 (MediaSession.getMediaNotificationControllerInfo() 참고)를 사용하는 경우 맞춤 오류는 플랫폼 세션의 PlaybackState를 지정된 오류 정보가 포함된 오류 상태로 업데이트하는 데 사용됩니다(#543).
    • MediaSession.Callback.onPlayerInteractionFinished()를 추가하여 특정 컨트롤러의 일련의 플레이어 상호작용이 완료되었음을 세션에 알립니다.
    • SessionError를 추가하고 오류 코드 대신 SessionResultLibraryResult에서 이를 사용하여 오류에 관한 자세한 정보와 가능한 경우 오류를 해결하는 방법을 제공합니다.
    • 미디어 세션을 게시하는 앱과의 상호작용을 테스트하는 데 사용할 수 있는 media3 컨트롤러 테스트 앱의 코드를 게시합니다.
    • media3의 MediaSession[Builder].setSessionExtras()에 전달된 추가 항목을 media1 컨트롤러의 PlaybackStateCompat.getExtras()에 전파합니다.
    • 심각한 오류 및 심각하지 않은 오류를 플랫폼 세션에 매핑합니다. PlaybackExceptionPlaybackStateCompat의 심각한 오류 상태에 매핑됩니다. MediaSession.sendError(ControllerInfo, SessionError)와 함께 미디어 알림 컨트롤러로 전송된 SessionErrorPlaybackStateCompat의 심각하지 않은 오류에 매핑됩니다. 즉, 오류 코드와 메시지는 설정되지만 플랫폼 세션의 상태는 STATE_ERROR와 다르게 유지됩니다.
    • 세션 활동을 컨트롤러별로 설정하여 전역 세션 활동을 재정의할 수 있습니다. 세션 활동은 AcceptedResultBuilder.setSessionActivivty(PendingIntent)ConnectionResult를 만들어 연결 시 컨트롤러에 정의할 수 있습니다. 연결되면 세션 활동을 MediaSession.setSessionActivity(ControllerInfo, PendingIntent)로 업데이트할 수 있습니다.
    • MediaLibrarySession.Callback 호출의 오류 복제를 개선합니다. 이제 MediaLibrarySession.Builder.setLibraryErrorReplicationMode()를 사용하여 오류 유형을 선택하거나 기본적으로 사용 설정된 오류 복제를 선택 해제하여 오류 복제를 구성할 수 있습니다.
  • UI:
    • ExoPlayer에 연결된 경우 PlayerView에 이미지 디스플레이 지원을 추가합니다. (#1144)
    • xml 속성을 통해 PlayerControlView에서 다양한 아이콘의 맞춤설정을 추가하여 전역 재정의(#1200)가 아닌 PlayerView 인스턴스별로 다른 드로어블을 허용합니다.
    • API 34의 Compose AndroidView 내에서 SurfaceView를 사용할 때 동영상이 늘어나거나 잘리는 플랫폼 버그를 해결했습니다. (#1237)
  • 다운로드:
    • DownloadHelper가 출시되지 않은 Renderer 인스턴스를 유출하지 않도록 합니다. 이렇게 하면 결국 IllegalStateException: Too many receivers, total of 1000, registered for pid로 인해 앱이 다운될 수 있습니다. (#1224)
  • Cronet 확장 프로그램:
    • CronetDataSourceSocketTimeoutException를 수정했습니다. 일부 버전의 Chrome에서는 콜백에서 제공하는 요청이 항상 동일하지는 않습니다. 이로 인해 콜백이 완료되지 않고 요청이 시간 초과됩니다(https://issuetracker.google.com/328442628).
  • HLS 확장 프로그램:
    • 불연속성을 기다리는 대기 중인 EMSG 샘플이 잘못된 오프셋으로 HlsSampleStreamWrapper에 위임되어 IndexOutOfBoundsException 또는 IllegalArgumentException가 발생하는 버그를 수정했습니다. (#1002)
    • LL-HLS 스트림에서 기본이 아닌 재생목록이 계속 새로고침되는 버그를 수정했습니다. (#1240)
    • 초기화 세그먼트가 있는 HLS에 CMCD를 사용 설정하면 Source ErrorIllegalArgumentException이 발생하는 버그를 수정했습니다.
    • 실시간 재생 중에 기본이 아닌 재생 중인 재생목록이 새로고침되지 않는 버그를 수정했습니다. (#1240)
    • HLS 라이브 스트림에 CMCD를 사용 설정하면 ArrayIndexOutOfBoundsException가 발생하는 버그를 수정했습니다. (#1395)
  • DASH 확장 프로그램:
    • 다중 기간 라이브 스트림을 다시 준비하면 IndexOutOfBoundsException이 발생할 수 있는 버그를 수정했습니다. (#1329)
    • dashif:Laurl 라이선스 URL 지원을 추가합니다. (#1345)
  • Cast 확장 프로그램:
    • Media3 미디어 항목에서 MediaQueueItem의 앨범 제목을 아티스트로 변환하는 버그를 수정했습니다. (#1255)
  • 테스트 유틸리티:
    • FakeRenderer에서 onInit()onRelease()를 구현합니다.
    • 심각하지 않은 오류 (예: AnalyticsListener.onVideoCodecError()에 보고된 오류)에서 실패하도록 TestPlayerRunHelper.runUntil()/playUntil() 메서드를 변경합니다. 새 TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX() 메서드 체인을 사용하여 이 동작을 사용 중지합니다.
  • 데모 앱:
    • 짧은 형식 데모 앱에서 DefaultPreloadManager를 사용합니다.
    • 명령줄에서 Intent 인수를 사용하여 반복 모드를 설정할 수 있도록 허용합니다(#1266).
    • 기기에서 지원하는 경우 HttpEngineDataSourceHttpDataSource로 사용합니다.
  • 지원 중단된 기호 삭제:
    • 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.DUMMYgetDummyDrmSessionManager() 메서드를 삭제합니다. 대신 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에서 '실제' 동영상 트랙을 선택할 수 있습니다. 이 트랙에는 해상도가 더 높지만 프레임 수가 매우 적은 HEVC 트랙 2개가 포함될 수 있습니다(#1051).
  • 추출기:
    • WAV 파일에서 홀수 크기 청크를 읽을 때 패딩이 건너뛰어지지 않는 문제를 수정했습니다. (#1117)
    • MP3: XINGVBRI와 같은 메타데이터 프레임에서 Format.averageBitrate를 채웁니다.
    • MPEG-TS: 스트림의 마지막 액세스 단위를 샘플 대기열에 전달하여 마지막 프레임이 렌더링되도록 하는 변경사항을 되돌립니다(#7909). 이는 I프레임 전용 HLS 스트림(#1150) 및 H.262 HLS 스트림 (#1126)에 새로운 문제가 발생하는 변경사항으로 인해 발생합니다.
  • 오디오:
    • 오디오 트랙이 오프로드 모드에서 초기화되지 않으면 오프로드를 사용 중지하여 렌더러 복구를 허용합니다.
  • 동영상:
    • 60fps H265 스트림이 지원되지 않는 것으로 표시되는 Galaxy Tab S7 FE, Chromecast with Google TV, Lenovo M10 FHD Plus의 기기 문제에 대한 해결 방법을 추가했습니다.
    • 기기가 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 등):
    • MIDI 확장 프로그램은 추가 Maven 저장소를 구성해야 하므로 기본적으로 로컬 종속 항목으로 사용 중지됩니다. 로컬 종속 항목에서 이 모듈이 필요한 사용자는 다시 사용 설정할 수 있습니다.

버전 1.3.0

2024년 3월 6일

androidx.media3:media3-*:1.3.0이 출시되었습니다. 버전 1.3.0에는 이 커밋이 포함되어 있습니다.

  • 공통 라이브러리:
    • package가 현재 애플리케이션의 패키지와 다른 경우 android.resource://package/[type/]name 원시 리소스 URI 지원을 구현합니다. 이 방법은 항상 작동하는 것으로 문서화되었지만 지금까지 올바르게 구현되지 않았습니다.
    • 앱 코드에서 설정했거나 미디어에서 읽은 MIME 유형을 완전히 소문자로 표준화합니다.
    • AdPlaybackState에서 단일 Uri 대신 전체 MediaItem로 광고를 정의합니다.
    • minSdk를 19 (Android KitKat)로 높입니다. 이는 다른 모든 AndroidX 라이브러리와 일치하며 AndroidX 종속 항목의 최신 버전으로 업그레이드하는 데 필요합니다.
    • 둘 중 하나라도 null이 아닌 경우 MediaMetadata.Builder.populate(MediaMetadata)artworkUriartworkData를 모두 채웁니다. (#964)
  • ExoPlayer:
    • 앱이 재생 전에 특정 시작 위치에서 콘텐츠 미디어 소스를 미리 로드할 수 있는 PreloadMediaSourcePreloadMediaPeriod를 추가했습니다. PreloadMediaSourceTimeline를 수신할 콘텐츠 미디어 소스를 준비하고, 지정된 시작 위치에서 기간을 준비하고 캐시하며, 트랙을 선택하고 기간의 미디어 데이터를 로드합니다. 앱은 PreloadMediaSource.PreloadControl를 구현하여 미리 로드 진행 상황을 제어하고 미리 로드된 소스를 재생을 위해 플레이어에 설정합니다.
    • 앱이 ImageRenderer.ImageOutput를 설정할 수 있는 ExoPlayer.setImageOutput를 추가합니다.
    • 이제 DefaultRenderersFactory는 기본적으로 null ImageOutputImageDecoder.Factory.DEFAULT과 함께 플레이어에 ImageRenderer를 제공합니다.
    • 무음이 건너뛰어질 때 Player.Listener.onPositionDiscontinuity 이벤트를 내보냅니다. (#765)
    • 추출 중에 자막 파싱을 위한 실험용 지원을 추가했습니다. MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()를 사용하여 사용 설정할 수 있습니다.
    • PreloadMediaSource를 사용하여 적응형 미디어 소스를 지원합니다.
    • HttpEngine API를 사용하여 HttpDataSourceHttpEngineDataSource를 구현합니다.
    • CompositeSequenceableLoader 서브클래스화를 방지합니다. 이 구성요소는 이전에 확장 가능하도록 설정되었지만 라이브러리 내에서 서브클래스화된 적이 없습니다. 맞춤설정은 데코레이터 패턴을 사용하여 인스턴스를 래핑하고 맞춤 CompositeSequenceableLoaderFactory를 구현하여 실행할 수 있습니다.
    • 동일한 시간을 반복하면 이 항목의 메타데이터가 삭제되는 문제를 수정했습니다. (#1007)
    • BundledChunkExtractor.FactoryDefaultHlsExtractorFactoryexperimentalSetSubtitleParserFactory 메서드 이름을 setSubtitleParserFactory로 바꾸고 null 전달을 허용하지 않습니다. 새 experimentalParseSubtitlesDuringExtraction(boolean) 메서드를 사용하여 파싱 동작을 제어합니다.
    • 추출 중에 사용되는 SubtitleParser.Factory 맞춤설정을 지원합니다. MediaSource.Factory.setSubtitleParserFactory()를 사용하면 됩니다.
    • MergingMediaSource에서 생성된 모든 Format.id 필드에 소스 접두사를 추가합니다. 이렇게 하면 Format를 생성한 소스를 식별하는 데 도움이 됩니다 (#883).
    • 하이픈만 확인하도록 수정하여 맞춤 CMCD (Common Media Client Data) 키 이름을 검증하는 데 사용되는 정규식을 수정합니다. (#1028)
    • CMCD 쿼리 매개변수의 이중 인코딩을 중지합니다. (#1075)
  • 변환기:
    • H.265/HEVC SEF 슬로 모션 동영상 평탄화 지원을 추가합니다.
    • 특히 '동영상 삭제' 수정 작업의 경우 전송 muxing 속도를 높입니다.
    • 출력 파일이 동영상 프레임에서 시작되도록 하는 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 사양에 따르면 스트림에 있는 값과 관계없이 rowLockcolumnLock는 모두 true로 가정해야 합니다 (columnLock 지원은 구현되지 않으므로 항상 false로 가정됨).
  • 이미지:
    • DASH 썸네일 지원을 추가했습니다. 그리드 이미지는 잘리며 개별 썸네일은 프레젠테이션 시간에 가까운 ImageOutput에 제공됩니다.
  • DRM:
  • IMA 확장 프로그램:
    • 적절한 파일 확장자가 없는 DASH 및 HLS 광고를 재생할 수 없는 문제를 수정했습니다.
  • 세션:
    • TV 앱의 더블클릭 감지를 사용 중지합니다. (#962)
    • null이 아닌 추가 항목만 있는 MediaItem.RequestMetadata가 미디어 컨트롤러와 세션 간에 전송되지 않는 문제를 수정했습니다.
    • MediaLibraryService 대신 Context만 사용하는 생성자를 MediaLibrarySession.Builder에 추가합니다.
  • HLS 확장 프로그램:
    • HlsMediaPeriod를 package-private 공개 상태로 줄입니다. 이 유형은 HLS 패키지 외부에서 직접 종속해서는 안 됩니다.
    • 세그먼트 시작 부분으로 더 효율적으로 탐색을 해결합니다. (#1031)
  • 디코더 확장 프로그램 (FFmpeg, VP9, AV1, MIDI 등):
    • MIDI 디코더: SysEx 이벤트 메시지를 무시합니다(#710).
  • 테스트 유틸리티:
    • TestPlayerRunHelper.playUntilPosition에서 재생을 일시중지하지 않습니다. 테스트는 재생을 재생 상태로 유지하지만 테스트에서 어설션과 추가 작업을 추가할 수 있을 때까지 진행을 일시중지합니다.
  • 데모 앱:
    • Shorts 동영상 데모 모듈을 추가하여 Shorts 동영상 사용 사례에서 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)
  • 동영상:
    • 60fps AVC 스트림이 지원되지 않는 것으로 표시되는 Galaxy Tab S7 FE, Chromecast with Google TV, Lenovo M10 FHD Plus의 기기 문제 해결 방법을 추가했습니다(#693).
  • 메타데이터:
    • 대문자 키가 있는 Vorbis 주석에서만 MediaMetadata가 채워지는 버그를 수정했습니다. (#876)
    • 매우 큰 ID3 프레임을 파싱할 때 OutOfMemoryError를 포착합니다. 즉, 재생이 완전히 중단되는 대신 태그 정보 없이 재생이 계속될 수 있습니다.
  • DRM:
    • 허위 ClearKey https://default.url 라이선스 URL의 해결 방법을 API 33 이상으로 확장합니다 (이전에는 해결 방법이 API 33에만 정확하게 적용됨). (#837)
    • 플레이어에 노출 영역이 연결되지 않은 상태에서 암호화된 콘텐츠에서 일반 콘텐츠로 전환할 때 ERROR_DRM_SESSION_NOT_OPENED를 수정합니다. 보안 디코더를 잘못 사용하여 선명한 콘텐츠를 재생했기 때문에 오류가 발생했습니다.
  • 세션:
    • MediaMetadataCompat의 맞춤 키와 값을 MediaMetadata.extras로, MediaMetadata.extrasMediaMetadataCompat로 설정합니다. (#756, #802)
    • 기존 컨트롤러의 notifyChildrenChanged 브로드캐스트를 수정합니다. (#644)
    • 알림의 사용 중지된 setWhen 타이머에 음수 시간을 설정하면 일부 기기에서 비정상 종료가 발생하는 버그를 수정했습니다(#903).
    • 첫 번째 알림 업데이트가 요청되었을 때 미디어 알림 컨트롤러가 연결을 완료하지 않은 경우 IllegalStateException를 수정합니다. (#917)
  • UI:
    • BottomSheetDialogFragment에서 Material Design과 함께 사용할 때 빨리 감기 및 되감기 버튼이 표시되지 않는 문제를 수정했습니다. (#511)
    • PlayerControlView의 빨리 감기 버튼에 있는 숫자가 잘못 정렬된 문제를 수정했습니다. (#547)
  • DASH 확장 프로그램:
    • DASH 매니페스트에서 'f800'을 Dolby의 채널 수 5로 파싱합니다. (#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 호환성 문제를 수정했습니다. 예로는 TrackSelectorResultSimpleDecoder 메서드 매개변수가 있습니다. (#6792)
    • 재생이 일시적으로 억제되는 동안 (예: 일시적인 오디오 포커스 손실로 인해) '재생' 버튼을 표시하도록 Util.shouldShowPlayButton의 기본 UI 및 알림 동작을 변경합니다. 기존 동작은 PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) 또는 MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)(#11213)를 사용하여 유지할 수 있습니다.
    • androidx.annotation:annotation-experimental1.3.1로 업그레이드하여 https://issuetracker.google.com/251172715를 수정합니다.
    • ExoPlayer.setAudioAttributesPlayer 인터페이스로 이동합니다.
  • ExoPlayer:
    • 디코딩 전용 샘플을 올바르게 식별하지 못해 AC4 스트림에서 발생하는 탐색 문제를 수정했습니다. (#11000)
    • 이 기능이 ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput를 통해 사용 설정된 경우 부적합한 오디오 출력 기기 (예: Wear OS 기기의 내장 스피커)에서 재생을 억제합니다. 적절한 오디오 출력을 사용할 수 없을 때 재생을 시도하거나 재생 중에 적절한 출력이 모두 연결 해제되면 재생 억제 이유가 Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT로 업데이트됩니다. 적절한 출력이 연결되면 억제 사유가 삭제됩니다.
    • MediaSource.canUpdateMediaItemMediaSource.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 외에도 playbackSpeedlastRebufferRealtimeMs를 비롯한 추가 매개변수가 포함되어 있습니다.
    • ChunkSource 인터페이스의 ChunkSource.getNextChunk(long, long, List, ChunkHolder) 메서드를 ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)로 개선합니다.
    • 버퍼 부족 (bs), 기한 (dl), 재생 속도 (pr), 시작 (su)이라는 필드를 CMCD(Common Media Client Data) 로깅에 추가합니다(#8699).
    • ColorInfo에 luma 및 chroma 비트 심도를 추가합니다. (#491)
    • 다음 객체 요청 (nor) 및 다음 범위 요청 (nrr) 필드를 CMCD (Common Media Client Data) 로깅에 추가합니다. (#8699)
    • 쿼리 매개변수를 사용하여 CMCD (Common Media Client Data) 데이터를 전송하는 기능을 추가했습니다 (#553).
    • ExperimentalBandwidthMeterConcurrentModificationException를 수정합니다. (#612)
    • CompositeMediaSource.getMediaTimeForChildMediaTimeMediaPeriodId 매개변수를 추가합니다.
    • ConcatenatingMediaSource2에서 ClippingMediaSource (및 기간/기간 시간 오프셋이 있는 기타 소스)를 지원합니다. (#11226)
    • MediaPeriodId 인수도 수신하도록 BaseRenderer.onStreamChanged()를 변경합니다.
  • 변환기:
    • 이미지 입력의 Exif 회전 데이터를 파싱합니다.
    • TransformationRequest.HdrMode 주석 유형 및 관련 상수를 삭제합니다. 대신 Composition.HdrMode 및 연결된 상수를 사용하세요.
    • OverlaySettings를 단순화하여 회전 문제를 해결합니다.
    • SampleConsumer.queueInputBitmapframeRatedurationUs 매개변수를 TimestampIterator로 변경했습니다.
  • 트랙 선택:
    • DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness를 추가하여 원활하지 않은 적응을 명시적으로 허용하거나 허용하지 않습니다. 기본값은 현재 동작인 true로 유지됩니다.
  • 추출기:
    • MPEG-TS: 스트림의 마지막 액세스 단위를 샘플 대기열에 전달하여 마지막 프레임이 렌더링되도록 합니다(#7909).
    • rotationDegrees를 결정할 때의 오타를 수정했습니다. projectionPosePitchprojectionPoseRoll로 변경했습니다(#461).
    • Extractor 인스턴스를 instanceof로 직접 검사할 수 있다는 가정을 삭제합니다. Extractor의 구현 세부정보에 런타임 액세스하려면 먼저 Extractor.getUnderlyingInstance를 호출해야 합니다.
    • BmpExtractor를 추가합니다.
    • WebpExtractor를 추가합니다.
    • HeifExtractor를 추가합니다.
    • Mp4ExtractorQuickTime classic 지원을 추가합니다.
  • 오디오:
    • MP4 및 Matroska에서 24/32비트 빅엔디언 PCM 지원을 추가하고 MP4에서 lpcm의 PCM 인코딩을 파싱합니다.
    • MP4에서 Vorbis 오디오를 추출하는 지원을 추가합니다.
    • DefaultAudioOffloadSupportProvider를 통해 싱크가 형식에 제공할 수 있는 오프로드 지원 수준을 가져오는 AudioSink.getFormatOffloadSupport(Format)를 추가합니다. isFormatSupported, isGaplessSupported, isSpeedChangeSupported가 포함된 새 AudioOffloadSupport를 반환합니다.
    • 오디오 싱크의 오프로드 구성이 구성되는 AudioSink.setOffloadMode()를 추가합니다. 기본값은 AudioSink.OFFLOAD_MODE_DISABLED입니다.
    • 오프로드는 TrackSelectionParameterssetAudioOffloadPreference를 통해 사용 설정할 수 있습니다. 설정된 환경설정이 사용 설정되어 있고 기기가 형식의 오프로드를 지원하며 트랙 선택이 단일 오디오 트랙인 경우 오디오 오프로드가 사용 설정됩니다.
    • audioOffloadModePreferenceAUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED로 설정된 경우 DefaultTrackSelector는 오디오 트랙만 선택하며, 이 트랙의 형식이 오프로드에서 지원되는 경우에만 선택합니다. 오프로드에서 지원되는 오디오 트랙이 없으면 트랙이 선택되지 않습니다.
    • 트랙 전환 후 재생 위치 문제로 인해 API 수준 33 미만의 경우 오프로드에 대한 갭리스 지원을 사용 중지합니다.
    • DefaultRenderersFactory.buildAudioSink 메서드 서명에서 enableOffload 매개변수를 삭제합니다.
    • DefaultAudioSink.Builder.setOffloadMode 메서드를 삭제합니다.
    • intdef 값 DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED를 삭제합니다.
    • 오프로드 재생 중에 Opus 갭리스 메타데이터 지원을 추가합니다.
    • 첫 번째 쓰기에 실패한 경우 오프로드를 사용 중지하여 렌더러 복구를 허용합니다. (#627)
    • 오디오 전용 오프로드 재생에 기본적으로 오프로드 예약을 사용 설정합니다.
    • ExoPlayer.experimentalSetOffloadSchedulingEnabledAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged를 삭제합니다.
    • onExperimentalSleepingForOffloadChanged의 이름이 onSleepingForOffloadChanged로, onExperimentalOffloadedPlayback의 이름이 onOffloadedPlayback로 변경되었습니다.
    • 오디오 오프로드 모드 관련 TrackSelectionParameters 인터페이스와 정의를 내부 AudioOffloadPreferences 클래스로 이동합니다.
    • AnalyticsListener, AudioRendererEventListener, AudioSink.ListeneronAudioTrackInitializedonAudioTrackReleased 콜백을 추가합니다.
    • 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.queueInputBitmapframeRatedurationUs 매개변수를 TimestampIterator로 변경했습니다.
  • IMA 확장 프로그램:
    • 재생목록의 첫 번째 항목이 아닌 다중 기간 DASH 라이브 스트림에서 예외가 발생할 수 있는 버그를 수정했습니다. (#571)
    • AdsLoader.destroy()를 호출하기 전에 StreamManager를 해제합니다.
    • IMA SDK 버전을 3.31.0으로 범프합니다.
  • 세션:
    • DefaultMediaNotificationProvider에서 알림 포그라운드 서비스 동작을 FOREGROUND_SERVICE_IMMEDIATE로 설정합니다. (#167)
    • API 31 이상에서 android.media.session.MediaSession.setMediaButtonBroadcastReceiver()만 사용하여 삼성 기기에서 지원 중단된 API와 관련된 문제를 방지합니다. (#167)
    • 미디어 알림 컨트롤러를 프록시로 사용하여 알림 및 플랫폼 세션을 채우는 데 사용되는 사용 가능한 명령어와 맞춤 레이아웃을 설정합니다.
    • 미디어 버튼 이벤트를 플랫폼 세션으로 라우팅한 후 Media3로 다시 라우팅하는 대신 Media3 내에서 MediaSessionService.onStartCommand()에 수신된 미디어 버튼 이벤트를 변환합니다. 이를 통해 호출자 컨트롤러는 항상 미디어 알림 컨트롤러가 되며 앱은 지원되는 모든 API 수준에서 동일한 방식으로 알림에서 발생하는 호출을 쉽게 인식할 수 있습니다.
    • 기존 MediaSessionCompat에 연결되어 있을 때 MediaController.getCurrentPosition()가 진행되지 않는 버그를 수정했습니다.
    • 편의를 위해 MediaLibrarySession.getSubscribedControllers(mediaId)를 추가합니다.
    • 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의 '데이터 동기화' 포그라운드 서비스 유형을 선언합니다. 이 서비스를 사용할 때 앱은 매니페스트에 dataSyncforegroundServiceType로 추가하고 FOREGROUND_SERVICE_DATA_SYNC 권한을 추가해야 합니다(#11239).
  • HLS 확장 프로그램:
    • 마지막 로드 완료 시간이 아닌 마지막 로드 시작 시간으로 계산된 간격으로 HLS 라이브 재생목록을 새로고침합니다(#663).
  • DASH 확장 프로그램:
    • 세그먼트 템플릿 URL에서 동일한 DASH 식별자를 여러 개 허용합니다.
    • 추출 중에 자막 파싱을 위한 실험용 지원을 추가했습니다. 이렇게 하면 자막 세그먼트 간에 전환할 때 깜박임을 해결하는 등 겹치는 자막을 병합하는 기능이 개선됩니다. DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()(#288)를 사용하여 이를 사용 설정할 수 있습니다.
  • RTSP 확장 프로그램:
    • TCP로 대체할 때 IndexOutOfBoundsException이 발생하거나 경우에 따라 재생이 중단될 수 있는 경합 상태를 수정했습니다.
    • RtspMediaPeriod의 로드 상태를 반환할 때 RTSP 설정에서 상태를 확인합니다. (#577)
    • 옵션 응답 공개 헤더에서 맞춤 Rtsp 요청 메서드를 무시합니다. (#613)
    • 연결 유지 RTSP 옵션 요청을 전송하는 시간 간격에 RTSP 설정 응답 제한 시간 값을 사용합니다. (#662)
  • 디코더 확장 프로그램 (FFmpeg, VP9, AV1, MIDI 등):
    • Jsyn 라이브러리를 사용하여 오디오를 합성하는 표준 MIDI 파일의 재생을 지원하는 MIDI 디코더 모듈을 출시합니다.
    • DecoderOutputBuffer.shouldBeSkipped를 추가하여 표시할 필요가 없는 출력 버퍼를 직접 표시합니다. 지원 중단될 C.BUFFER_FLAG_DECODE_ONLY보다 선호됩니다.
    • 디코더가 시작 시간 전에 디코딩 전용 샘플을 삭제할 수 있도록 Decoder.setOutputStartTimeUsSimpleDecoder.isAtLeastOutputStartTimeUs를 추가합니다. 지원 중단될 Buffer.isDecodeOnly보다 이 방법을 사용하는 것이 좋습니다.
    • Maven 저장소에 MIDI 디코더 아티팩트를 게시하는 버그를 수정했습니다. 아티팩트의 이름이 media3-exoplayer-midi로 바뀝습니다. (#734)
  • Leanback 확장 프로그램:
    • 노출 영역을 사용 중지하면 Leanback 코드에서 ArithmeticException이 발생할 수 있는 버그를 수정했습니다. (#617)
  • 테스트 유틸리티:
    • TestExoPlayerBuilderFakeClock를 Espresso UI 테스트 및 Compose UI 테스트와 호환되도록 합니다. 이렇게 하면 Espresso 또는 Compose 뷰 상호작용 중에 재생이 비결정적으로 진행되는 버그가 수정됩니다.
  • 지원 중단된 기호 삭제:
    • TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)를 삭제합니다. 대신 Composition.Builder.setHdrMode(int)를 사용하고 CompositionTransformer.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_VOLUMECOMMAND_SET_DEVICE_VOLUME)와 새 명령어 (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGSCOMMAND_SET_DEVICE_VOLUME_WITH_FLAGS)를 통해 volumeControlType를 결정하여 PlayerWrapperVolumeProviderCompat를 만드는 방식을 수정합니다(#554).

버전 1.1.0

2023년 7월 5일

  • 공통 라이브러리:
    • 부적절한 오디오 경로의 억제 이유를 추가하고 준비되면 재생합니다. 너무 오래 억제된 이유를 변경합니다. (#15).
    • 플레이어에 명령어를 추가합니다.
      • 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)
    • DeviceInfoBuilder를 추가하고 기존 생성자를 지원 중단합니다.
    • 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()를 추가합니다.
    • sourceIdint이 아닌 long로 저장하도록 SampleQueue를 업데이트합니다. 이렇게 하면 공개 메서드 SampleQueue.sourceIdSampleQueue.peekSourceId의 서명이 변경됩니다.
    • 이러한 메서드를 관련 MediaPeriod와 연결할 수 있는 매개변수를 LoadControl 메서드 shouldStartPlaybackonTracksSelected에 추가합니다.
    • 지도에서 키로 사용되는 UID가 포함된 기간이 포함된 타임라인 매개변수를 추가하여 ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)의 서명을 변경합니다. 이는 다중 기간 라이브 스트림의 동시 실행 문제를 방지하기 위해 필요합니다.
    • EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)가 지원 중단되었습니다. 대신 mediaTimeOffsetUs가 없는 메서드의 변형을 호출할 수 있습니다. 지원 중단된 변형의 경우에도 오프셋은 더 이상 전달자가 전달하는 MediaLoadData 객체의 startTimeUsendTimeUs에 추가되지 않습니다.
    • ExoTrackSelection.blacklistexcludeTrack로, isBlacklistedisTrackExcluded로 바꿉니다.
    • 빈 재생목록에서 호출될 때 ExoPlayer.setMediaItem(s)addMediaItem(s) 간의 일관되지 않은 동작을 수정했습니다.
  • 변환기:
    • Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)가 삭제됩니다. 대신 ExoPlayerAssetLoader.Factory(MediaSource.Factory)Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)를 사용합니다.
    • Transformer.startTransformation(MediaItem, ParcelFileDescriptor)가 삭제됩니다.
    • 입력 프레임의 처리가 대기 중인 시점에 동영상 스트림 종료가 신호를 보내면 변환이 중단되어 muxer 시간 초과가 발생할 수 있는 버그를 수정했습니다.
    • 지원을 확장하려면 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를 추가합니다. 이 매개변수를 통해 DefaultAudioSinkAudioCapabilitiesReceiver의 리스너로 등록되고 기능 변경에 관한 알림을 받으면 audioCapabilities 속성을 업데이트합니다.
    • AudioSink.Listener 인터페이스의 새 이벤트 onAudioCapabilitiesChangedonRendererCapabilitiesChanged 이벤트를 트리거하는 새 인터페이스 RendererCapabilities.Listener를 통해 오디오 기능 변경사항을 전파합니다.
    • 오디오 채널에 크기 조절/믹싱을 적용하기 위한 ChannelMixingAudioProcessor를 추가합니다.
    • 오디오 기능이 변경된 후 우회 모드가 가능한 경우 오디오 디코더를 삭제하도록 DecoderDiscardReasons에 새 int 값 DISCARD_REASON_AUDIO_BYPASS_POSSIBLE를 추가합니다.
    • DTS Express 및 DTS:X의 직접 재생 지원을 추가합니다. (#335)
  • 동영상:
    • 렌더러가 사용 중지된 경우 MediaCodecVideoRenderer가 너비와 높이가 0인 VideoSize를 보고하도록 합니다. Player.getVideoSize()가 변경되면 Player.Listener.onVideoSizeChanged가 그에 따라 호출됩니다. 이 변경사항으로 인해 Player.getCurrentTracks가 동영상을 지원하지 않거나 지원되는 동영상 트랙의 크기가 아직 결정되지 않은 경우 MediaCodecVideoRenderer가 있는 ExoPlayer의 동영상 크기는 너비와 높이가 0입니다.
  • DRM:
    • DRM 패키지 외부에서 호출되지 않을 것으로 예상되는 DefaultDrmSession의 여러 내부 전용 메서드의 공개 상태를 줄입니다.
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer:
    • MP4 컨테이너 파일을 만드는 데 사용할 수 있는 새 muxer 라이브러리를 추가합니다.
  • IMA 확장 프로그램:
    • DAI에 다중 기간 라이브 DASH 스트림을 사용 설정합니다. 현재 구현은 아직 라이브 스트림에서 탐색을 지원하지 않습니다. (#10912)
    • 연속 타임라인에서 계산된 콘텐츠 위치가 약간 다르기 때문에 라이브 스트림에 새 광고 그룹이 삽입되는 버그를 수정했습니다.
  • 세션:
    • 현재 Player 메서드를 호출 중인 컨트롤러에 관한 정보를 가져오는 도우미 메서드 MediaSession.getControllerForCurrentRequest를 추가합니다.
    • 앱이 블루투스 헤드셋과 같이 전송된 미디어 버튼 이벤트로 재생 재개를 구현할 수 있도록 androidx.media3.session.MediaButtonReceiver를 추가합니다. (#167)
    • 요청된 MediaItemsLocalConfiguration (예: URI)가 있는 경우 Player에 전달할 수 있도록 MediaSession.Callback.onAddMediaItems에 기본 구현을 추가합니다(#282).
    • Android 12 이하의 경우 기본적으로 소형 미디어 알림 뷰에 '이전으로 탐색' 및 '다음으로 탐색' 명령 버튼을 추가합니다(#410).
    • 요청된 MediaItemsLocalConfiguration (예: URI)가 있는 경우 Player에 전달할 수 있도록 MediaSession.Callback.onAddMediaItems에 기본 구현을 추가합니다(#282).
    • Android 12 이하의 경우 기본적으로 소형 미디어 알림 뷰에 '이전으로 탐색' 및 '다음으로 탐색' 명령 버튼을 추가합니다(#410).
  • UI:
    • 재생/일시중지 버튼이 있는 맞춤 UI 요소를 작성하는 데 Util 메서드 shouldShowPlayButtonhandlePlayPauseButtonAction를 추가합니다.
  • RTSP 확장 프로그램:
    • MPEG4-LATM의 경우 Describe Response SDP 메시지(#302)에 없는 경우 기본 profile-level-id 값을 사용합니다.
    • DESCRIBE 응답 헤더에 있는 경우(#11160) RTSP 세션에서 상대 경로를 확인하는 데 기본 URI를 사용합니다.
  • DASH 확장 프로그램:
    • 다중 기간 DASH 스트림의 MediaLoadData.startTimeMsMediaLoadData.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() (resettrue인 경우)를 사용합니다.
    • 지원 중단된 두 개의 SimpleCache 생성자를 삭제하고 성능 향상을 위해 대신 DatabaseProvider를 사용하는 지원 중단되지 않은 생성자를 사용합니다.
    • DefaultBandwidthMeter 생성자를 삭제하고 대신 DefaultBandwidthMeter.Builder를 사용합니다.
    • DefaultDrmSessionManager 생성자를 삭제하고 대신 DefaultDrmSessionManager.Builder를 사용합니다.
    • 지원 중단된 두 개의 HttpDataSource.InvalidResponseCodeException 생성자를 삭제하고 추가 필드(cause, responseBody)를 허용하는 지원 중단되지 않은 생성자를 사용하여 오류 로깅을 개선합니다.
    • DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDash, DownloadHelper.forSmoothStreaming를 삭제하고 대신 DownloadHelper.forMediaItem를 사용하세요.
    • 지원 중단된 DownloadService 생성자를 삭제하고 channelDescriptionResourceId 매개변수를 제공하는 옵션이 포함된 지원 중단되지 않은 생성자를 사용합니다.
    • 문자 집합의 지원 중단된 문자열 상수 (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAME, UTF16LE_NAME)를 삭제하고 대신 kotlin.text 패키지의 Kotlin 문자 집합, java.nio.charset.StandardCharsets 또는 com.google.common.base.Charsets를 사용하세요.
    • 지원 중단된 WorkManagerScheduler 생성자를 삭제하고 대신 Context 매개변수를 제공하는 옵션이 포함된 지원 중단되지 않은 생성자를 사용합니다.
    • Format 클래스를 인스턴스화하는 데 사용된 지원 중단된 메서드 createVideoSampleFormat, createAudioSampleFormat, createContainerFormat, createSampleFormat를 삭제합니다. 대신 Format 인스턴스를 만드는 데 Format.Builder를 사용하세요.
    • 지원 중단된 메서드 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.onSeekProcessedAnalyticsListener.onSeekProcessed를 삭제하고 대신 DISCONTINUITY_REASON_SEEK와 함께 onPositionDiscontinuity를 사용하세요.
    • ExoPlayer.setHandleWakeLock(boolean)를 삭제하고 대신 setWakeMode(int)를 사용하세요.
    • 지원 중단된 DefaultLoadControl.Builder.createDefaultLoadControl()를 삭제하고 대신 build()를 사용하세요.
    • 지원 중단된 MediaItem.PlaybackProperties를 삭제하고 대신 MediaItem.LocalConfiguration를 사용하세요. 지원 중단된 필드 MediaItem.playbackProperties가 이제 MediaItem.LocalConfiguration 유형입니다.

버전 1.1.0-rc01

2023년 6월 21일

1.1.0 정식 버전을 사용하세요.

버전 1.1.0-beta01

2023년 6월 7일

1.1.0 정식 버전을 사용하세요.

버전 1.1.0-alpha01

2023년 5월 10일

1.1.0 정식 버전을 사용하세요.

버전 1.0.0

버전 1.0.2

2023년 5월 18일

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

이 버전은 ExoPlayer 2.18.7 출시에 해당합니다.

이 버전에는 1.0.1 출시 이후 다음과 같은 변경사항이 포함되어 있습니다.

  • 핵심 라이브러리:
    • Buffer에 플래그 C.BUFFER_FLAG_LAST_SAMPLE가 포함되는지를 나타내는 Buffer.isLastSample()를 추가합니다.
    • '스트림 종료' 샘플을 읽지 않고 프레임이 있는 마지막 샘플이 큐에서 제거되면 마지막 프레임이 렌더링되지 않을 수 있는 문제를 수정했습니다. (#11079)
  • 추출기:
    • RTSP 및 MP4 추출기에서 이미 사용한 파싱 로직을 재사용하여 MPEG-TS 파일에서 H.265 SPS의 파싱을 수정합니다. (#303)
  • 텍스트:
    • SSA: 바이트 순서 표시로 시작되는 경우 UTF-16 파일의 지원을 추가합니다(#319).
  • 세션:
    • 작업을 업데이트하는 기존 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를 사용할 수 있어야 하는 문제를 수정했습니다.
    • 백그라운드 스레드의 MediaSession 인스턴스가 MediaSessionService에서 사용될 때 비정상 종료를 일으키는 문제를 수정했습니다. (#318)
    • 앱에서 의도하지 않았는데도 라이브러리에서 미디어 버튼 수신기를 선언하는 문제를 수정했습니다(#314).
  • DASH:
    • 빈 세그먼트 타임라인 처리를 수정했습니다(#11014).
  • RTSP:
    • UDP를 사용한 RTSP 설정이 RTSP 오류 461 UnsupportedTransport(지원되지 않는 전송)로 실패하면 TCP를 사용하여 다시 시도합니다. (#11069)

버전 1.0.0

2023년 3월 22일

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

이 버전은 ExoPlayer 2.18.5 출시에 해당합니다.

1.0.0-rc02 이후로는 변경사항이 없습니다.

버전 1.0.0-rc02

2023년 3월 2일

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

이 버전은 ExoPlayer 2.18.4 출시에 해당합니다.

  • 핵심 라이브러리:
    • API 33에서 네트워크 유형 감지를 수정했습니다. (#10970)
    • ExoPlayer.isTunnelingEnabled를 호출할 때 NullPointerException를 수정합니다. (#10977)
  • 다운로드:
    • 병합할 두 세그먼트의 시작 시간의 최대 차이를 SegmentDownloader 및 서브클래스에서 구성 가능하도록 합니다(#248).
  • 오디오:
    • 삼성 기기에서 MP3 재생 중 끊김 현상을 수정했습니다. (#8594)
    • 오디오를 사용 중지한 직후에 설정된 재생 속도가 이전 속도 변경으로 재정의될 수 있는 버그를 수정했습니다. (#10882)
  • 동영상:
    • HEVC HDR10 형식을 HEVCProfileMain10 대신 HEVCProfileMain10HDR10에 매핑합니다.
    • 60fps AVC 스트림이 지원되지 않는 것으로 표시되는 Chromecast with Google TV 및 Lenovo M10 FHD Plus의 기기 문제 해결 방법을 추가했습니다(#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)
    • 미디어 세션을 DefaultMediaNotificationProvidergetMediaButtons() 인수로 추가하고 명확성을 위해 변경 불가능한 목록을 사용합니다. (#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의 플레이어 리스너를 삭제합니다.
    • 속성 focusSkipButtonWhenAvailableImaServerSideAdInsertionMediaSource.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)
    • SimpleBitmapLoaderfile:// 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 출시에 해당합니다.

  • 핵심 라이브러리:
    • ShuffleOrderExoPlayer.setShuffleOrder로 변경하면 reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED를 통해 Player.Listener#onTimelineChanged가 호출됩니다. (#9889)
    • 점진적 미디어의 경우 선택한 트랙만 버퍼링된 위치에 포함합니다. (#10361)
    • 모든 ExoPlayer 로그 출력에 맞춤 로거를 허용합니다. (#9752)
    • 경우에 따라 작동하지 않았던 DefaultMediaSourceFactorysetDataSourceFactory 구현을 수정합니다. (#116)
  • 추출기:
    • H265 단기 참조 사진 세트의 파싱을 수정합니다. (#10316)
    • esds 상자의 비트 전송률 파싱을 수정합니다. (#10381)
  • DASH:
    • 매니페스트에서 ClearKey 라이선스 URL을 파싱합니다. (#10246)
  • UI:
    • TalkBack에서 재생 컨트롤 메뉴의 현재 활성 속도 옵션을 알려줍니다. (#10298)
  • RTSP:
    • VP8 분할 패킷 처리를 추가합니다. (#110)
  • Leanback 확장 프로그램:
    • LeanbackAdapterplayWhenReady 변경사항을 리슨합니다. (10420)
  • 전송:
    • CastTimeline에서 Window.mediaItem으로 재생목록 메서드에 전달된 MediaItem을 사용합니다. (#25, #8212)
    • CastPlayerPlayer.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.setDrmSessionManagerProviderMediaSource.Factory.setLoadErrorHandlingPolicynull을 전달하는 것을 허용하지 않습니다. 필요한 경우 DefaultDrmSessionManagerProviderDefaultLoadErrorHandlingPolicy 인스턴스를 명시적으로 전달할 수 있습니다.
    • MediaItem.RequestMetadata를 추가하여 정확한 LocalConfiguration을 알 수 없는 경우 미디어를 재생하는 데 필요한 메타데이터를 나타냅니다. 또한, MediaMetadata.mediaUrl이 이제 RequestMetadata에 포함되어 있기 때문에 이 속성을 삭제합니다.
    • Player.Command.COMMAND_SET_MEDIA_ITEM을 추가하여 플레이어가 단일 항목 설정을 허용하도록 합니다.
  • 트랙 선택:
    • TrackSelectionOverrides 클래스를 TrackSelectionParameters로 평면화하고 TrackSelectionOverride를 최상위 클래스로 승격합니다.
    • TracksInfoTracks로, TracksInfo.TrackGroupInfoTracks.Group으로 바꿉니다. Player.getCurrentTracksInfoPlayer.Listener.onTracksInfoChanged 또한 Player.getCurrentTracksPlayer.Listener.onTracksChanged로 바뀌었습니다. 여기에는 Player.Listener.onTracksChanged 메서드 이름을 '지원 중단하지 않음'이 포함되지만, 다른 매개변수 유형을 사용합니다.
    • 지원 중단된 DefaultTrackSelector.ParametersBuilder 대신 DefaultTrackSelector.Parameters.Builder를 반환하도록 DefaultTrackSelector.buildUponParametersDefaultTrackSelector.Parameters.buildUpon을 변경합니다.
    • 기본적으로 사용 설정되는 DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities를 추가합니다. 사용 설정된 경우 DefaultTrackSelector는 채널 수가 기기 출력 기능을 초과하지 않는 오디오 트랙을 선호합니다. 휴대기기에서 DefaultTrackSelector는 다중 채널 오디오 형식이 공간(Android 12L+) 오디오일 수 있거나 Dolby 서라운드 사운드 형식이 아닌 이상, 다중 채널 오디오 형식보다 스테레오/모노를 선호합니다. 또한 오디오 공간화를 지원하는 기기에서 DefaultTrackSelectorSpatializer 속성의 변경을 모니터링하고 이러한 변경이 있는 경우 새 트랙 선택을 트리거합니다. television UI 모드를 사용하는 기기는 이러한 제약 조건에서 제외되며 채널 수가 가장 많은 형식이 선호됩니다. 이 기능을 사용 설정하려면 ContextDefaultTrackSelector 인스턴스를 구성해야 합니다.
  • 동영상:
    • 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_7POINT1POINT4AudioTrack을 구성합니다. (#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 인터페이스에서 작동하도록 TrackSelectionViewTrackSelectionDialogBuilder를 다시 작성합니다. 이렇게 하면 뷰를 다른 Player 구현과 함께 사용할 수 있고 UI 모듈에서 ExoPlayer 모듈로의 종속 항목을 삭제할 수 있습니다. 브레이킹 체인지에 해당합니다.
    • PlayerView 트랙 선택기에서 강제 텍스트 트랙을 표시하지 않고 '없음'이 선택된 경우 적절한 강제 텍스트 트랙을 선택된 상태로 유지합니다. (#9432)
  • DASH:
    • DTS AudioChannelConfiguration 요소에서 채널 수를 파싱합니다. 그러면 DTS 스트림의 오디오 패스 스루가 다시 사용 설정됩니다. (#10159)
    • DashMediaSource.Factory.setCompositeSequenceableLoaderFactorynull을 전달하는 것을 허용하지 않습니다. 필요한 경우 DefaultCompositeSequenceableLoaderFactory 인스턴스를 명시적으로 전달할 수 있습니다.
  • HLS:
    • 재생목록 CODECS 속성에 오디오 코덱이 포함되어 있지 않은 경우 청크 포함 준비로 대체합니다. (#10065)
    • HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.setPlaylistParserFactory, HlsMediaSource.Factory.setPlaylistTrackerFactorynull을 전달하는 것을 허용하지 않습니다. 필요한 경우 DefaultCompositeSequenceableLoaderFactory, DefaultHlsPlaylistParserFactory 인스턴스 또는 DefaultHlsPlaylistTracker.FACTORY 참조를 명시적으로 전달할 수 있습니다.
  • 원활한 스트리밍:
    • SsMediaSource.Factory.setCompositeSequenceableLoaderFactorynull을 전달하는 것을 허용하지 않습니다. 필요한 경우 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.MediaItemFillerMediaSession.Callback.onAddMediaItems로 대체합니다.
    • MediaController가 기존 미디어 세션에 연결될 때 setMediaItems(s) 메서드를 지원합니다.
    • MediaController.setMediaUriMediaSession.Callback.onSetMediaUri를 삭제합니다. MediaController.setMediaItemMediaSession.Callback.onAddMediaItems를 사용하여 동일한 기능을 달성할 수 있습니다.
    • 레거시 MediaController 호출을 전달하여 미디어를 onSetMediaUri 대신 MediaSession.Callback.onAddMediaItems로 재생합니다.
    • MediaNotification.ProviderDefaultMediaNotificationProvider를 추가하여 알림 맞춤설정을 제공합니다.
    • 예술작품 이미지를 다운로드하기 위한 BitmapLoaderSimpleBitmapLoader를 추가합니다.
    • MediaSession.setCustomLayout()을 추가하여 기존 세션과의 하위 호환성을 제공합니다.
    • MediaSession.setSessionExtras()를 추가하여 기존 세션과의 기능 패리티를 제공합니다.
    • MediaSession.MediaSessionCallbackMediaSession.Callback으로, MediaLibrarySession.MediaLibrarySessionCallbackMediaLibrarySession.Callback으로, MediaSession.Builder.setSessionCallbacksetCallback으로 바꿉니다.
    • 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.getCurrentTrackGroupsPlayer.getCurrentTrackSelections를 삭제합니다. 대신 Player.getCurrentTracks를 사용합니다. ExoPlayer.getCurrentTrackGroupsExoPlayer.getCurrentTrackSelections를 계속 사용할 수도 있지만 이러한 메서드는 지원 중단된 상태입니다.
    • DownloadHelper DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORTDEFAULT_TRACK_SELECTOR_PARAMETERS 상수가 삭제됩니다. 가능하다면 getDefaultTrackSelectorParameters(Context)를 대신 사용하고 그렇지 않으면 DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT를 사용합니다.
    • 생성자 DefaultTrackSelector(ExoTrackSelection.Factory)가 삭제됩니다. 대신 DefaultTrackSelector(Context, ExoTrackSelection.Factory)를 사용합니다.
    • Transformer.Builder.setContext가 삭제됩니다. 대신 ContextTransformer.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.setTrackIdMediaItem.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 헤더 필드 namegenre를 각각 MediaMetadata.stationMediaMetadata.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을 금지합니다. TrackGroupTrackGroup 생성자에 id를 설정하여 언제든지 구별할 수 있습니다. 이를 통해 활성 트랙 재정의로 앱을 백그라운드로 전환한 후 재생을 다시 시작할 때 발생하는 비정상 종료가 수정됩니다. (#9718)
    • 라이브 에지와 매우 가까운 곳에서 재생되더라도 네트워크 대역폭이 충분하면 품질이 향상될 수 있도록 AdaptiveTrackSelection의 로직을 수정합니다. (#9784)
  • 동영상:
    • 필요한 경우 호환되는 H264/H265 디코더를 사용하도록 Dolby Vision의 디코더 대체 로직을 수정합니다.
  • 오디오:
    • 필요한 경우 호환되는 E-AC3 디코더를 사용하도록 Dolby Atmos(E-AC3-JOC)의 디코더 대체 로직을 수정합니다.
    • null 대신 AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES를 명시적으로 전달할 것을 요구하도록 AudioCapabilities API를 변경합니다.
    • AudioTrackBufferSizeProviderDefaultAudioSink에 삽입하여 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를 사용하는 경우 대신 playbackLooperDrmSessionManager.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 확장 프로그램:
    • CastPlayeronIsPlayingChanged를 올바르게 호출하지 못하게 하는 버그를 수정합니다. (#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#setLiveConfigurationMediaItem.LiveConfiguration.Builder#setTargetOffsetMs를 사용하고 대체 값을 제공하려면 DashMediaSource#setFallbackTargetLiveOffsetMs를 사용합니다.
    • (Simple)ExoPlayer.setThrowsWhenUsingWrongThread가 삭제됩니다. 더 이상 스레드 적용을 선택 해제할 수 없습니다.
    • ActionFileActionFileUpgradeUtil이 삭제됩니다. ActionFileUpgradeUtil을 사용하여 기존 작업 파일을 DefaultDownloadIndex에 병합하려면 ExoPlayer 2.16.1 이전 버전을 사용합니다.
    • ProgressiveMediaSource#setExtractorsFactory가 삭제됩니다. 대신 ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory) 생성자를 사용합니다.
    • ProgressiveMediaSource.Factory#setTagProgressiveMediaSource.Factory#setCustomCacheKey가 삭제됩니다. 대신 MediaItem.Builder#setTagMediaItem.Builder#setCustomCacheKey를 사용합니다.
    • DefaultRenderersFactory(Context, @ExtensionRendererMode int)DefaultRenderersFactory(Context, @ExtensionRendererMode int, long) 생성자가 삭제됩니다. 대신 DefaultRenderersFactory(Context) 생성자와 DefaultRenderersFactory#setExtensionRendererModeDefaultRenderersFactory#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 모듈로 대체됩니다. 따라서 어댑터/커넥터 클래스를 사용하지 않고도 플레이어와 미디어 세션을 직접 통합할 수 있습니다.