Media3
최근 업데이트 | 안정화 버전 | 출시 후보 버전 | 베타 버전 | 알파 버전 |
---|---|---|---|---|
2024년 7월 10일 | 1.3.1 | 1.4.0-rc01 | 1.4.0-beta01 | 1.4.0-alpha02 |
종속 항목 선언
Media3의 종속 항목을 추가하려면 프로젝트에 Google Maven 저장소를 추가해야 합니다. 자세한 내용은 Google Maven 저장소를 읽어보세요.
다음과 같이 앱 또는 모듈의 build.gradle
파일에 필요한 아티팩트의 종속 항목을 추가합니다.
Groovy
dependencies { def media3_version = "1.4.0" // For media playback using ExoPlayer implementation "androidx.media3:media3-exoplayer:$media3_version" // For DASH playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-dash:$media3_version" // For HLS playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-hls:$media3_version" // For SmoothStreaming playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version" // For RTSP playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version" // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation "androidx.media3:media3-exoplayer-midi:$media3_version" // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation "androidx.media3:media3-exoplayer-ima:$media3_version" // For loading data using the Cronet network stack implementation "androidx.media3:media3-datasource-cronet:$media3_version" // For loading data using the OkHttp network stack implementation "androidx.media3:media3-datasource-okhttp:$media3_version" // For loading data using librtmp implementation "androidx.media3:media3-datasource-rtmp:$media3_version" // For building media playback UIs 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" }
Kotlin
dependencies { val media3_version = "1.4.0" // For media playback using ExoPlayer implementation("androidx.media3:media3-exoplayer:$media3_version") // For DASH playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-dash:$media3_version") // For HLS playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-hls:$media3_version") // For SmoothStreaming playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version") // For RTSP playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version") // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation("androidx.media3:media3-exoplayer-midi:$media3_version") // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation("androidx.media3:media3-exoplayer-ima:$media3_version") // For loading data using the Cronet network stack implementation("androidx.media3:media3-datasource-cronet:$media3_version") // For loading data using the OkHttp network stack implementation("androidx.media3:media3-datasource-okhttp:$media3_version") // For loading data using librtmp implementation("androidx.media3:media3-datasource-rtmp:$media3_version") // For building media playback UIs 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") }
종속 항목에 관한 자세한 내용은 빌드 종속 항목 추가를 참고하세요.
의견
제출하신 의견은 Jetpack을 개선하는 데 도움이 됩니다. Media3 Issue Tracker를 사용하여 질문, 알려진 문제, 기능 요청에 대한 답변을 찾고 새 문제를 제출할 수 있습니다.
버전 1.4.0
버전 1.4.0-rc01
2024년 7월 10일
androidx.media3:media3-*:1.4.0-rc01
가 출시되었습니다.
버전 1.4.0-rc01에 포함된 커밋을 확인하세요.
- 공통 라이브러리:
Format.customData
를 추가하여Format
인스턴스에 대한 앱 제공 맞춤 정보를 저장합니다.
- ExoPlayer:
- 일부 오디오 포커스 불일치(예: 플레이어가 일시중지된 동안 전체 또는 일시적인 포커스 손실을 보고하지 않음)를 수정합니다. (#1436)
- 초기 준비 단계 후 추출기가 추가 트랙을 보고하여 발생할 수 있는
IndexOutOfBoundsException
를 수정합니다. (#1476) ExoPlayer.setVideoEffect()
의Effects
는 렌더기 오프셋이 삭제된 타임스탬프를 수신합니다. (#1098)- 다른 재생목록 항목을 미리 읽는 동안 발생하는 플레이어 오류를 처리할 때 발생할 수 있는
IllegalArgumentException
를 수정합니다. (#1483)
- 텍스트:
- WebVTT 자막 샘플에 신호가 없는 경우(예: DASH 스트림의 일부로)
LegacySubtitleUtil
의IllegalArgumentException
을 수정합니다. (#1516)
- WebVTT 자막 샘플에 신호가 없는 경우(예: DASH 스트림의 일부로)
- 세션:
- 전역 세션 활동을 재정의하기 위해 컨트롤러별로 세션 활동을 설정할 수 있습니다.
AcceptedResultBuilder.setSessionActivivty(PendingIntent)
로ConnectionResult
를 만들어 연결 시 컨트롤러에 세션 활동을 정의할 수 있습니다. 연결되면 세션 활동을MediaSession.setSessionActivity(ControllerInfo, PendingIntent)
로 업데이트할 수 있습니다. MediaLibrarySession.Callback
호출의 오류 복제를 개선합니다. 이제MediaLibrarySession.Builder.setLibraryErrorReplicationMode()
를 사용하여 오류 유형을 선택하거나 기본적으로 사용 설정된 오류 복제를 선택 해제하여 오류 복제를 구성할 수 있습니다.
- 전역 세션 활동을 재정의하기 위해 컨트롤러별로 세션 활동을 설정할 수 있습니다.
- UI:
- API 34의 Compose
AndroidView
내에서SurfaceView
를 사용할 때 동영상이 늘어나거나 잘리는 플랫폼 버그를 해결합니다. (#1237)
- API 34의 Compose
- 데모 앱:
- 기기에서 지원할 경우
HttpEngineDataSource
를HttpDataSource
로 사용합니다.
- 기기에서 지원할 경우
버전 1.4.0-beta01
2024년 6월 26일
androidx.media3:media3-*:1.4.0-beta01
가 출시되었습니다.
버전 1.4.0-beta01에 포함된 커밋을 확인하세요.
- ExoPlayer:
ExoPlayer.isReleased()
를 추가하여Exoplayer.release()
가 호출되었는지 확인합니다.ExoPlayer.Builder.setMaxSeekToPreviousPositionMs
를 추가하여seekToPrevious()
가 이전 항목을 탐색하는 최대 위치를 구성합니다. (#1425)
- 변환기:
ExportResult.processedInputs
필드를 삭제합니다. 코덱 세부정보에 이 필드를 사용하는 경우 대신DefaultDecoderFactory.listener
를 사용하세요. 코덱 예외의 경우 코덱 세부정보는ExportException.codecInfo
에서 확인할 수 있습니다.
- 추출기:
- AVI 컨테이너에서 PCM 오디오 형식 추출을 수정합니다.
- 이미지:
- 이전에 설정된
ImageOutput
를 삭제하려면null
를ExoPlayer.setImageOutput
의 매개변수로 허용합니다.
- 이전에 설정된
- 효과:
- 오버레이와 프레임의 동적 범위가 일치해야 하므로 사용되지 않는
OverlaySettings.useHdr
를 삭제합니다. TextOverlay
에 HDR 지원을 추가합니다. 텍스트 오버레이의 휘도는OverlaySettings.setHdrLuminanceMultiplier
로 조정할 수 있습니다.
- 오버레이와 프레임의 동적 범위가 일치해야 하므로 사용되지 않는
- 세션:
MediaSession.Callback.onPlayerInteractionFinished
를 추가하여 특정 컨트롤러의 일련의 플레이어 상호작용이 완료되면 세션에 알립니다.- 오류 코드 대신
SessionError
를 추가하고SessionResult
및LibraryResult
에서 사용하여 오류에 관한 자세한 정보와 가능한 경우 오류 해결 방법을 제공합니다. - 미디어 세션을 게시하는 앱과의 상호작용을 테스트하는 데 사용할 수 있는 media3 컨트롤러 테스트 앱의 코드를 게시합니다.
- media3의
MediaSession[Builder].setSessionExtras()
에 전달된 추가 항목을 media1 컨트롤러의PlaybackStateCompat.getExtras()
로 전파합니다. - 플랫폼 세션 간에 심각한 오류와 심각하지 않은 오류를 매핑합니다.
PlaybackException
는PlaybackStateCompat
의 치명적인 오류 상태에 매핑됩니다.MediaSession.sendError(ControllerInfo, SessionError)
를 사용하여 미디어 알림 컨트롤러에 전송된SessionError
는PlaybackStateCompat
의 치명적이지 않은 오류에 매핑됩니다. 즉, 오류 코드와 메시지가 설정되었지만 플랫폼 세션의 상태는STATE_ERROR
와 다릅니다.
- UI:
- HLS 확장 프로그램:
- 기본 재생 재생목록이 아닌 실시간 재생 중에 새로고침되지 않는 버그를 수정합니다. (#1240)
- 지원 중단된 기호 삭제:
Bundleable
인터페이스를 삭제합니다. 여기에는 모든Bundleable.Creator<Foo> CREATOR
상수 필드를 삭제하는 작업이 포함됩니다. 호출자는 대신 각 유형에서Bundle toBundle()
및static Foo fromBundle(Bundle)
메서드를 사용해야 합니다.
버전 1.4.0-alpha02
2024년 6월 7일
androidx.media3:media3-*:1.4.0-alpha02
가 출시되었습니다.
버전 1.4.0-alpha02에 포함된 커밋을 확인하세요.
- 공통 라이브러리:
- 추정된 노옵스(no-ops) 탐색 호출을 보호된
BasePlayer.seekTo
및SimpleBasePlayer.handleSeek
메서드로 무시하지 않고 전달함 맞춤 플레이어에서 이러한 메서드를 구현하는 경우mediaItemIndex == C.INDEX_UNSET
를 사용하여 이러한 추가 호출을 처리해야 할 수도 있습니다. - 향상된 Java 8 디슈가링의 컴파일 종속 항목을 삭제합니다. (#1312)
- 이미지가 아닌
MediaItem
에서는MediaItem.Builder.setImageDurationMs
에 전달된 기간이 무시되는지 확인합니다 (문서화된 내용).
- 추정된 노옵스(no-ops) 탐색 호출을 보호된
- ExoPlayer:
reset
를BasePreloadManager
에 추가하여 모든 보유 소스를 해제하고 미리 로드 관리자 인스턴스를 유지합니다.ExoPlayer.setPriority
(및Builder.setPriority
)를 추가하여PriorityTaskManager
에 사용되는 우선순위 값과 API 35의 MediaCodec 중요도를 정의합니다.- 마지막 리버퍼링 시간을 업데이트하여 CMCD에서 잘못된
bs
(버퍼 기아) 키가 발생하는 문제를 수정합니다. (#1124) PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
를 추가하여 소스가 끝까지 로드되었음을 나타냅니다. 이렇게 하면DefaultPreloadManager
및 맞춤PreloadMediaSource.PreloadControl
구현이 다음 소스를 미리 로드하거나 다른 작업을 실행할 수 있습니다.- 항목 끝에서 무음 건너뛰기가 재생 예외를 트리거할 수 있는 버그를 수정했습니다.
PreloadMediaSource
에clear
를 추가하여 미리 로드 기간을 삭제합니다.- 우선순위가 더 높은 작업을 위해 코덱 리소스가 회수될 때 사용되는 새로운 오류 코드
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED
를 추가합니다. - 초기 콘텐츠 미디어 준비가 완료되기 전에
AdsMediaSource
가 프리롤 광고를 로드하도록 합니다. (#1358) - 매니페스트에서 원래 기간이 이미 삭제된 후 다중 기간 DASH 라이브 스트림을 다시 준비할 때 재생이
STATE_ENDED
로 이동하는 버그를 수정했습니다. PreloadMediaSource.PreloadControl
에서onTimelineRefreshed
의 이름을onSourcePrepared
로,onPrepared
를onTracksSelected
로 바꿉니다. 또한DefaultPreloadManager.Stage
에서 IntDefs 이름을 적절히 변경합니다.- 동적 예약에 관한 실험용 지원을 추가하여 작업을 CPU 절전 모드 해제 주기에 더 잘 맞추고 렌더기가 진행할 수 있는 시점까지 절전 모드 해제를 지연시킵니다.
ExoPlayer 인스턴스를 설정할 때
experimentalSetDynamicSchedulingEnabled
를 사용하여 이를 사용 설정할 수 있습니다. Renderer.getDurationToProgressMs
를 추가합니다.Renderer
는 이 메서드를 구현하여 렌더기가 진행하기 위해 재생이 진행되어야 하는 시간을 ExoPlayer에 반환할 수 있습니다.ExoPlayer
가experimentalSetDynamicSchedulingEnabled
로 설정된 경우ExoPlayer
는 작업 작업을 예약하는 시간을 계산할 때 이 메서드를 호출합니다.MediaCodecRenderer
에서 입력 및 출력 버퍼를 사용할 수 있을 때 알림을 보내도록MediaCodecAdapter#OnBufferAvailableListener
를 추가합니다.MediaCodecRenderer
는 이러한 콜백을 수신할 때ExoPlayer
에 신호를 보내고ExoPlayer
가experimentalSetDynamicSchedulingEnabled
로 설정된 경우 렌더기가 진행될 수 있으므로ExoPlayer
가 작업 루프를 예약합니다.LoadControl
메서드에는 개별 매개변수 대신 데이터 클래스를 사용합니다.
- 변환기:
- PCM 입력을 처리할 때 오디오 채널 수가 스테레오로 제한되는 디코더 버그를 해결합니다.
ExoPlayerAssetLoader
에서 트랙을 선택할 때 오디오 채널 수 제약 조건은 재생에만 적용되므로 무시하세요.androidx.media3.transformer.Muxer
인터페이스를androidx.media3.muxer.Muxer
로 바꾸고androidx.media3.transformer.Muxer
를 삭제합니다.- 콘텐츠 URI 스키마에서 HEIC 이미지 로드를 수정합니다. (#1373)
AudioGraphInput
에서 오디오 트랙 길이를 조정하여 AV 동기화를 개선하세요.
- 추출기:
- MPEG-TS: 스트림의 마지막 액세스 단위를 샘플 대기열에 전달하여 마지막 프레임이 렌더링되도록 변경사항을 롤포워드합니다. (#7909) 수정사항을 통합하여 I-frame 전용 HLS 스트림(#1150)과 H.262 HLS 스트림(#1126)에서 발생한 문제를 해결합니다.
- MP3: 기본 스트림에서 보고된 크기보다
Info
프레임의 데이터 크기를 선호합니다 (예: 파일 크기 또는 HTTPContent-Length
헤더). 이렇게 하면 일정한 비트 전송률 탐색 계산에서 재생할 수 없는 트레일러 데이터 (예: 앨범 아트워크)를 제외하여 탐색의 정확도를 높일 수 있습니다. (#1376) - MP3:
Info
프레임 뒤의 프레임 비트 전송률(예:PCUT
프레임)에서 추론하는 대신Info
프레임(있는 경우)의 프레임 수 및 기타 데이터를 사용하여 고정 비트 전송률 탐색을 위한 평균 비트 전송률을 계산합니다. (#1376)
- 오디오:
- 패스 스루 재생의 DTS:X 프로필 2 인코딩 속성을 수정합니다. (#1299)
- 오프로드된 재생의 경우
AudioTrack.stop()
를 호출하기 전에DefaultAudioSink
에서 스트림 완료를 위한 추적 필드를 재설정하여 대기 중인 모든 데이터가 재생되었을 때AudioTrack.StreamEventCallback#onPresentationEnded
가 올바르게 식별되도록 합니다. - 다른 오디오 형식 간 전환 (예: 스테레오에서 모노)으로 인해 프로세서에서 예외가 발생할 수 있는
SilenceSkippingAudioProcessor
의 버그를 수정했습니다. (#1352) - ExoPlayer가 MediaCodecAudioRenderer가 진행할 수 있는 시점에 맞춰 기본 작업 루프를 동적으로 예약하도록
MediaCodecAudioRenderer.getDurationToProgressUs
를 구현합니다.
- 동영상:
- 필요한 경우 호환되는 AV1 디코더를 사용하도록 Dolby Vision의 디코더 대체 로직을 수정합니다. (#1389)
- 텍스트:
- 탐색 위치를 건너뛰기 전에 자막이 시작되는 문제를 수정했습니다. 이 문제는 Media3 1.4.0-alpha01에서만 발생했습니다.
- 렌더링 중이 아닌 추출 중에 발생하도록 기본 자막 파싱 동작을 변경합니다 (추출과 렌더링의 차이점은 ExoPlayer의 아키텍처 다이어그램 참고).
- 이 변경사항은
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)
및TextRenderer.experimentalSetLegacyDecodingEnabled(true)
를 모두 호출하여 재정의할 수 있습니다. 이러한 구성요소를ExoPlayer
인스턴스로 연결하는 방법은 맞춤설정 문서를 참고하세요. 이러한 메서드 (및 기존 자막 디코딩에 관한 모든 지원)는 향후 버전에서 삭제될 예정입니다. - 맞춤
SubtitleDecoder
구현이 있는 앱은 대신SubtitleParser
(및SubtitleDecoderFactory
대신SubtitleParser.Factory
)를 구현하도록 업데이트해야 합니다.
- 이 변경사항은
- PGS: 런 렝스 디코딩을 수정하여
0
를 리터럴 색상 값 대신 색상 색인으로 확인합니다. (#1367) - CEA-708:
rowLock
값을 무시합니다. CEA-708-E S-2023 사양에서는 스트림에 있는 값과 관계없이rowLock
및columnLock
가 모두 true인 것으로 가정해야 한다고 명시합니다 (columnLock
지원이 구현되지 않으므로 항상 false인 것으로 사실상 가정됨).- 이는 원래
1.3.0-alpha01
출시 노트에 포함되어 있었지만 실수로1.3.0-rc01
출시 전에 변경사항을 되돌렸습니다. 이 문제는 이제 수정되었으므로 변경사항이 다시 표시됩니다.
- 이는 원래
- CEA-708: ExoPlayer의 '펜 위치 설정' 명령어의 기본 처리로 인해 중복된 줄바꿈이 추가되지 않도록 합니다. (#1315)
- 메타데이터:
- 이미지:
- 정사각형이 아닌 DASH 썸네일 그리드 지원을 추가합니다. (#1300)
- API 34 이상의 AVIF 지원을 추가합니다.
- 데이터 소스:
- 생성 시 하드 코딩되는 대신
ByteArrayDataSource
가open()
중에 URI를 바이트 배열로 확인하도록 허용합니다. (#1405)
- 생성 시 하드 코딩되는 대신
- DRM:
DefaultDrmSessionManagerProvider
에서LoadErrorHandlingPolicy
설정을 허용합니다. (#1271)
- 효과:
TimestampWrapper
가ExoPlayer#setVideoEffects
와 함께 사용될 때 비정상 종료되는 버그를 수정했습니다. (#821)- 기본 SDR 색상 작업 공간을 선형 색상에서 전기 BT 709 SDR 동영상으로 변경합니다. 원래 색공간을 유지하는 세 번째 옵션도 제공합니다.
- EditedMediaItemSequences의 미확정 z 순서를 정의하도록 허용합니다. (#1055)
- 여러 HDR 콘텐츠에서 일관된 휘도 범위를 유지합니다 (HLG 범위 사용).
- HDR 콘텐츠에 울트라 HDR (비트맵) 오버레이 지원을 추가합니다.
- API 26 이전에
SeparableConvolution
효과를 사용하도록 허용합니다.
- IMA 확장 프로그램:
- 앱에서 DAI 광고 스트림을 재생하는 데 필요한 API를 안정화 버전으로 승격합니다.
- 런타임 시 광고 태그 매개변수를
교체할 수 있도록
replaceAdTagParameters(Map <String, String>)
를ImaServerSideAdInsertionMediaSource.AdLoader
에 추가합니다. - 광고 재생 중에 플레이어 오류가 발생할 때
VideoAdPlayer.VideoAdPlayerCallback.onError
가 호출되지 않는 버그를 수정했습니다. (#1334) data://
광고 태그 URI를 사용할 때NullPointerException
를 수정하려면 IMA SDK 버전을 3.33.0으로 올립니다. (#700)
- 세션:
- 플랫폼 세션 메타데이터에 기간을 설정하지 않음으로써 라이브 스트림의 미디어 알림에서 탐색 막대를 숨깁니다. (#1256)
- media1과 메타데이터 속성을 선택할 때 동일한 기본 순서와 로직을 사용하도록
MediaMetadata
의 변환을MediaDescriptionCompat
로 정렬합니다. - 심각하지 않은 오류를 Media3 컨트롤러에 전송할 수 있는
MediaSession.sendError()
를 추가했습니다. 알림 컨트롤러 (MediaSession.getMediaNotificationControllerInfo()
참고)를 사용할 때 커스텀 오류는 플랫폼 세션의PlaybackState
를 지정된 오류 정보와 함께 오류 상태로 업데이트하는 데 사용됩니다. (#543)
- Cronet 확장 프로그램:
CronetDataSource
의SocketTimeoutException
를 수정합니다. 일부 Cronet 버전에서는 콜백으로 제공되는 요청이 항상 동일하지는 않습니다. 이로 인해 콜백이 완료되지 않고 시간이 초과됩니다(https://issuetracker.google.com/328442628).
- HLS 확장 프로그램:
- DASH 확장 프로그램:
- Cast 확장 프로그램:
MediaQueueItem
의 앨범 제목을 Media3 미디어 항목에서 아티스트로 변환하는 버그를 수정했습니다. (#1255)
- 데모 앱:
- 명령줄에서
Intent
인수를 사용하여 반복 모드 설정을 허용합니다. (#1266)
- 명령줄에서
- 지원 중단된 기호 삭제:
DefaultHttpDataSource
,OkHttpDataSource
,CronetDataSource
에서setContentTypePredicate(Predicate)
메서드를 삭제합니다. 대신 각XXXDataSource.Factory
에 상응하는 메서드를 사용하세요.OkHttpDataSource
생성자 및OkHttpDataSourceFactory
를 삭제합니다. 대신OkHttpDataSource.Factory
를 사용하세요.PlayerMessage.setHandler(Handler)
를 삭제했습니다. 대신setLooper(Looper)
를 사용하세요.Timeline.Window.isLive
필드를 삭제합니다. 대신isLive()
메서드를 사용하세요.DefaultHttpDataSource
생성자를 삭제합니다. 대신DefaultHttpDataSource.Factory
를 사용합니다.DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS
가 삭제됩니다. 대신DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS
를 사용합니다.MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)
를 삭제했습니다. 대신MediaCodecInfo.canReuseCodec(Format, Format)
를 사용합니다.DrmSessionManager.DUMMY
및getDummyDrmSessionManager()
메서드를 삭제합니다. 대신DrmSessionManager.DRM_UNSUPPORTED
를 사용하세요.AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)
,AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)
,AudioRendererEventListener.onAudioInputFormatChanged(Format)
,VideoRendererEventListener.onVideoInputFormatChanged(Format)
가 삭제됩니다. 대신DecoderReuseEvaluation
를 사용하는 오버로드를 사용하세요.RendererSupport.FormatSupport
IntDef 및FORMAT_HANDLED
,FORMAT_EXCEEDS_CAPABILITIES
,FORMAT_UNSUPPORTED_DRM
,FORMAT_UNSUPPORTED_SUBTYPE
,FORMAT_UNSUPPORTED_TYPE
상수를 삭제합니다. 대신androidx.media3.common.C
에서 동등한 IntDef 및 상수를 사용하세요 (예:C.FORMAT_HANDLED
).
버전 1.4.0-alpha01
2024년 4월 17일
androidx.media3:media3-*:1.4.0-alpha01
가 출시되었습니다.
버전 1.4.0-alpha01에 포함된 커밋을 확인하세요.
- ExoPlayer:
rankingData
에서 정의된 우선순위에 따라 여러 소스의 미리 로드를 조정하는BasePreloadManager
를 추가합니다. 이 클래스를 확장하여 맞춤설정할 수 있습니다.PreloadMediaSource
를 사용하여 소스의 미디어 샘플을 메모리에 미리 로드하고 UI에서 항목의 색인을 나타내는 정수rankingData
를 사용하는DefaultPreloadManager
를 추가합니다.LoadControl
구현이 여러 플레이어를 지원할 수 있도록LoadControl
의 메서드에PlayerId
를 추가합니다.Buffer.isDecodeOnly()
및C.BUFFER_FLAG_DECODE_ONLY
이 삭제됩니다. 렌더러와 디코더가 타임스탬프를 기반으로 버퍼를 건너뛰도록 결정하므로 이 플래그를 설정할 필요가 없습니다. 맞춤Renderer
구현은 버퍼 시간이BaseRenderer.getLastResetPositionUs()
이상인지 확인하여 샘플을 표시해야 하는지 결정해야 합니다. 맞춤SimpleDecoder
구현은 필요한 경우isAtLeastOutputStartTimeUs
를 확인하거나 다른 버퍼를DecoderOutputBuffer.shouldBeSkipped
로 표시하여 해당 버퍼를 건너뛸 수 있습니다.- 지정된
rankingData
로MediaSource
를 미리 로드하지 않도록 나타내기 위해TargetPreloadStatusControl.getTargetPreloadStatus(T)
에서 null 값을 반환하도록 허용합니다. remove(MediaSource)
를BasePreloadManager
에 추가합니다.
- 변환기:
- 출력 파일의 각 트랙이 어떻게 만들어졌는지 나타내는
audioConversionProcess
및videoConversionProcess
를ExportResult
에 추가합니다. - 트림 최적화 H.264 수준 검사를 완화합니다.
- 시퀀스에서 SDR과 HDR 입력 미디어 간 변경 지원을 추가합니다.
- 컴포지션 수준 오디오 효과 지원을 추가합니다.
- 울트라 HDR 이미지를 HDR 동영상으로 트랜스코딩하기 위한 지원을 추가합니다.
DefaultAudioMixer
가 재설정 및 재사용된 후 올바른 바이트 수를 출력하지 않는 문제를 수정했습니다.
- 출력 파일의 각 트랙이 어떻게 만들어졌는지 나타내는
- 동영상:
- 재생 중에 노출 영역을 전환할 때
Listener.onRenderedFirstFrame()
가 너무 일찍 도착하는 문제를 수정했습니다.
- 재생 중에 노출 영역을 전환할 때
- 데이터 소스:
package
가 현재 애플리케이션의 패키지와 다른android.resource://package/id
원시 리소스 URI 지원을 구현합니다. 이 방법은 이전에는 작동하도록 문서화되지 않았지만 이름을 사용하는 것보다 다른 패키지의 리소스에 액세스하는 더 효율적인 방법입니다.DataSpec
생성자에서url
가 null이 아닌지 적극적으로 확인합니다. 이 매개변수는 이미 null이 아닌 것으로 주석 처리되었습니다.
- 효과:
SpeedChangeEffect
의 동일한EditedMediaItem
또는Composition
내에서 여러 속도 변경을 지원합니다.- 울트라 HDR 비트맵 입력의 HLG 및 PQ 출력을 지원합니다.
- ExoPlayer.setVideoEffect 및 Transformer의 디버그 SurfaceView의 HLG 노출 영역 출력을 개선하는 EGL_GL_COLORSPACE_BT2020_HLG_EXT 지원을 추가합니다.
setOverlayFrameAnchor()
에 적용된 x 및 y 값을 뒤집어 문서와 일치하도록 오버레이 매트릭스 구현을 업데이트합니다.OverlaySettings.Builder.setOverlayFrameAnchor()
를 사용하는 경우 x 및 y 값에-1
을 곱하여 반전시킵니다.
- 세션:
- 기본값
CommandButton.enabled
를true
로 변경하고 연결된 명령어를 사용할 수 있는 경우에도 컨트롤러의 값이 false로 유지될 수 있도록 합니다. - 맞춤 아이콘 리소스 대신 사용해야 하는
CommandButton
용 아이콘 상수를 추가합니다. - 앱이
onTaskRemoved()
에서 서비스를 중지해야 하는지 여부를 쿼리할 수 있도록MediaSessionService.isPlaybackOngoing()
를 추가합니다. (#1219) - 모든 세션의 재생을 편리하게 일시중지하고
stopSelf
를 호출하여MediaSessionService
의 수명 주기를 종료할 수 있는MediaSessionService.pauseAllPlayersAndStopSelf()
를 추가합니다. MediaSessionService.onTaskRemoved(Intent)
를 재정의하여 재생이 진행 중인 경우 서비스를 포그라운드에서 계속 실행하고 그렇지 않으면 서비스를 중지하는 안전한 기본 구현을 제공합니다.
- 기본값
- 다운로드:
DownloadHelper
에서 출시되지 않은Renderer
인스턴스를 누출하지 않는지 확인합니다. 유출되면 결국IllegalStateException: Too many receivers, total of 1000, registered for pid
와 함께 앱이 비정상 종료될 수 있습니다. (#1224)
- 테스트 유틸리티:
FakeRenderer
에onInit()
및onRelease()
를 구현합니다.- 심각하지 않은 오류 (예:
AnalyticsListener.onVideoCodecError
에 보고된 오류)가 발생하면TestPlayerRunHelper.runUntil/playUntil
메서드가 실패하도록TestPlayerRunHelper.runUntil/playUntil
메서드를 변경합니다. 새로운TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()
메서드 체인을 사용하여 이 동작을 사용 중지합니다.
- 데모 앱:
- 짧은 형식의 데모 앱에서
DefaultPreloadManager
를 사용합니다.
- 짧은 형식의 데모 앱에서
- 지원 중단된 기호 삭제:
CronetDataSourceFactory
를 삭제합니다. 대신CronetDataSource.Factory
를 사용하세요.- 일부
DataSpec
생성자를 삭제합니다. 대신DataSpec.Builder
를 사용합니다.
버전 1.3.0
버전 1.3.1
2024년 4월 11일
androidx.media3:media3-*:1.3.1
가 출시되었습니다.
버전 1.3.1에 포함된 커밋을 확인하세요.
- 공통 라이브러리:
- 현지화된 라벨 또는 다른 대체 라벨을 허용하려면
Format.labels
를 추가합니다.
- 현지화된 라벨 또는 다른 대체 라벨을 허용하려면
- ExoPlayer:
- 변환기:
- API 30 이전의 부정적인 프레젠테이션 타임스탬프를 지원하지 않는
MediaMuxer
로 인해 발생한 예외에 대한 해결 방법이 추가되었습니다.
- API 30 이전의 부정적인 프레젠테이션 타임스탬프를 지원하지 않는
- 트랙 선택:
DefaultTrackSelector
: 프레임 속도가 낮거나 설정되지 않은 동영상 트랙보다 '적절한' 프레임 속도 (>=10fps)의 동영상 트랙을 선호합니다. 이렇게 하면 플레이어가 모션 사진에서 추출된 MP4의 '실제' 동영상 트랙을 선택할 수 있습니다. 이러한 트랙에는 해상도는 높지만 프레임 수는 매우 적은 HEVC 트랙 두 개를 포함할 수 있습니다(#1051).
- 추출기:
- 오디오:
- 오디오 트랙이 오프로드 모드에서 초기화되지 않는 경우 오프로드를 사용 중지하여 렌더기 복구를 허용합니다.
- 동영상:
- 텍스트:
- WebVTT: 직접 연속 신호가
WebvttParser.parse
에서 가짜CuesWithTiming
인스턴스를 만들지 못하게 합니다. (#1177)
- WebVTT: 직접 연속 신호가
- DRM:
- 일부 Android 14 기기에서
ResourceBusyException
또는NotProvisionedException
대신MediaDrm
프레임워크에서 발생할 수 있는NoSuchMethodError
을 해결합니다. (#1145)
- 일부 Android 14 기기에서
- 효과:
- 색상 공간을 변환하여 PQ에서 SDR로 톤 매핑이 개선되었습니다.
- 세션:
- UI:
Locale
가 표시 이름을 식별할 수 없는 경우 오디오 트랙 언어 이름을 포함합니다. (#988)
- DASH 확장 프로그램:
- 매니페스트의 모든
Label
요소를Format.labels
에 채웁니다. (#1054)
- 매니페스트의 모든
- RTSP 확장 프로그램:
- SDP 파싱에서 빈 세션 정보 값 (i-tag)을 건너뜁니다. (#1087)
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1, MIDI 등):
- 추가 Maven 저장소를 구성해야 하므로 기본적으로 MIDI 확장 프로그램을 로컬 종속 항목으로 사용 중지합니다. 로컬 종속 항목의 이 모듈이 필요한 사용자는 다시 사용 설정할 수 있습니다.
버전 1.3.0
2024년 3월 6일
androidx.media3:media3-*:1.3.0
가 출시되었습니다.
버전 1.3.0에 포함된 커밋을 확인하세요.
- 공통 라이브러리:
package
가 현재 애플리케이션의 패키지와 다른android.resource://package/[type/]name
원시 리소스 URI 지원을 구현합니다. 이는 항상 작동하도록 문서화되어 왔지만 지금까지는 올바르게 구현되지 않았습니다.- 앱 코드로 설정되거나 미디어에서 읽는 MIME 유형을 완전히 소문자로 정규화합니다.
AdPlaybackState
에서 단일Uri
대신 전체MediaItem
를 사용하여 광고를 정의합니다.minSdk
을 19 (Android KitKat)로 높입니다. 이는 다른 모든 AndroidX 라이브러리와 일치하며 최신 버전의 AndroidX 종속 항목으로 업그레이드하는 데 필요합니다.artworkUri
및artworkData
중 하나 이상이 null이 아니면MediaMetadata.Builder.populate(MediaMetadata)
에서 모두 채웁니다 (#964).
- ExoPlayer:
- 앱이 재생 전에 특정 시작 위치에서 콘텐츠 미디어 소스를 미리 로드할 수 있도록
PreloadMediaSource
및PreloadMediaPeriod
를 추가합니다.PreloadMediaSource
는 콘텐츠 미디어 소스가Timeline
를 수신하도록 준비하고, 지정된 시작 위치에서 기간을 준비 및 캐시하고, 트랙을 선택하며, 해당 기간의 미디어 데이터를 로드합니다. 앱은PreloadMediaSource.PreloadControl
를 구현하여 미리 로드 진행률을 제어하고 미리 로드된 소스를 재생을 위해 플레이어로 설정합니다. - 앱이
ImageRenderer.ImageOutput
를 설정하도록 허용하는ExoPlayer.setImageOutput
를 추가합니다. - 이제
DefaultRenderersFactory
가 기본적으로 nullImageOutput
및ImageDecoder.Factory.DEFAULT
로 플레이어에ImageRenderer
를 제공합니다. - 무음을 건너뛰면
Player.Listener.onPositionDiscontinuity
이벤트를 내보냅니다. (#765) - 추출 중에 자막 파싱을 위한 실험용 지원을 추가합니다.
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
를 사용하여 이를 사용 설정할 수 있습니다. PreloadMediaSource
로 적응형 미디어 소스를 지원합니다.- HttpEngine API를 사용하여
HttpDataSource
인HttpEngineDataSource
를 구현합니다. CompositeSequenceableLoader
의 서브클래스화를 방지합니다. 이 구성요소는 이전에 확장 가능해졌지만 라이브러리 내에서 서브클래스로 분류되지는 않았습니다. 맞춤설정은 데코레이터 패턴을 사용하여 인스턴스를 래핑하고 맞춤CompositeSequenceableLoaderFactory
를 구현하여 실행할 수 있습니다.- 같은 시간을 반복하면 이 항목의 메타데이터가 삭제되는 문제를 수정했습니다. (#1007)
BundledChunkExtractor.Factory
및DefaultHlsExtractorFactory
의experimentalSetSubtitleParserFactory
메서드 이름을setSubtitleParserFactory
로 바꾸고null
전달을 허용하지 않습니다. 새로운experimentalParseSubtitlesDuringExtraction(boolean)
메서드를 사용하여 파싱 동작을 제어합니다.- 추출 중 사용되는
SubtitleParser.Factory
의 맞춤설정을 위한 지원을 추가합니다. 이렇게 하려면MediaSource.Factory.setSubtitleParserFactory()
를 사용하면 됩니다. MergingMediaSource
에서 생성된 모든Format.id
필드에 소스 프리픽스를 추가합니다. 이렇게 하면Format
를 생성한 소스를 식별하는 데 도움이 됩니다. (#883)- 맞춤 CMCD (Common Media Client Data) 키 이름의 유효성을 검사하는 데 사용되는 정규식을 하이픈만 확인하도록 수정하여 수정합니다. (#1028)
- CMCD 쿼리 매개변수의 이중 인코딩을 중지합니다. (#1075)
- 앱이 재생 전에 특정 시작 위치에서 콘텐츠 미디어 소스를 미리 로드할 수 있도록
- 변환기:
- H.265/HEVC SEF 슬로 모션 동영상 평면화 지원 추가
- 특히 '동영상 삭제' 편집 시 변환 속도를 높입니다.
- 출력 파일이 동영상 프레임에서 시작되도록 하는 API를 추가합니다. 이렇게 하면 프레젠테이션 타임스탬프까지 첫 번째 동영상 프레임을 표시하지 않는 플레이어 구현과 자르기 작업의 출력이 더 잘 호환됩니다. (#829)
- 단일 애셋 MP4 트림 작업 최적화 지원을 추가합니다.
- 동영상 프레임의 출력 파일의 첫 번째 타임스탬프가 있도록 하는 지원을 추가합니다. iOS 기반 플레이어에서 검은색 프레임으로 시작되는 출력 파일을 수정합니다. (#829)
- 트랙 선택:
DefaultTrackSelector.selectImageTrack
를 추가하여 이미지 트랙 선택을 사용 설정합니다.TrackSelectionParameters.isPrioritizeImageOverVideoEnabled
를 추가하여 이미지 트랙과 동영상 트랙을 모두 사용할 수 있는 경우 이미지 트랙을 선택할지 결정합니다. 기본값은false
이며 동영상 트랙 선택에 우선순위가 지정됩니다.
- 추출기:
- MP4 추출기에 AV1C 파싱을 추가하여
ColorInfo.colorSpace
,ColorInfo.colorTransfer
,ColorInfo.colorRange
값을 검색합니다. (#692) - MP3:
Info
헤더 (Xing
헤더에 상응하는 CBR)가 있는 파일에 고정 비트 전송률(CBR)을 사용합니다. 이전에는Info
헤더의 탐색 테이블을 사용했지만 이 테이블을 무시하고 CBR이라고 가정하는 경우보다 탐색의 정확도가 떨어집니다. - MPEG2-TS: DTS, DTS-LBR 및 DTS:X Profile2 지원을 추가합니다. (#275)
- TS 설명어에서 오디오 유형을 추출하고 역할 플래그에 매핑하면 사용자가 충분한 정보를 바탕으로 오디오 트랙을 선택할 수 있습니다. (#973)
- MP4 추출기에 AV1C 파싱을 추가하여
- 오디오:
- 동영상:
VideoFrameProcessor.Factory
인수를 사용하는MediaCodecVideoRenderer
생성자를 변경하고VideoSinkProvider
인수를 사용하는 생성자로 바꿉니다. 맞춤VideoFrameProcessor.Factory
를 삽입하려는 앱은 맞춤VideoFrameProcessor.Factory
를 사용하는CompositingVideoSinkProvider
를 인스턴스화하고 동영상 싱크 제공자를MediaCodecVideoRenderer
에 전달할 수 있습니다.
- 텍스트:
DefaultExtractorsFactory.setTextTrackTranscodingEnabled
를 사용할 때Tried to marshall a Parcel that contained Binder objects
오류를 해결하기 위해 비트맵 신호의 직렬화를 수정합니다. (#836)- CEA-708:
rowLock
값을 무시합니다. CEA-708-E S-2023 사양에서는 스트림에 있는 값과 관계없이rowLock
및columnLock
가 모두 true인 것으로 가정해야 한다고 명시합니다 (columnLock
지원이 구현되지 않으므로 항상 false인 것으로 사실상 가정됨).
- 이미지:
- DASH 썸네일 지원을 추가합니다. 그리드 이미지가 잘리고 표시 시간에 근접하여
ImageOutput
에 개별 썸네일이 제공됩니다.
- DASH 썸네일 지원을 추가합니다. 그리드 이미지가 잘리고 표시 시간에 근접하여
- DRM:
- 나중에 암호화된 샘플의 키가 아직 준비되지 않은 경우에도 기본적으로 DRM 콘텐츠의 암호화되지 않은 '명확한 리드' 샘플을 즉시 재생합니다. 이로 인해 재생 위치가 암호화된 샘플에 도달할 때 키가 여전히 준비되지 않은 경우 중간 재생이 중단될 수 있습니다. 하지만 이전에는 재생이 이 시점에서 전혀 시작되지 않았을 수 있습니다. 이 동작은
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey
또는DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
를 사용하여 사용 중지할 수 있습니다.
- 나중에 암호화된 샘플의 키가 아직 준비되지 않은 경우에도 기본적으로 DRM 콘텐츠의 암호화되지 않은 '명확한 리드' 샘플을 즉시 재생합니다. 이로 인해 재생 위치가 암호화된 샘플에 도달할 때 키가 여전히 준비되지 않은 경우 중간 재생이 중단될 수 있습니다. 하지만 이전에는 재생이 이 시점에서 전혀 시작되지 않았을 수 있습니다. 이 동작은
- IMA 확장 프로그램:
- 적절한 파일 확장자가 없는 DASH 및 HLS 광고를 재생할 수 없는 문제를 수정했습니다.
- 세션:
- TV 앱의 더블클릭 감지를 사용 중지합니다. (#962)
- null이 아닌 추가 항목만 있는
MediaItem.RequestMetadata
가 미디어 컨트롤러와 세션 간에 전송되지 않는 문제를 수정했습니다. MediaLibraryService
대신Context
만 사용하는 생성자를MediaLibrarySession.Builder
에 추가합니다.
- HLS 확장 프로그램:
HlsMediaPeriod
를 패키지 비공개 공개 상태로 줄입니다. 이 유형은 HLS 패키지 외부에서 직접 종속되면 안 됩니다.- Resolve는 세그먼트의 시작 부분을 더 효율적으로 탐색합니다. (#1031)
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1, MIDI 등):
- MIDI 디코더: SysEx 이벤트 메시지를 무시합니다. (#710)
- 테스트 유틸리티:
TestPlayerRunHelper.playUntilPosition
에서 재생을 일시중지하지 않습니다. 테스트는 재생을 재생 상태로 유지하지만 테스트가 어설션과 추가 작업을 추가할 수 있을 때까지 진행을 정지합니다.
- 데모 앱:
- 짧은 형식의 콘텐츠 사용 사례와 함께
PreloadMediaSource
사용을 시연하는 짧은 데모 모듈을 추가합니다.
- 짧은 형식의 콘텐츠 사용 사례와 함께
버전 1.3.0-rc01
2024년 2월 22일
1.3.0 안정화 버전을 사용합니다.
버전 1.3.0-beta01
2024년 2월 7일
1.3.0 안정화 버전을 사용합니다.
버전 1.3.0-alpha01
2024년 1월 15일
1.3.0 안정화 버전을 사용합니다.
버전 1.2.0
버전 1.2.1
2024년 1월 9일
- ExoPlayer:
LiveConfiguration.min/maxOffset
범위를 벗어나는 수동 탐색이 오프셋을 계속min/maxOffset
로 다시 조정하는 문제를 수정했습니다.- 3, 5, 6, 7, 8채널에서 OPUS 및 VORBIS 채널 레이아웃이 잘못된 문제를 수정했습니다. (#8396)
- 라이브 스트림에서 탐색 후 트랙 선택이 0으로 지정되면 스트림이 기본 위치에서 잘못 시작되는 문제를 수정했습니다. (#9347)
CmcdData.Factory
의 새 인스턴스가 청크 소스에서bufferedDurationUs
의 음수 값을 수신하여IllegalArgumentException
이 되는 문제를 수정합니다. (#888)
- 변환기:
- 높은 작동 속도 설정으로 인해 구성 시점에 인코더가 발생하는 문제를 해결합니다.
- 추출기:
- 오디오:
- 여러 번 호출될 때
SilenceSkippingAudioProcessor
의 EOS 처리를 수정합니다. (#712)
- 여러 번 호출될 때
- 동영상:
- Galaxy Tab S7 FE, Chromecast with Google TV, Lenovo M10 FHD Plus에서 60fps AVC 스트림이 지원되지 않는 것으로 표시되는 기기 문제의 해결 방법을 추가합니다. (#693)
- 메타데이터:
MediaMetadata
가 Vorbis 주석에서만 대문자로 채워지는 버그를 수정했습니다. (#876)- 매우 큰 ID3 프레임을 파싱할 때
OutOfMemoryError
를 포착합니다. 즉, 재생이 완전히 실패하는 대신 태그 정보 없이도 재생을 계속할 수 있습니다.
- DRM:
- 가짜 ClearKey
https://default.url
라이선스 URL의 해결 방법을 API 33 이상으로 확장합니다 (이전에는 해결 방법이 API 33에만 정확히 적용됨). (#837) - 플레이어에 연결된 노출 영역이 없는 암호화된 콘텐츠로 전환할 때 발생하는
ERROR_DRM_SESSION_NOT_OPENED
을 수정합니다. 이 오류는 보안 디코더를 잘못 사용하여 선명한 콘텐츠를 재생했기 때문에 발생했습니다.
- 가짜 ClearKey
- 세션:
- 커스텀 키와 값을
MediaMetadataCompat
에MediaMetadata.extras
에,MediaMetadata.extras
를MediaMetadataCompat
에 배치합니다. (#756, #802) - 기존 컨트롤러의
notifyChildrenChanged
브로드캐스팅을 수정합니다. (#644) - 알림의 사용 중지된
setWhen
타이머에 음수 시간을 설정하면 일부 기기에서 비정상 종료가 발생하는 버그를 수정했습니다. (#903) - 첫 번째 알림 업데이트가 요청되었을 때 미디어 알림 컨트롤러의 연결이 완료되지 않았을 때 발생하는
IllegalStateException
을 수정합니다. (#917)
- 커스텀 키와 값을
- UI:
- DASH 확장 프로그램:
- DASH 매니페스트에서 'f800'을 Dolby의 채널 수 5로 파싱합니다. (#688)
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1, MIDI 등):
- Cast 확장 프로그램:
- 전송 기기에서 미디어 로드에 실패할 때 앱이 비정상 종료되지 않도록
Timeline
생성을 정리합니다. (#708)
- 전송 기기에서 미디어 로드에 실패할 때 앱이 비정상 종료되지 않도록
버전 1.2.0
2023년 11월 15일
- 공통 라이브러리:
@Nullable Throwable
매개변수를Log.Logger
인터페이스의 메서드에 추가합니다. 이러한 메서드의message
매개변수에는 더 이상Log.{d,i,w,e}()
메서드에 전달된Throwable
에 관한 정보가 포함되지 않으므로 원하는 경우 구현에서 이 정보를 수동으로 추가해야 합니다 (Logger.appendThrowableString(String, Throwable)
사용 가능).- null을 허용하는 일반 유형 매개변수와 null을 허용하는 배열 요소 유형이 null을 허용하는 것으로 감지되지 않는 Kotlin 호환성 문제를 수정했습니다. 예를 들어
TrackSelectorResult
및SimpleDecoder
메서드 매개변수가 있습니다. (#6792) - 재생이 일시적으로 억제되는 동안 (예: 일시적인 오디오 포커스 손실로 인해) '재생' 버튼을 표시하도록
Util.shouldShowPlayButton
의 기본 UI 및 알림 동작을 변경합니다. 기존 동작은PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)
또는MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)
를 사용하여 유지할 수 있습니다. (#11213) - 문제를 해결하려면
androidx.annotation:annotation-experimental
를1.3.1
로 업그레이드하세요.https://issuetracker.google.com/251172715 ExoPlayer.setAudioAttributes
를Player
인터페이스로 이동합니다.
- ExoPlayer:
- 디코딩 전용 샘플을 올바르게 식별하지 못해 발생하는 AC4 스트림의 탐색 문제를 수정합니다. (#11000)
- 이 기능이
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput
를 통해 사용 설정될 때 부적절한 오디오 출력 기기 (예: Wear OS 기기의 내장 스피커)에서 재생 억제를 추가합니다. 적절한 오디오 출력을 사용할 수 없을 때 재생을 시도하거나 재생 중에 모든 적합한 출력이 연결 해제되면 재생 억제 이유가Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
로 업데이트됩니다. 적절한 출력이 연결되면 억제 이유가 삭제됩니다. MediaSource.canUpdateMediaItem
및MediaSource.updateMediaItem
를 추가하여Player.replaceMediaItem(s)
를 통해 생성된 후MediaItem
업데이트를 수락합니다.- 라이브러리에서
Player.replaceMediaItem(s)
를 통해 제공하는 모든MediaSource
클래스의MediaItem
업데이트를 허용합니다. (#33, #9978) MimeTypes.TEXT_EXOPLAYER_CUES
의 이름을MimeTypes.APPLICATION_MEDIA3_CUES
로 바꿉니다.- 전체 PNG 파일을
TrackOutput
에 샘플 하나로 전송하고 읽는PngExtractor
를 추가합니다. SequenceableLoader
인터페이스의SequenceableLoader.continueLoading(long)
메서드를SequenceableLoader.continueLoading(LoadingInfo loadingInfo)
로 향상합니다.LoadingInfo
에는 기존playbackPositionUs
외에playbackSpeed
및lastRebufferRealtimeMs
를 비롯한 추가 매개변수가 포함되어 있습니다.ChunkSource
인터페이스의ChunkSource.getNextChunk(long, long, List, ChunkHolder)
메서드를ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
로 향상합니다.- 일반 미디어 클라이언트 데이터 (CMCD) 로깅에 버퍼 부족 (
bs
), 기한 (dl
), 재생 속도 (pr
), 시작(su
)과 같은 필드를 추가합니다(#8699). - 루마 및 크로마 비트 심도를
ColorInfo
에 추가합니다. (#491) - 일반 미디어 클라이언트 데이터 (CMCD) 로깅에 다음 객체 요청 (
nor
) 및 다음 범위 요청 (nrr
) 필드를 추가합니다. (#8699) - 쿼리 매개변수를 사용하여 일반 미디어 클라이언트 데이터 (CMCD) 데이터를 전송하는 기능을 추가합니다. (#553)
ExperimentalBandwidthMeter
의ConcurrentModificationException
를 수정합니다. (#612)CompositeMediaSource.getMediaTimeForChildMediaTime
에MediaPeriodId
매개변수를 추가합니다.ConcatenatingMediaSource2
에서ClippingMediaSource
및 기간/기간 오프셋이 있는 기타 소스를 지원합니다. (#11226)MediaPeriodId
인수도 수신하도록BaseRenderer.onStreamChanged()
를 변경합니다.
- 변환기:
- 이미지 입력의 EXIF 회전 데이터를 파싱합니다.
TransformationRequest.HdrMode
주석 유형과 관련 상수를 삭제합니다. 대신Composition.HdrMode
및 관련 상수를 사용하세요.OverlaySettings
를 단순화하여 회전 문제를 해결합니다.SampleConsumer.queueInputBitmap
의frameRate
및durationUs
매개변수를TimestampIterator
로 변경했습니다.
- 트랙 선택:
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness
를 추가하여 원활하지 않은 적응을 명시적으로 허용하거나 허용하지 않습니다. 기본값은 현재 동작인true
를 유지합니다.
- 추출기:
- MPEG-TS: 스트림의 마지막 액세스 단위를 샘플 큐에 전달하여 마지막 프레임이 렌더링되도록 합니다. (#7909)
rotationDegrees
를 결정할 때 오타가 수정되었습니다.projectionPosePitch
을projectionPoseRoll
로 변경했습니다. (#461)Extractor
인스턴스를instanceof
로 직접 검사할 수 있다는 가정을 삭제합니다.Extractor
의 구현 세부정보에 런타임으로 액세스하려면 먼저Extractor.getUnderlyingInstance
를 호출해야 합니다.BmpExtractor
를 추가합니다.WebpExtractor
를 추가합니다.HeifExtractor
를 추가합니다.Mp4Extractor
에 QuickTime 기존 지원이 추가되었습니다.
- 오디오:
- MP4 및 Matroska의 24/32비트 big-endian PCM 지원을 추가하고 MP4의
lpcm
에 PCM 인코딩을 파싱합니다. - MP4로 Vorbis 오디오를 추출하기 위한 지원이 추가되었습니다.
- 싱크가
DefaultAudioOffloadSupportProvider
를 통해 형식에 제공할 수 있는 오프로드 지원 수준을 가져오는AudioSink.getFormatOffloadSupport(Format)
를 추가합니다.isFormatSupported
,isGaplessSupported
,isSpeedChangeSupported
가 포함된 새AudioOffloadSupport
를 반환합니다. - 오디오 싱크의 오프로드 구성을 구성하는
AudioSink.setOffloadMode()
를 추가합니다. 기본값은AudioSink.OFFLOAD_MODE_DISABLED
입니다. - 오프로드는
TrackSelectionParameters
의setAudioOffloadPreference
를 통해 사용 설정할 수 있습니다. 설정된 환경설정이 사용 설정이고 기기가 형식의 오프로드를 지원하고 트랙 선택이 단일 오디오 트랙인 경우 오디오 오프로드가 사용 설정됩니다. audioOffloadModePreference
가AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED
로 설정된 경우DefaultTrackSelector
은 오디오 트랙과 이 트랙의 형식이 오프로드에서 지원되는 경우에만 선택합니다. 오프로드에서 지원되는 오디오 트랙이 없으면 트랙이 선택되지 않습니다.- 트랙 전환 후 재생 위치 문제로 인해 API 수준 33 이전 버전인 경우 끊김 없는 오프로드 지원을 사용 중지합니다.
DefaultRenderersFactory.buildAudioSink
메서드 서명에서enableOffload
매개변수를 삭제합니다.DefaultAudioSink.Builder.setOffloadMode
메서드를 삭제합니다.- intdef 값
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
를 삭제합니다. - 오프로드 재생 중 Opus 끊김 없는 메타데이터 지원을 추가합니다.
- 첫 번째 쓰기에서 실패한 경우 오프로드를 사용 중지하여 렌더기 복구를 허용합니다. (#627)
- 오디오 전용 오프로드 재생에 기본적으로 오프로드 예약을 사용 설정합니다.
ExoPlayer.experimentalSetOffloadSchedulingEnabled
및AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
를 삭제합니다.onExperimentalSleepingForOffloadChanged
의 이름이onSleepingForOffloadChanged
로,onExperimentalOffloadedPlayback
의 이름이onOffloadedPlayback
로 변경되었습니다.- 오디오 오프로드 모드 관련
TrackSelectionParameters
인터페이스 및 정의를 내부AudioOffloadPreferences
클래스로 이동합니다. onAudioTrackInitialized
및onAudioTrackReleased
콜백을AnalyticsListener
,AudioRendererEventListener
,AudioSink.Listener
에 추가합니다.- DTS Express 오디오 버퍼 언더플로 문제를 수정했습니다. (#650)
- E-AC3-JOC 기능 검사에서
IllegalArgumentException
이 발생하는 버그를 수정했습니다. (#677)
- MP4 및 Matroska의 24/32비트 big-endian PCM 지원을 추가하고 MP4의
- 동영상:
MediaCodecVideoRenderer
가 맞춤VideoFrameProcessor.Factory
를 사용하도록 허용합니다.- 오디오 스트림이 음수 타임스탬프로 시작되는 경우 첫 번째 프레임을 렌더링할 수 없는 버그를 수정했습니다. (#291)
- 텍스트:
ExoplayerCuesDecoder
를 삭제했습니다. 이제sampleMimeType = application/x-media3-cues
를 사용하는 텍스트 트랙은SubtitleDecoder
인스턴스 없이TextRenderer
에서 직접 처리됩니다.
- 메타데이터:
- 구현에서 null을 반환해야 하므로 더 이상 '디코드 전용' 샘플에
MetadataDecoder.decode
가 호출되지 않습니다.
- 구현에서 null을 반환해야 하므로 더 이상 '디코드 전용' 샘플에
- 효과:
- 타임스탬프로 비트맵 입력을 큐에 추가하는
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)
를 추가합니다. VideoFrameProcessor.registerInputStream()
를 비차단으로 변경합니다. 앱은VideoFrameProcessor.Listener#onInputStreamRegistered()
를 구현해야 합니다.VideoFrameProcessor.queueInputBitmap
의frameRate
및durationUs
매개변수를TimestampIterator
로 변경했습니다.
- 타임스탬프로 비트맵 입력을 큐에 추가하는
- IMA 확장 프로그램:
- 재생목록의 첫 번째 항목이 아닌 다중 기간 DASH 라이브 스트림에서 예외가 발생할 수 있는 버그를 수정합니다. (#571)
AdsLoader.destroy()
를 호출하기 전에 StreamManager 해제- IMA SDK 버전을 3.31.0으로 범프합니다.
- 세션:
- 알림 포그라운드 서비스 동작을
DefaultMediaNotificationProvider
에서FOREGROUND_SERVICE_IMMEDIATE
로 설정합니다. (#167) - 삼성 기기에서 지원 중단된 API와 관련된 문제를 방지하려면 API 31 이상의
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()
만 사용하세요. (#167) - 미디어 알림 컨트롤러를 프록시로 사용하여 사용 가능한 명령어와 알림 및 플랫폼 세션을 채우는 데 사용되는 맞춤 레이아웃을 설정합니다.
- 플랫폼 세션으로 라우팅한 후 Media3으로 다시 라우팅하는 대신 Media3 내의
MediaSessionService.onStartCommand()
에서 수신한 미디어 버튼 이벤트를 변환합니다. 이렇게 하면 호출자 컨트롤러가 항상 미디어 알림 컨트롤러이며 앱은 지원되는 모든 API 수준에서 동일한 방식으로 알림에서 발생하는 호출을 쉽게 인식할 수 있습니다. - 기존
MediaSessionCompat
에 연결할 때MediaController.getCurrentPosition()
가 진행되지 않는 버그를 수정했습니다. - 편의상
MediaLibrarySession.getSubscribedControllers(mediaId)
를 추가합니다. - 컨트롤러가 구독하는 상위 ID의 사용 가능 여부를 어설션하도록
MediaLibrarySession.Callback.onSubscribe()
를 재정의합니다. 성공하면 정기 결제가 수락되고notifyChildrenChanged()
가 즉시 호출되어 브라우저에 알립니다. (#561) - Automotive OS용 세션 데모 모듈을 추가하고 Android Auto용 세션 데모를 사용 설정합니다.
- 미디어 알림 컨트롤러에
COMMAND_GET_TIMELINE
를 사용할 수 없는 경우 프레임워크 세션의 큐를 설정하지 마세요. Android Auto가 프레임워크 세션에서 읽기를 클라이언트 컨트롤러로 사용하면 Android Auto UI의queue
버튼이 표시되지 않습니다. (#339) SimpleBitmapLoader
대신 기본적으로DataSourceBitmapLoader
를 사용합니다. (#271, #327)- 앱이 기본 미디어 버튼 이벤트 처리를 재정의할 수 있도록
MediaSession.Callback.onMediaButtonEvent(Intent)
를 추가합니다.
- 알림 포그라운드 서비스 동작을
- UI:
- 사용자가 적절한 오디오 출력 (예: 블루투스 헤드폰)에 연결할 수 있도록 시스템 대화상자를 실행하여
Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
로 인한 재생 중지를 처리하는 Wear OS 기기용Player.Listener
구현을 추가합니다. 구성 가능한 제한 시간 내에 적절한 기기가 연결되면 리스너가 재생을 자동으로 재개합니다. 기본값은 5분입니다.
- 사용자가 적절한 오디오 출력 (예: 블루투스 헤드폰)에 연결할 수 있도록 시스템 대화상자를 실행하여
- 다운로드:
- Android 14 호환성을 위해
DownloadService
의 '데이터 동기화' 포그라운드 서비스 유형을 선언합니다. 이 서비스를 사용할 때 앱은 매니페스트에dataSync
를foregroundServiceType
로 추가하고FOREGROUND_SERVICE_DATA_SYNC
권한도 추가해야 합니다. (#11239)
- Android 14 호환성을 위해
- HLS 확장 프로그램:
- 마지막 로드 완료 시간이 아닌 마지막 로드 시작 시간에서 계산된 간격으로 HLS 실시간 재생목록을 새로고침합니다. (#663)
- DASH 확장 프로그램:
- 세그먼트 템플릿 URL에 동일한 DASH 식별자를 여러 개 허용합니다.
- 추출 중에 자막 파싱을 위한 실험용 지원을 추가합니다. 이는 자막 세그먼트 간 전환 시 깜박이는 문제를 해결하는 등 겹치는 자막 병합을 더 효과적으로 지원합니다.
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
를 사용하여 사용 설정할 수 있습니다. (#288)
- RTSP 확장 프로그램:
- 디코더 확장 프로그램 (FFmpeg, VP9, AV1, MIDI 등):
- Jsyn 라이브러리를 사용하여 오디오를 합성하는 표준 MIDI 파일 재생을 지원하는 MIDI 디코더 모듈을 출시합니다.
- 표시할 필요가 없는 출력 버퍼를 직접 표시하려면
DecoderOutputBuffer.shouldBeSkipped
를 추가합니다. 이는 지원 중단될C.BUFFER_FLAG_DECODE_ONLY
보다 선호됩니다. - 디코더가 시작 시간 전에 디코딩 전용 샘플을 드롭할 수 있도록
Decoder.setOutputStartTimeUs
및SimpleDecoder.isAtLeastOutputStartTimeUs
를 추가합니다. 이는 지원 중단될Buffer.isDecodeOnly
보다 선호되어야 합니다. - Maven 저장소에 MIDI 디코더 아티팩트를 게시하는 버그가 수정되었습니다. 아티팩트 이름이
media3-exoplayer-midi
로 변경됩니다. (#734)
- Leanback 확장 프로그램:
- 노출 영역을 사용 중지하면 Leanback 코드에서
ArithmeticException
이 발생할 수 있는 버그를 수정했습니다. (#617)
- 노출 영역을 사용 중지하면 Leanback 코드에서
- 테스트 유틸리티:
TestExoPlayerBuilder
및FakeClock
를 Espresso UI 테스트 및 Compose UI 테스트와 호환되도록 합니다. 이를 통해 Espresso 또는 Compose 뷰 상호작용 중에 재생이 비결정적으로 진행되는 버그가 수정되었습니다.
- 지원 중단된 기호 삭제:
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)
및TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)
를 삭제합니다. 대신Composition.Builder.setHdrMode(int)
를 사용하고Composition
를Transformer.start(Composition, String)
에 전달합니다.- 지원 중단된
DownloadNotificationHelper.buildProgressNotification
메서드를 삭제하고 대신notMetRequirements
매개변수를 사용하는 지원 중단되지 않은 메서드를 사용합니다.
버전 1.2.0-rc01
2023년 11월 1일
1.2.0 안정화 버전을 사용하세요.
버전 1.2.0-beta01
2023년 10월 19일
1.2.0 안정화 버전을 사용하세요.
버전 1.2.0-alpha02
2023년 9월 29일
1.2.0 안정화 버전을 사용하세요.
버전 1.2.0-alpha01
2023년 8월 17일
1.2.0 안정화 버전을 사용하세요.
버전 1.1.0
버전 1.1.1
2023년 8월 16일
- 공통 라이브러리:
- 모든 모듈에서 실수로 추가된
multidex
종속 항목을 삭제합니다. (#499)
- 모든 모듈에서 실수로 추가된
- ExoPlayer:
- 재생목록이 삭제된 후 가짜
PlaybackStats
가 생성되는PlaybackStatsListener
의 문제를 수정했습니다. - 일반 미디어 클라이언트 데이터 (CMCD) 로깅에 스트리밍 형식 (sf), 스트림 유형 (st), 버전 (v), 최상위 비트 전송률 (tb), 객체 기간 (d), 측정된 처리량 (mtp), 객체 유형 (ot) 등의 필드를 추가합니다. (#8699)
- 재생목록이 삭제된 후 가짜
- 오디오:
- 매우 짧은 파일을 재생할 때
Player.getState()
가STATE_ENDED
로 전환되지 않는 버그를 수정했습니다. (#538)
- 매우 짧은 파일을 재생할 때
- 오디오 오프로드:
- RFC 7845에 따라 오프로드된 Opus 재생을 위해 Ogg ID 헤더 및 댓글 헤더 페이지를 비트스트림 앞에 추가합니다.
- 동영상:
- H.265/HEVC: SPS 단기 및 장기 참조 사진 정보 파싱을 수정합니다.
- 텍스트:
- CEA-608: 표시되는 텍스트만 고려하도록 큐 자르기 로직을 변경합니다. 이전에는 큐 길이를 32자 (사양에 따라 기술적으로 정확함)로 제한할 때 들여쓰기 및 탭 오프셋이 포함되었습니다. (#11019)
- IMA 확장 프로그램:
- IMA SDK 버전을 3.30.3으로 범프합니다.
- 세션:
- 컨트롤러 상태에 맞춤 레이아웃을 추가하고 컨트롤러에 액세스하기 위한 getter를 제공합니다. 맞춤 레이아웃이 변경되면
MediaController.Listener.onCustomLayoutChanged
가 호출됩니다. 다른 맞춤 레이아웃을 다른 Media3 컨트롤러에 전송하려는 앱은AcceptedResultBuilder
를 사용하여MediaSession.Callback.onConnect
에서 이 작업을 실행하여 연결이 완료될 때 컨트롤러에서 맞춤 레이아웃을 사용할 수 있도록 할 수 있습니다. MediaLibraryServiceLegacyStub
가 이를 지원하지 않는Result
에 오류를 전송하여UnsupportedOperationException
을 생성하는 문제를 수정합니다. (#78)- 기존 명령어(
COMMAND_ADJUST_DEVICE_VOLUME
및COMMAND_SET_DEVICE_VOLUME
)와 새 명령어 (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
및COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
)를 통해volumeControlType
를 확인하여PlayerWrapper
가VolumeProviderCompat
를 만드는 방식을 수정합니다. (#554)
- 컨트롤러 상태에 맞춤 레이아웃을 추가하고 컨트롤러에 액세스하기 위한 getter를 제공합니다. 맞춤 레이아웃이 변경되면
버전 1.1.0
2023년 7월 5일
- 공통 라이브러리:
- 부적합한 오디오 경로의 억제 이유를 추가하고, 준비되었을 때 재생하고 너무 오랫동안 억제되는 이유를 변경합니다. (#15)
- 플레이어에 명령어를 추가합니다.
COMMAND_GET_METADATA
COMMAND_SET_PLAYLIST_METADATA
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- 사용자가 볼륨 플래그를 지정할 수 있는 오버로드된 메서드를 Player에 추가합니다.
void setDeviceVolume(int, int)
void increaseDeviceVolume(int)
void decreaseDeviceVolume(int)
void setDeviceMuted(boolean, int)
DeviceInfo
용Builder
를 추가하고 기존 생성자를 지원 중단합니다.DeviceInfo.routingControllerId
를 추가하여 원격 재생의 라우팅 컨트롤러 ID를 지정합니다.- 동일한 위치에서 항목을 추가 및 삭제하기 위한 바로가기로
Player.replaceMediaItem(s)
를 추가합니다. (#8046)
- ExoPlayer:
- 명시적으로 선택한 경우에만 ExoPlayer가 기기 볼륨 메서드를 제어할 수 있도록 허용합니다.
ExoPlayer.Builder.setDeviceVolumeControlEnabled
를 사용하여 다음에 액세스할 수 있습니다.getDeviceVolume()
isDeviceMuted()
setDeviceVolume(int)
및setDeviceVolume(int, int)
increaseDeviceVolume(int)
및increaseDeviceVolume(int, int)
decreaseDeviceVolume(int)
및decreaseDeviceVolume(int, int)
MediaSource
에서 사용 가능한 트랙 유형을 필터링할 수 있도록FilteringMediaSource
를 추가합니다.- 적응형 스트리밍 형식 DASH, HLS, SmoothStreaming의 발신 요청에 일반 미디어 클라이언트 데이터 (CMCD)를 포함하기 위한 지원을 추가합니다. 다음 필드
br
,bl
,cid
,rtp
,sid
가 통합되었습니다. (#8699) API 구조 및 API 메서드:- CMCD 로깅은 기본적으로 사용 중지되어 있으므로
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory)
를 사용하여 사용 설정하세요. - 모든 키는 기본적으로 사용 설정되어 있습니다.
CmcdConfiguration.RequestConfig.isKeyAllowed(String key)
를 재정의하여 로깅되는 키를 필터링합니다. - 커스텀 키 로깅을 사용 설정하려면
CmcdConfiguration.RequestConfig.getCustomData()
를 재정의합니다.
- CMCD 로깅은 기본적으로 사용 중지되어 있으므로
- 맞춤
*.exolist.json
파일로 데모 앱을 더 쉽게 시작할 수 있도록 기본 데모의 매니페스트에 작업을 추가합니다. (#439) - 동영상 재생 중에
Effect
를 사용하도록ExoPlayer.setVideoEffects()
를 추가합니다. sourceId
를int
가 아닌long
로 저장하도록SampleQueue
를 업데이트합니다. 이렇게 하면 공개 메서드SampleQueue.sourceId
및SampleQueue.peekSourceId
의 서명이 변경됩니다.- 이러한 메서드를 관련
MediaPeriod
와 연결할 수 있도록LoadControl
메서드shouldStartPlayback
및onTracksSelected
에 매개변수를 추가합니다. - 지도의 키로 사용되는 UID가 포함된 마침표가 포함된 타임라인 매개변수를 추가하여
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)
의 서명을 변경합니다. 이는 여러 기간의 라이브 스트림의 동시 실행 문제를 방지하기 위해 필요합니다. EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)
및BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)
가 지원 중단됩니다.mediaTimeOffsetUs
가 없는 메서드의 변형을 대신 호출할 수 있습니다. 지원 중단된 변형의 경우에도 오프셋은 디스패처에 의해 전달된MediaLoadData
객체의startTimeUs
및endTimeUs
에 더 이상 추가되지 않습니다.ExoTrackSelection.blacklist
의 이름을excludeTrack
로,isBlacklisted
를isTrackExcluded
로 바꿉니다.- 빈 재생목록에서 호출될 때
ExoPlayer.setMediaItem(s)
와addMediaItem(s)
간의 일관되지 않은 동작을 수정합니다.
- 명시적으로 선택한 경우에만 ExoPlayer가 기기 볼륨 메서드를 제어할 수 있도록 허용합니다.
- 변환기:
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)
를 삭제했습니다. 대신ExoPlayerAssetLoader.Factory(MediaSource.Factory)
및Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)
를 사용하세요.Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
를 삭제했습니다.- 입력 프레임이 처리 대기 중인 시점에 동영상 스트림의 끝이 신호를 받으면 변환이 중단되어 Muxer 시간 초과로 이어질 수 있는 버그를 수정했습니다.
- 지원을 확장하기 위해
findDecoder/EncoderForFormat
유틸리티를 사용하는 대신MediaCodecList
를 통해 코덱을 쿼리합니다. - B-프레임 구성은 일부 기기에서 작동하지 않으므로
DefaultEncoderFactory
에서 삭제합니다.
- 트랙 선택:
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange
를 추가합니다. 이 기능은 기본적으로 사용 중지되어 있습니다. 사용 설정하면 렌더기 기능이 변경될 때DefaultTrackSelector
가 새로운 트랙 선택을 트리거합니다.
- 추출기:
- 오디오:
- 간격 없는 자르기와 같이 터널링이 사용 설정되고
AudioProcessors
가 활성 상태일 때 일부 재생이 실패하는 버그를 수정했습니다. (#10847) - 직접 재생 (오프로드)에서 Ogg 패킷의 Opus 프레임을 캡슐화합니다.
- 오프로드 예약으로 절전 모드 동안 현재 위치를 추정합니다.
- 플레이어의 수명 주기가 끝날 때 리소스를 해제하도록
Renderer.release()
및AudioSink.release()
를 추가합니다. DefaultAudioSink
의 오디오 기능 변경사항을 수신합니다.DefaultAudioSink
의 생성자에 필수 매개변수context
를 추가합니다. 그러면DefaultAudioSink
가AudioCapabilitiesReceiver
의 리스너로 등록되고 기능 변경사항이 알림될 때audioCapabilities
속성을 업데이트합니다.AudioSink.Listener
인터페이스의 새 이벤트onAudioCapabilitiesChanged
과onRendererCapabilitiesChanged
이벤트를 트리거하는 새 인터페이스RendererCapabilities.Listener
를 통해 오디오 기능 변경사항을 전파합니다.- 오디오 채널에 확장/믹싱을 적용하기 위한
ChannelMixingAudioProcessor
를 추가합니다. - 새 int 값
DISCARD_REASON_AUDIO_BYPASS_POSSIBLE
를DecoderDiscardReasons
에 추가하여 오디오 기능이 변경된 후 우회 모드가 가능할 때 오디오 디코더를 삭제합니다. - DTS Express 및 DTS:X에 직접 재생 지원을 추가합니다. (#335)
- 간격 없는 자르기와 같이 터널링이 사용 설정되고
- 동영상:
- 렌더기가 사용 중지될 때
MediaCodecVideoRenderer
가 너비와 높이가 0인VideoSize
를 보고하도록 합니다.Player.Listener.onVideoSizeChanged
는Player.getVideoSize()
가 변경될 때 적절하게 호출됩니다. 이 변경으로 인해Player.getCurrentTracks
가 동영상을 지원하지 않거나 지원되는 동영상 트랙의 크기가 아직 결정되지 않은 경우MediaCodecVideoRenderer
가 있는 ExoPlayer의 동영상 크기는 너비와 높이가 0이 됩니다.
- 렌더기가 사용 중지될 때
- DRM:
- DRM 패키지 외부에서 호출되지 않을 것으로 예상되는
DefaultDrmSession
의 여러 내부 전용 메서드의 공개 상태를 줄입니다.void onMediaDrmEvent(int)
void provision()
void onProvisionCompleted()
onProvisionError(Exception, boolean)
- DRM 패키지 외부에서 호출되지 않을 것으로 예상되는
- Muxer:
- MP4 컨테이너 파일을 만드는 데 사용할 수 있는 새 Muxer 라이브러리를 추가합니다.
- IMA 확장 프로그램:
- DAI에 다 기간 실시간 DASH 스트림을 사용 설정합니다. 현재 구현은 아직 라이브 스트림에서 탐색을 지원하지 않습니다. (#10912)
- 연속된 타임라인에서 계산된 콘텐츠 위치가 약간 다르기 때문에 새 광고 그룹이 라이브 스트림에 삽입되는 버그가 수정되었습니다.
- 세션:
- 도우미 메서드
MediaSession.getControllerForCurrentRequest
를 추가하여 현재Player
메서드를 호출하고 있는 컨트롤러에 관한 정보를 가져옵니다. - 앱이 블루투스 헤드셋에서 전송된 미디어 버튼 이벤트로 재생 재개를 구현할 수 있도록
androidx.media3.session.MediaButtonReceiver
를 추가합니다. (#167) LocalConfiguration
(예: URI)가 있는 경우 요청된MediaItems
가Player
에 전달될 수 있도록MediaSession.Callback.onAddMediaItems
에 기본 구현을 추가합니다. (#282)- Android 12 이하의 경우 기본적으로 소형 미디어 알림 뷰에 '이전으로 이동' 및 '다음으로 찾기' 명령어 버튼을 추가합니다. (#410)
LocalConfiguration
(예: URI)가 있는 경우 요청된MediaItems
가Player
에 전달될 수 있도록MediaSession.Callback.onAddMediaItems
에 기본 구현을 추가합니다. (#282)- Android 12 이하의 경우 기본적으로 소형 미디어 알림 뷰에 '이전으로 이동' 및 '다음으로 찾기' 명령어 버튼을 추가합니다. (#410)
- 도우미 메서드
- UI:
- 유틸리티 메서드
shouldShowPlayButton
및handlePlayPauseButtonAction
를 추가하여 재생/일시중지 버튼이 있는 맞춤 UI 요소를 작성합니다.
- 유틸리티 메서드
- RTSP 확장 프로그램:
- DASH 확장 프로그램:
- 여러 기간 DASH 스트림의 경우
MediaLoadData.startTimeMs
및MediaLoadData.endTimeMs
에서 미디어 시간 오프셋을 삭제합니다. - 다중 기간 라이브 Dash 미디어 소스를 다시 준비할 때
IndexOutOfBoundsException
가 생성되는 버그를 수정했습니다. (#10838)
- 여러 기간 DASH 스트림의 경우
- HLS 확장 프로그램:
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)
를 추가하여 로드 스레드가TimestampAdjuster
가 초기화될 때까지 대기하는 제한 시간을 설정합니다. 제한 시간 전에 초기화가 완료되지 않으면 재생이 끝없는 중단을 방지하기 위해PlaybackException
이 발생합니다. 제한 시간은 기본적으로 0으로 설정됩니다. (#323)
- 테스트 유틸리티:
DataSourceContractTest
에서 URI 스킴 대소문자 구분을 확인합니다.
- 지원 중단된 기호 삭제:
DefaultAudioSink
생성자를 삭제하고 대신DefaultAudioSink.Builder
를 사용하세요.HlsMasterPlaylist
를 삭제하고 대신HlsMultivariantPlaylist
를 사용하세요.Player.stop(boolean)
를 삭제했습니다. 대신Player.stop()
및Player.clearMediaItems()
(reset
이true
인 경우)를 사용하세요.- 지원 중단된 두
SimpleCache
생성자를 삭제하고 성능 향상을 위해DatabaseProvider
를 사용하는 지원 중단되지 않은 생성자를 사용하세요. DefaultBandwidthMeter
생성자를 삭제하고 대신DefaultBandwidthMeter.Builder
를 사용하세요.DefaultDrmSessionManager
생성자를 삭제하고 대신DefaultDrmSessionManager.Builder
를 사용하세요.- 지원 중단된 두
HttpDataSource.InvalidResponseCodeException
생성자를 삭제하고 추가 필드(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.Builder
를 사용하여Format
인스턴스를 만듭니다.- 지원 중단된 메서드
copyWithMaxInputSize
,copyWithSubsampleOffsetUs
,copyWithLabel
,copyWithManifestFormatInfo
,copyWithGaplessInfo
,copyWithFrameRate
,copyWithDrmInitData
,copyWithMetadata
,copyWithBitrate
,copyWithVideoSize
를 삭제하고 대신Format.buildUpon()
및 setter 메서드를 사용합니다. - 지원 중단된
ExoPlayer.retry()
를 삭제하고 대신prepare()
를 사용하세요. - 지원 중단된 0 인수
DefaultTrackSelector
생성자를 삭제하고 대신DefaultTrackSelector(Context)
를 사용하세요. - 지원 중단된
OfflineLicenseHelper
생성자를 삭제하고 대신OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
를 사용하세요. - 지원 중단된
DownloadManager
생성자를 삭제하고 대신Executor
를 사용하는 생성자를 사용하세요. - 지원 중단된
Cue
생성자를 삭제하고 대신Cue.Builder
를 사용하세요. - 지원 중단된
OfflineLicenseHelper
생성자를 삭제하고 대신OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
를 사용하세요. - 지원 중단된 4개의
AnalyticsListener
메서드를 삭제합니다.onDecoderEnabled
의 경우, 대신onAudioEnabled
또는onVideoEnabled
를 사용하세요.onDecoderInitialized
, 대신onAudioDecoderInitialized
또는onVideoDecoderInitialized
를 사용하세요.onDecoderInputFormatChanged
, 대신onAudioInputFormatChanged
또는onVideoInputFormatChanged
를 사용하세요.onDecoderDisabled
의 경우, 대신onAudioDisabled
또는onVideoDisabled
를 사용하세요.
- 지원 중단된
Player.Listener.onSeekProcessed
및AnalyticsListener.onSeekProcessed
를 삭제하고 대신DISCONTINUITY_REASON_SEEK
와 함께onPositionDiscontinuity
를 사용하세요. ExoPlayer.setHandleWakeLock(boolean)
를 삭제하고 대신setWakeMode(int)
를 사용하세요.- 지원 중단된
DefaultLoadControl.Builder.createDefaultLoadControl()
를 삭제하고 대신build()
를 사용하세요. - 지원 중단된
MediaItem.PlaybackProperties
를 삭제하고 대신MediaItem.LocalConfiguration
를 사용하세요. 지원 중단된MediaItem.playbackProperties
필드는 이제MediaItem.LocalConfiguration
유형입니다.
버전 1.1.0-rc01
2023년 6월 21일
1.1.0 안정화 버전을 사용하세요.
버전 1.1.0-beta01
2023년 6월 7일
1.1.0 안정화 버전을 사용하세요.
버전 1.1.0-alpha01
2023년 5월 10일
1.1.0 안정화 버전을 사용하세요.
버전 1.0.0
버전 1.0.2
2023년 5월 18일
androidx.media3:media3-*:1.0.2
가 출시되었습니다.
버전 1.0.2에 포함된 커밋을 확인하세요.
이 버전은 ExoPlayer 2.18.7 출시에 해당합니다.
이 버전에는 1.0.1 출시 이후 다음과 같은 변경사항이 포함되어 있습니다.
- 핵심 라이브러리:
Buffer
에C.BUFFER_FLAG_LAST_SAMPLE
플래그가 포함되어 있는지 나타내는Buffer.isLastSample()
를 추가합니다.- 프레임이 있는 마지막 샘플이 '스트림 끝' 샘플을 읽지 않고 대기열에서 제거되면 마지막 프레임이 렌더링되지 않는 문제가 수정되었습니다. (#11079)
- 추출기:
- RTSP 및 MP4 추출기에서 이미 사용하는 파싱 로직을 재사용하여 MPEG-TS 파일의 H.265 SPS 파싱을 수정합니다. (#303)
- 텍스트:
- SSA: 바이트 순서 표시로 시작하는 경우 UTF-16 파일에 대한 지원을 추가합니다. (#319)
- 세션:
MediaController
가 작업을 업데이트하는 기존MediaSessionCompat
에 연결될 때 사용 가능한 명령어를 업데이트하지 않는 문제를 수정했습니다.- API 30의
params.isRecent == true
를 사용하여 시스템 UI에서Callback.onGetLibraryRoot
로의 호출에 대해MediaLibraryService
가 null을 반환하지 못하는 버그를 수정했습니다. (#355) MediaSessionService
또는MediaLibraryService
의 메모리 누수를 수정합니다. (#346)MediaSession
에서 결합된Timeline
및 위치 업데이트로 인해MediaController
에서IllegalStateException
이 발생할 수 있는 버그를 수정했습니다.
버전 1.0.1
2023년 4월 18일
androidx.media3:media3-*:1.0.1
가 출시되었습니다.
버전 1.0.1에 포함된 커밋을 확인하세요.
이 버전은 ExoPlayer 2.18.6 출시에 해당합니다.
- 핵심 라이브러리:
- 기본 위치로 이동할 때 타겟 라이브 스트림 재정의를 재설정합니다. (#11051)
- 미디어의 빈 샘플 스트림으로 인해 재생이 중단될 수 있는 버그를 수정했습니다.
- 세션:
- 기존
MediaSessionCompat
에서 게시한 동일한 큐 항목이 여러 개MediaController
에서 예외가 발생하는 버그를 수정했습니다. (#290) MediaSession.broadcastCustomCommand
의 누락된 전달을 기존MediaControllerCompat.Callback.onSessionEvent
에 추가합니다. (#293)MediaSession.setPlayer
를 호출해도 사용 가능한 명령어가 업데이트되지 않는 버그를 수정했습니다.MediaController
에서 전송된TrackSelectionOverride
인스턴스가Format.metadata
를 사용하여 그룹을 참조하는 경우 무시되는 문제를 수정했습니다. (#296)- 기존
MediaSessionCompat
를 통해 메타데이터에 액세스하려면Player.COMMAND_GET_CURRENT_MEDIA_ITEM
를 사용해야 하는 문제를 수정했습니다. MediaSessionService
에서 사용할 때 백그라운드 스레드의MediaSession
인스턴스가 비정상 종료를 일으키는 문제를 수정했습니다. (#318)- 앱이 이를 의도하지 않은 상태에서 미디어 버튼 수신기가 라이브러리에 의해 선언되는 문제를 수정합니다. (#314)
- 기존
- DASH:
- 빈 세그먼트 타임라인 처리를 수정합니다. (#11014)
- RTSP:
- UDP를 사용한 RTSP 설정이 RTSP 오류 461 지원되지 않음(#11069)과 함께 실패하는 경우 TCP로 다시 시도합니다.
버전 1.0.0
2023년 3월 22일
androidx.media3:media3-*:1.0.0
가 출시되었습니다.
버전 1.0.0에 포함된 커밋을 확인하세요.
이 버전은 ExoPlayer 2.18.5 출시에 해당합니다.
1.0.0-rc02 이후 변경사항이 없습니다.
버전 1.0.0-rc02
2023년 3월 2일
androidx.media3:media3-*:1.0.0-rc02
가 출시되었습니다.
버전 1.0.0-rc02에 포함된 커밋을 확인하세요.
이 버전은 ExoPlayer 2.18.4 출시에 해당합니다.
- 핵심 라이브러리:
- 다운로드:
- 병합할 두 세그먼트의 시작 시간 최대 차이를
SegmentDownloader
및 서브클래스에서 구성 가능하도록 설정합니다. (#248)
- 병합할 두 세그먼트의 시작 시간 최대 차이를
- 오디오:
- 동영상:
- HEVC HDR10 형식을
HEVCProfileMain10
대신HEVCProfileMain10HDR10
에 매핑합니다. - Chromecast with Google TV 및 Lenovo M10 FHD Plus에서 60fps AVC 스트림이 지원되지 않음으로 표시되는 기기 문제에 관한 해결 방법을 추가합니다. (#10898)
- 프레임 속도가 화면 새로고침 빈도보다 훨씬 빠른 미디어를 재생할 때 발생하는 프레임 출시 성능 문제를 수정합니다.
- HEVC HDR10 형식을
- 전송:
- 미디어 항목 간에 전환할 때 발생하는 일시적인
STATE_IDLE
을 수정합니다. (#245)
- 미디어 항목 간에 전환할 때 발생하는 일시적인
- RTSP:
- 잘못된 RTSP Explain 응답 메시지의 파싱 시 발생하는 IllegalArgumentException을 포착합니다. (#10971)
- 세션:
- 알림 재생/일시중지 버튼이 플레이어 상태로 업데이트되지 않는 버그를 수정했습니다. (#192)
- IMA 확장 프로그램:
- 첫 번째 (광고가 없는 경우 유일한)
LOADED
이벤트가 수신되지 않아 광고가 없는 DAI 스트림이 시작되지 않는 버그를 수정했습니다.
- 첫 번째 (광고가 없는 경우 유일한)
버전 1.0.0-rc01
2023년 2월 16일
androidx.media3:media3-*:1.0.0-rc01
가 출시되었습니다.
버전 1.0.0-rc01에 포함된 커밋을 확인하세요.
이 버전은 ExoPlayer 2.18.3 출시에 해당합니다.
- 핵심 라이브러리:
- 디코더가 미디어를 제대로 재생하지 못할 수 있다고 보고하더라도
MediaCodecSelector
의 환경설정을 유지하도록 렌더기의 디코더 순서 지정 로직을 조정합니다. 예를 들어 기본 선택기에서 기능 지원만 있는 하드웨어 디코더가 이 형식을 완전히 지원하는 소프트웨어 디코더보다 선호됩니다. (#10604) - 새 ExoPlayer 인스턴스의 기존 재생 스레드를 설정하는
ExoPlayer.Builder.setPlaybackLooper
를 추가합니다. - 다운로드 관리자 도우미가 삭제되도록 허용합니다. (#10776)
- 탐색에 사용되는 명령어도 나타내도록
BasePlayer.seekTo
에 매개변수를 추가합니다. - API 21 이상에서 드로어블을 로드할 때 테마를 사용합니다. (#220)
- 여러 미디어 항목을 단일 창으로 결합할 수 있는
ConcatenatingMediaSource2
를 추가합니다. (#247)
- 디코더가 미디어를 제대로 재생하지 못할 수 있다고 보고하더라도
- 추출기:
- trak atom을 파싱할 때 샘플 테이블(stbl)에 필수 샘플 설명(stsd)이 누락된 경우
NullPointerException
대신ParserException
이 발생합니다. - fMP4의 동기화 프레임으로 직접 이동할 때 샘플을 올바르게 건너뜁니다. (#10941)
- trak atom을 파싱할 때 샘플 테이블(stbl)에 필수 샘플 설명(stsd)이 누락된 경우
- 오디오:
- 압축된 오디오 형식 비트 전송률을 사용하여 직접 재생(패스 스루)에서
AudioTrack
의 최소 버퍼 크기를 계산합니다.
- 압축된 오디오 형식 비트 전송률을 사용하여 직접 재생(패스 스루)에서
- 텍스트:
- 자막 파일에 신호가 없는 경우
Subtitle.getEventTime
에 잘못된(음수) 색인을 전달하는TextRenderer
를 수정합니다. - SubRip: 바이트 순서 표시로 시작되는 경우 UTF-16 파일의 지원을 추가합니다.
- 자막 파일에 신호가 없는 경우
- 메타데이터:
- ID3 v2.4에서 허용하는 대로 ID3 프레임에서 여러 개의 null로 구분된 값을 파싱합니다.
MediaMetadata.mediaType
을 추가하여 메타데이터에 설명된 콘텐츠 유형 또는 폴더 유형을 표시합니다.MediaMetadata.folderType
대신MediaMetadata.isBrowsable
을 추가합니다. 폴더 유형은 다음 출시에서 지원 중단됩니다.
- DASH:
- 타일 수를 포함하여 이미지 적응 세트에 관한 전체 파싱을 추가합니다. (#3752)
- UI:
- 세션:
- 맞춤 플레이어용
Player
인터페이스를 구현할 수 있도록 추상SimpleBasePlayer
를 추가합니다. - 플랫폼 세션 토큰을 Media3
SessionToken
으로 변환하는 도우미 메서드를 추가합니다. (#171) onMediaMetadataChanged
를 사용하여 플랫폼 미디어 세션의 업데이트를 트리거합니다. (#219)- 미디어 세션을
DefaultMediaNotificationProvider
의getMediaButtons()
인수로 추가하고 명확성을 위해 변경 불가능한 목록을 사용합니다. (#216) MediaItem
목록을 수정/설정하는 수단을 제공하는onSetMediaItems
콜백 리스너를 추가하여 플레이어에 설정하기 전에 세션별 색인 및 위치를 시작합니다. (#156)- 블루투스가 아닌 미디어 버튼 이벤트의 두 번 탭 감지를 피합니다. (#233)
- 기존 세션 상태가 좋지 않은 경우
QueueTimeline
을 더 강력하게 만듭니다. (#241)
- 맞춤 플레이어용
- 메타데이터:
- ID3 v2.4에서 허용하는 대로 ID3 프레임에서 여러 개의 null로 구분된 값을 파싱합니다.
MediaMetadata.mediaType
을 추가하여 메타데이터에 설명된 콘텐츠 유형 또는 폴더 유형을 표시합니다.MediaMetadata.folderType
대신MediaMetadata.isBrowsable
을 추가합니다. 폴더 유형은 다음 출시에서 지원 중단됩니다.
- Cast 확장 프로그램:
- Cast SDK 버전을 21.2.0으로 범프합니다.
- IMA 확장 프로그램:
- 스레딩 문제를 방지하기 위해 애플리케이션 스레드에서
ImaServerSideAdInsertionMediaSource
의 플레이어 리스너를 삭제합니다. - 속성
focusSkipButtonWhenAvailable
을ImaServerSideAdInsertionMediaSource.AdsLoader.Builder
에 추가하여 TV 기기에서 건너뛰기 버튼에 포커스를 두도록 요청하고 이를 기본적으로 true로 설정합니다. - 건너뛰기 버튼에 포커스를 맞추도록 프로그래매틱 방식으로 요청하려면
focusSkipButton()
메서드를ImaServerSideAdInsertionMediaSource.AdsLoader
에 추가합니다. - IMA SDK 버전을 3.29.0으로 범프합니다.
- 스레딩 문제를 방지하기 위해 애플리케이션 스레드에서
- 데모 앱:
- 런타임 시 다운로드 알림의 알림 권한을 요청합니다. (#10884)
버전 1.0.0-beta03
2022년 11월 22일
androidx.media3:media3-*:1.0.0-beta03
가 출시되었습니다.
버전 1.0.0-beta03에 포함된 커밋을 확인하세요.
이 버전은 ExoPlayer 2.18.2 출시에 해당합니다.
- 핵심 라이브러리:
- 현재 선택된 트랙에 터널링이 사용 설정되어 있는지
ExoPlayer.isTunnelingEnabled
를 추가하여 확인합니다. (#2518) WrappingMediaSource
를 추가하여 단일MediaSource
래핑을 간소화합니다. (#7279)- 사용 가능한 메모리가 충분하지 않아 재생이 중단되기 전에 백 버퍼를 삭제합니다.
- 오프로드가 사용 설정된 경우 Tracing 'doSomeWork' 블록을 닫습니다.
PlaybackStatsListener
에서 빠른 탐색의 세션 추적 문제를 수정합니다. (#180)- 단일 항목 재생목록에서
seekToNext
또는seekToPrevious
를 호출할 때 누락된onMediaItemTransition
콜백을 전송합니다. (#10667) - 동영상이 렌더링되는 노출 영역의 크기를 반환하는
Player.getSurfaceSize
를 추가합니다. - 플레이어 해제 중에 리스너를 삭제하면
IllegalStateException
이 발생할 수 있는 버그를 수정했습니다. (#10758)
- 현재 선택된 트랙에 터널링이 사용 설정되어 있는지
- 빌드:
- 최소
compileSdkVersion
을 적용하여 컴파일 오류를 방지합니다. (#10684) - 블록이 다른 Gradle 빌드에 포함된 경우 블록 게시를 방지합니다.
- 최소
- 트랙 선택:
- 디스플레이에서 지원하지 않는 경우 Dolby Vision보다 다른 트랙을 선호합니다. (#8944)
- 다운로드:
- 동영상:
- 디스플레이에서 지원하지 않는 경우 Dolby Vision에 다른 디코더를 사용해 봅니다. (#9794)
- 오디오:
- 동시에 여러 플레이어를 해제할 때 발생하는 OutOfMemory 오류를 방지하기 위해
AudioTrack
인스턴스를 해제하는 데SingleThreadExecutor
를 사용합니다. (#10057) - AudioTrack 오프로드 상태에
AudioOffloadListener.onExperimentalOffloadedPlayback
을 추가합니다. (#134) AudioTrackBufferSizeProvider
를 공개 인터페이스로 만듭니다.ExoPlayer.setPreferredAudioDevice
를 추가하여 선호하는 오디오 출력 장치를 설정합니다. (#135)androidx.media3.exoplayer.audio.AudioProcessor
의 이름을androidx.media3.common.audio.AudioProcessor
로 바꿉니다.- 모든 Android 버전에서 각각 8채널 및 12채널 오디오를 7.1 및 7.1.4 채널 마스크에 매핑합니다. (#10701)
- 동시에 여러 플레이어를 해제할 때 발생하는 OutOfMemory 오류를 방지하기 위해
- 메타데이터:
- 이제 메타데이터를 사용할 수 있을 때 이를 즉시 렌더링하도록
MetadataRenderer
를 구성할 수 있습니다.MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean)
로 인스턴스를 만들어 렌더러가 메타데이터를 일찍 출력할지 아니면 플레이어 위치에 맞춰 출력할지 지정합니다.
- 이제 메타데이터를 사용할 수 있을 때 이를 즉시 렌더링하도록
- DRM:
- 비어 있지 않지만 잘못된 라이선스 URL을 반환하는 Android 13 ClearKey 구현의 버그를 해결합니다.
- 재생목록에서 DRM 스키마 간에 전환(예: Widevine에서 ClearKey로)할 때 발생하는
setMediaDrmSession failed: session not opened
오류를 수정합니다.
- 텍스트:
- CEA-608: 필드 2의 서비스 전환 명령어가 올바르게 처리되는지 확인합니다. (#10666)
- DASH:
- 매니페스트에서
EventStream.presentationTimeOffset
를 파싱합니다. (#10460)
- 매니페스트에서
- UI:
TrackSelectionDialogBuilder
에 미리 설정된 대로 플레이어의 현재 재정의를 사용합니다. (#10429)
- 세션:
- 일부 명령어는 비동기 해상도가 필요한 경우에도 항상 올바른 순서로 실행됩니다. (#85)
DefaultMediaNotificationProvider.Builder
를 추가하여DefaultMediaNotificationProvider
인스턴스를 빌드합니다. 빌더는 제공자가 사용하는 알림 ID, 알림 채널 ID, 알림 채널 이름을 구성할 수 있습니다. 또한DefaultMediaNotificationProvider.setSmallIcon(int)
메서드를 추가하여 알림을 작은 아이콘으로 설정합니다. (#104)MediaController.release()
전에 전송된 명령어가 삭제되지 않도록 합니다. (#99)SimpleBitmapLoader
는file://
URI에서 비트맵을 로드할 수 있습니다. (#108)MediaController
가 일정 기간 동안 광고를 탐색하는 것을 방지하는 어설션을 수정했습니다. (#122)- 재생이 끝나면
MediaSessionService
가 포그라운드에서 중지되고 마지막으로 재생된 미디어 항목의 재생을 다시 시작하라는 알림이 표시됩니다. (#112) - 일시중지를 위해 대기 중인 인텐트로 포그라운드 서비스를 시작하지 마세요. (#167)
- API 26 및 API 27에서
DefaultNotificationProvider
로 생성된 알림과 관련 있는 '배지'를 수동으로 숨깁니다(API 28 이상에서는 배지가 자동으로 숨겨짐). (#131) - 기존 MediaSession에서 Media3 MediaController로의 두 번째 바인더 연결로 인해 IllegalStateExceptions가 발생하는 버그를 수정했습니다. (#49)
- RTSP:
- IMA:
- FFmpeg 확장 프로그램:
- FFmpeg 라이브러리를 NDK 23.1.7779620 이상과 연결하는 데 필요한 새 플래그를 추가합니다. (#9933)
- AV1 확장 프로그램:
- 최신 Android 스튜디오 버전과의 비호환성을 방지하기 위해 CMake 버전을 업데이트합니다. (#9933)
- Cast 확장 프로그램:
MediaController
로 재생을 제어할 때CastPlayer
를 식별할 수 있도록getDeviceInfo()
를 구현합니다. (#142)
- 변환기:
- 출력 샘플 생성이 너무 느린 경우를 감지하도록 Muxer 워치독 타이머를 추가합니다.
- 지원 중단된 기호 삭제:
Transformer.Builder.setOutputMimeType(String)
을 삭제합니다. 이 기능은 삭제되었습니다. 기본 Muxer를 사용할 경우 MIME 유형은 항상 MP4입니다.
버전 1.0.0-beta02
2022년 7월 21일
androidx.media3:media3-*:1.0.0-beta02
가 출시되었습니다.
버전 1.0.0-beta02에 포함된 커밋을 확인하세요.
이 버전은 ExoPlayer 2.18.1 출시에 해당합니다.
- 핵심 라이브러리:
ShuffleOrder
를ExoPlayer.setShuffleOrder
로 변경하면reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED
를 통해Player.Listener#onTimelineChanged
가 호출됩니다. (#9889)- 점진적 미디어의 경우 선택한 트랙만 버퍼링된 위치에 포함합니다. (#10361)
- 모든 ExoPlayer 로그 출력에 맞춤 로거를 허용합니다. (#9752)
- 경우에 따라 작동하지 않았던
DefaultMediaSourceFactory
의setDataSourceFactory
구현을 수정합니다. (#116)
- 추출기:
- DASH:
- 매니페스트에서 ClearKey 라이선스 URL을 파싱합니다. (#10246)
- UI:
- TalkBack에서 재생 컨트롤 메뉴의 현재 활성 속도 옵션을 알려줍니다. (#10298)
- RTSP:
- VP8 분할 패킷 처리를 추가합니다. (#110)
- Leanback 확장 프로그램:
LeanbackAdapter
의playWhenReady
변경사항을 리슨합니다. (10420)
- 전송:
버전 1.0.0-beta01
2022년 6월 16일
androidx.media3:media3-*:1.0.0-beta01
가 출시되었습니다.
버전 1.0.0-beta01에 포함된 커밋을 확인하세요.
이는 ExoPlayer 2.18.0 출시에 해당합니다.
- 핵심 라이브러리:
MediaMetricsManager
를 통해 Android 플랫폼 진단 지원을 사용 설정합니다. ExoPlayer는 재생 이벤트 및 성능 데이터를 플랫폼에 전달하여 기기의 시스템 성능 및 디버깅 정보를 제공하는 데 도움을 줍니다. 기기 사용자가 사용 및 진단 데이터를 공유하도록 설정한 경우 Google이 이 데이터를 수집할 수도 있습니다. 앱은ExoPlayer.Builder.setUsePlatformDiagnostics(false)
를 사용하여 ExoPlayer의 플랫폼 진단에 기여하는 옵션을 선택 해제할 수 있습니다.MergingMediaSource
를 사용할 때 트랙이 너무 자주 재설정되는 버그를 수정했습니다. 예를 들어 자막을 사이드로드하고 선택한 자막을 재생 중 변경하는 경우가 있습니다. (#10248)- API 29 및 30에서 5G-NSA 네트워크 유형 감지를 중지합니다. 이러한 재생에서는 4G 네트워크를 가정합니다.
MediaSource.Factory.setDrmSessionManagerProvider
및MediaSource.Factory.setLoadErrorHandlingPolicy
에null
을 전달하는 것을 허용하지 않습니다. 필요한 경우DefaultDrmSessionManagerProvider
및DefaultLoadErrorHandlingPolicy
인스턴스를 명시적으로 전달할 수 있습니다.MediaItem.RequestMetadata
를 추가하여 정확한LocalConfiguration
을 알 수 없는 경우 미디어를 재생하는 데 필요한 메타데이터를 나타냅니다. 또한,MediaMetadata.mediaUrl
이 이제RequestMetadata
에 포함되어 있기 때문에 이 속성을 삭제합니다.Player.Command.COMMAND_SET_MEDIA_ITEM
을 추가하여 플레이어가 단일 항목 설정을 허용하도록 합니다.
- 트랙 선택:
TrackSelectionOverrides
클래스를TrackSelectionParameters
로 평면화하고TrackSelectionOverride
를 최상위 클래스로 승격합니다.TracksInfo
를Tracks
로,TracksInfo.TrackGroupInfo
를Tracks.Group
으로 바꿉니다.Player.getCurrentTracksInfo
및Player.Listener.onTracksInfoChanged
또한Player.getCurrentTracks
및Player.Listener.onTracksChanged
로 바뀌었습니다. 여기에는Player.Listener.onTracksChanged
메서드 이름을 '지원 중단하지 않음'이 포함되지만, 다른 매개변수 유형을 사용합니다.- 지원 중단된
DefaultTrackSelector.ParametersBuilder
대신DefaultTrackSelector.Parameters.Builder
를 반환하도록DefaultTrackSelector.buildUponParameters
및DefaultTrackSelector.Parameters.buildUpon
을 변경합니다. - 기본적으로 사용 설정되는
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities
를 추가합니다. 사용 설정된 경우DefaultTrackSelector
는 채널 수가 기기 출력 기능을 초과하지 않는 오디오 트랙을 선호합니다. 휴대기기에서DefaultTrackSelector
는 다중 채널 오디오 형식이 공간(Android 12L+) 오디오일 수 있거나 Dolby 서라운드 사운드 형식이 아닌 이상, 다중 채널 오디오 형식보다 스테레오/모노를 선호합니다. 또한 오디오 공간화를 지원하는 기기에서DefaultTrackSelector
는 Spatializer 속성의 변경을 모니터링하고 이러한 변경이 있는 경우 새 트랙 선택을 트리거합니다.television
UI 모드를 사용하는 기기는 이러한 제약 조건에서 제외되며 채널 수가 가장 많은 형식이 선호됩니다. 이 기능을 사용 설정하려면Context
로DefaultTrackSelector
인스턴스를 구성해야 합니다.
- 동영상:
DummySurface
의 이름을PlaceholderSurface
로 바꿉니다.MediaCodecVideoRenderer.getCodecMaxInputSize
에 AV1 지원을 추가합니다.
- 오디오:
- 비표준 MIME 유형을 광고하는 LG AC3 오디오 디코더를 사용합니다.
- API 21 미만에서 ART 확인이 느린 것을 방지하기 위해
AudioAttributes.getAudioAttributesV21()
의 반환 유형을android.media.AudioAttributes
에서 새로운AudioAttributesV21
래퍼 클래스로 변경합니다. - 형식 오디오 채널 수가 설정되지 않은 경우 오디오 패스 스루를 위해 플랫폼을 쿼리하거나(API 29 이상) 오디오 인코딩 채널 수를 가정하며, 이는 HLS 청크 없는 준비에서 발생합니다. (10204)
- 디코더가 12채널 PCM 오디오를 출력하는 경우 채널 마스크
AudioFormat.CHANNEL_OUT_7POINT1POINT4
로AudioTrack
을 구성합니다. (#10322)
- DRM
- 형식 변경 직후에 탐색할 때 DRM 세션이 항상 올바르게 업데이트되도록 합니다. (10274)
- 텍스트:
List<Cue>
대신CueGroup
을 반환하도록Player.getCurrentCues()
를 변경합니다.- SSA:
BorderStyle == 3
일 때(예:OutlineColour
가 큐의 배경을 설정함)OutlineColour
스타일 설정을 지원합니다. (#8435) - CEA-708: 데이터를 여러 서비스 블록으로 파싱하고 현재 선택한 서비스 번호와 연결되지 않은 블록을 무시합니다.
- Google 내부 자막 형식을 처리하는 데만 사용된
RawCcExtractor
를 삭제합니다.
- 추출기:
- UI:
useController=false
인 경우PlayerView
에 설정된OnClickListener
로 이벤트 전달을 수정합니다. (#9605) 또한 모든 뷰 구성에서OnLongClickListener
로의 이벤트 전달을 수정합니다.ACTION_UP
전에PlayerView
의 경계를 종료하는 터치 이벤트 시퀀스를 클릭으로 잘못 처리하는 문제를 수정했습니다. (#9861)- 탭할 때 컨트롤이 숨겨지는 대신 재생이 전환될 수도 있는
PlayerView
접근성 문제를 수정했습니다. (#8627) ExoPlayer
가 아닌Player
인터페이스에서 작동하도록TrackSelectionView
및TrackSelectionDialogBuilder
를 다시 작성합니다. 이렇게 하면 뷰를 다른Player
구현과 함께 사용할 수 있고 UI 모듈에서 ExoPlayer 모듈로의 종속 항목을 삭제할 수 있습니다. 브레이킹 체인지에 해당합니다.PlayerView
트랙 선택기에서 강제 텍스트 트랙을 표시하지 않고 '없음'이 선택된 경우 적절한 강제 텍스트 트랙을 선택된 상태로 유지합니다. (#9432)
- DASH:
- DTS
AudioChannelConfiguration
요소에서 채널 수를 파싱합니다. 그러면 DTS 스트림의 오디오 패스 스루가 다시 사용 설정됩니다. (#10159) DashMediaSource.Factory.setCompositeSequenceableLoaderFactory
에null
을 전달하는 것을 허용하지 않습니다. 필요한 경우DefaultCompositeSequenceableLoaderFactory
인스턴스를 명시적으로 전달할 수 있습니다.
- DTS
- HLS:
- 재생목록 CODECS 속성에 오디오 코덱이 포함되어 있지 않은 경우 청크 포함 준비로 대체합니다. (#10065)
HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory
,HlsMediaSource.Factory.setPlaylistParserFactory
,HlsMediaSource.Factory.setPlaylistTrackerFactory
에null
을 전달하는 것을 허용하지 않습니다. 필요한 경우DefaultCompositeSequenceableLoaderFactory
,DefaultHlsPlaylistParserFactory
인스턴스 또는DefaultHlsPlaylistTracker.FACTORY
참조를 명시적으로 전달할 수 있습니다.
- 원활한 스트리밍:
SsMediaSource.Factory.setCompositeSequenceableLoaderFactory
에null
을 전달하는 것을 허용하지 않습니다. 필요한 경우DefaultCompositeSequenceableLoaderFactory
인스턴스를 명시적으로 전달할 수 있습니다.
- RTSP:
- H263용 RTP 리더를 추가합니다. (#63)
- MPEG4용 RTP 리더를 추가합니다. (#35)
- HEVC용 RTP 리더를 추가합니다. (#36)
- AMR용 RTP 리더를 추가합니다. 현재 모노 채널의 경우만 인터리브 처리되지 않은 AMR 스트림이 지원됩니다. 복합 AMR RTP 페이로드는 지원되지 않습니다. (#46)
- VP8용 RTP 리더를 추가합니다. (#47)
- WAV용 RTP 리더를 추가합니다. (#56)
- RTSP 기본 승인 헤더를 수정합니다. (#9544)
- ExoPlayer에 필요하지 않으므로 필수 SDP 필드를 더 이상 확인하지 않습니다. (#10049)
- RTSP 타이밍을 파싱할 때 변수가 확인된 예외가 발생합니다. (#10165)
- VP9용 RTP 리더를 추가합니다. (#47)
- OPUS용 RTP 리더를 추가합니다. (#53)
- 데이터 소스:
DummyDataSource
의 이름을PlaceholderDataSource
로 바꿉니다.- OkHttp 인터럽트 처리 문제를 해결합니다.
- 세션:
- 요청의 비동기 해결을 허용하도록
MediaSession.MediaItemFiller
를MediaSession.Callback.onAddMediaItems
로 대체합니다. MediaController
가 기존 미디어 세션에 연결될 때setMediaItems(s)
메서드를 지원합니다.MediaController.setMediaUri
및MediaSession.Callback.onSetMediaUri
를 삭제합니다.MediaController.setMediaItem
및MediaSession.Callback.onAddMediaItems
를 사용하여 동일한 기능을 달성할 수 있습니다.- 레거시
MediaController
호출을 전달하여 미디어를onSetMediaUri
대신MediaSession.Callback.onAddMediaItems
로 재생합니다. MediaNotification.Provider
및DefaultMediaNotificationProvider
를 추가하여 알림 맞춤설정을 제공합니다.- 예술작품 이미지를 다운로드하기 위한
BitmapLoader
및SimpleBitmapLoader
를 추가합니다. MediaSession.setCustomLayout()
을 추가하여 기존 세션과의 하위 호환성을 제공합니다.MediaSession.setSessionExtras()
를 추가하여 기존 세션과의 기능 패리티를 제공합니다.MediaSession.MediaSessionCallback
을MediaSession.Callback
으로,MediaLibrarySession.MediaLibrarySessionCallback
을MediaLibrarySession.Callback
으로,MediaSession.Builder.setSessionCallback
을setCallback
으로 바꿉니다.MediaControllerImplLegacy
의 NPE를 수정합니다. (#59)- 타임라인 변경 시 세션 위치 정보를 업데이트합니다. (#51)
- 컨트롤러 출시 후
MediaControllerImplBase
의 NPE를 수정합니다. (#74)
- 요청의 비동기 해결을 허용하도록
- 광고 재생/IMA:
- 미디어 평가 위원회(MRC) 추천에 맞게 광고 폴링 속도를 100밀리초 빈도에서 200밀리초 빈도로 줄입니다.
- FFmpeg 확장 프로그램:
- Android 스튜디오의 Gradle 동기화 실패를 야기하는 CMake 버그를 방지하기 위해 CMake 버전을
3.21.0+
로 업데이트합니다. (#9933)
- Android 스튜디오의 Gradle 동기화 실패를 야기하는 CMake 버그를 방지하기 위해 CMake 버전을
- 지원 중단된 기호 삭제:
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
를 삭제합니다. 대신Player.Listener.onTracksChanged(Tracks)
를 사용합니다.Player.getCurrentTrackGroups
및Player.getCurrentTrackSelections
를 삭제합니다. 대신Player.getCurrentTracks
를 사용합니다.ExoPlayer.getCurrentTrackGroups
및ExoPlayer.getCurrentTrackSelections
를 계속 사용할 수도 있지만 이러한 메서드는 지원 중단된 상태입니다.DownloadHelper
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
및DEFAULT_TRACK_SELECTOR_PARAMETERS
상수가 삭제됩니다. 가능하다면getDefaultTrackSelectorParameters(Context)
를 대신 사용하고 그렇지 않으면DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT
를 사용합니다.- 생성자
DefaultTrackSelector(ExoTrackSelection.Factory)
가 삭제됩니다. 대신DefaultTrackSelector(Context, ExoTrackSelection.Factory)
를 사용합니다. Transformer.Builder.setContext
가 삭제됩니다. 대신Context
를Transformer.Builder
생성자에 전달해야 합니다.
버전 1.0.0-alpha03
2022년 3월 14일
androidx.media3:media3-*:1.0.0-alpha03
가 출시되었습니다.
버전 1.0.0-alpha03에 포함된 커밋을 확인하세요.
이는 ExoPlayer 2.17.1 출시에 해당합니다.
- 오디오:
- HLS에서 Dolby Atmos(E-AC3-JOC)의 오디오 기능을 확인하는 중에 발생하는 오류를 수정했습니다.
- 추출기:
- FMP4: v0 및 v1 emsg atom이 모두 포함된 스트림에 관해 emsg 샘플 메타데이터가 잘못된 순서로 출력될 수 있는 문제를 수정했습니다. (#9996)
- 텍스트:
SubtitleConfiguration
필드의 우선순위를 지정하고 설정되지 않은 경우Factory
값으로 대체하도록SingleSampleMediaSource.Factory.setTrackId
및MediaItem.SubtitleConfiguration.Builder.setId
의 상호작용을 수정합니다. (#10016)
- 광고 재생:
- 실시간 HLS SSAI 스트림에서 광고 기간 사이의 오디오 언더런을 수정합니다.
버전 1.0.0-alpha02
2022년 3월 2일
androidx.media3:media3-*:1.0.0-alpha02
가 출시되었습니다.
버전 1.0.0-alpha02에 포함된 커밋을 확인하세요.
이는 ExoPlayer 2.17.0 출시에 해당합니다.
- 핵심 라이브러리:
buildVideoRenderers()
또는buildAudioRenderers()
를 재정의하는DefaultRenderersFactory
의 서브클래스가 코덱 어댑터 팩토리에 액세스하여 자신이 만든MediaCodecRenderer
인스턴스에 이를 전달할 수 있도록 보호된 메서드DefaultRenderersFactory.getCodecAdapterFactory()
를 추가합니다.Player.Listener.onMediaMetadataChanged()
를 통해 앱에 도달할 수 있도록 ICY 헤더 필드name
및genre
를 각각MediaMetadata.station
및MediaMetadata.genre
에 전파합니다. (#9677)DefaultHttpDataSource#getResponseHeaders
에서 null 키를 삭제합니다.MediaCodec
인스턴스 생성이 실패하면 절전 모드로 들어가 다시 시도합니다. 이렇게 하면 보안 코덱에서 다른 코덱으로 표시 경로를 전환할 때 일부 기기에서 발생하는 문제를 피할 수 있습니다. (#8696)- 사용자가
MediaCodec
에서 측정항목 데이터를 가져올 수 있도록MediaCodecAdapter.getMetrics()
를 추가합니다. (#9766) - Maven 종속 항목 해결을 수정합니다. (#8353)
- 지연 시간이 짧은 기능도 없고 속도 설정을 위한 사용자 요청도 없는 실시간 스트림에는 자동 속도 조정을 사용 중지합니다. (#9329)
DecoderCounters#inputBufferCount
의 이름을queuedInputBufferCount
로 바꿉니다.SimpleExoPlayer.renderers
를 비공개로 설정합니다. 렌더기에는ExoPlayer.getRenderer
를 통해 액세스할 수 있습니다.- 일부
AnalyticsListener.EventFlags
상수 값이Player.EventFlags
의 값과 일치하도록 업데이트되었습니다. - 앱에 필요하지 않은 경우 R8을 통해 제거할 수 있도록
AnalyticsCollector
를 인터페이스와 기본 구현으로 분할합니다.
- 트랙 선택:
- 트랙 선택 시 선호하는 동영상 역할 플래그를 지원합니다. (#9402)
- 조정할 여러 동영상 트랙을 선택할 때 선호하는 MIME 유형과 역할 플래그를 고려하도록 동영상 트랙 선택 로직을 업데이트합니다. (#9519)
- 조정 대상을 선택할 때 디코더 및 하드웨어 지원 수준이 동일한 형식만 선택하도록 동영상 및 오디오 트랙 선택 로직을 업데이트합니다. (#9565)
- 기본 하드웨어 가속 디코더가 여러 코덱을 지원하는 경우 더 효율적인 코덱을 우선 사용하도록 동영상 트랙 선택 로직을 업데이트합니다. (#4835)
- 기술적 트랙 선택 제약 조건(예: 선호되는 MIME 유형 또는 최대 채널 수)보다 오디오 콘텐츠 환경설정(예: '기본' 오디오 트랙 또는 시스템 언어와 일치하는 트랙)을 우선 적용합니다.
- 한 트랙 그룹을 재정의해도 동일한 유형의 다른 트랙 그룹은 중지되지 않는 트랙 선택 문제를 수정합니다. (#9675)
- 비어 있지 않은 트랙 재정의와 빈 트랙 재정의의 조합이 제대로 적용되지 않는 트랙 선택 문제를 수정합니다. (#9649)
TrackGroupArray
에서 중복된TrackGroup
을 금지합니다.TrackGroup
은TrackGroup
생성자에id
를 설정하여 언제든지 구별할 수 있습니다. 이를 통해 활성 트랙 재정의로 앱을 백그라운드로 전환한 후 재생을 다시 시작할 때 발생하는 비정상 종료가 수정됩니다. (#9718)- 라이브 에지와 매우 가까운 곳에서 재생되더라도 네트워크 대역폭이 충분하면 품질이 향상될 수 있도록
AdaptiveTrackSelection
의 로직을 수정합니다. (#9784)
- 동영상:
- 필요한 경우 호환되는 H264/H265 디코더를 사용하도록 Dolby Vision의 디코더 대체 로직을 수정합니다.
- 오디오:
- 필요한 경우 호환되는 E-AC3 디코더를 사용하도록 Dolby Atmos(E-AC3-JOC)의 디코더 대체 로직을 수정합니다.
null
대신AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES
를 명시적으로 전달할 것을 요구하도록AudioCapabilities
API를 변경합니다.AudioTrackBufferSizeProvider
를DefaultAudioSink
에 삽입하여AudioTrack
버퍼 사이즈 계산의 맞춤설정을 허용합니다. (#8891)- 요청된 버퍼 사이즈가 1MB를 초과하는 경우
AudioTrack
생성을 다시 시도합니다. (#9712)
- 추출기:
- 텍스트:
- DRM:
DrmSessionManager.(pre)acquireSession
에서playbackLooper
를 삭제합니다. 맞춤MediaSource
에서 앱이DrmSessionManager
를 사용하는 경우 대신playbackLooper
를DrmSessionManager.setPlayer
에 전달해야 합니다.
- 광고 재생/IMA:
- IMA 동적 광고 삽입(DAI) 지원을 추가합니다. (#8213)
- 광고그룹을 재설정하여 다시 재생할 수 있도록
AdPlaybackState
에 메서드를 추가합니다. (#9615) - 광고 재생 중에는 재생 속도를 1.0으로 적용합니다. (#9018)
- 로드되지 않은 광고그룹으로 인해 재생이 즉시 재설정되는 문제를 해결합니다. (#9929)
- UI:
- DASH:
- HLS:
- RTSP:
- 변환기:
- 필요한 최소 API 버전을 21로 높입니다.
- 이제 변환 중에 발생하는 오류를 설명하는 데
TransformationException
이 사용됩니다. - 변환 옵션을 지정하기 위한
TransformationRequest
를 추가합니다. - 여러 리스너를 등록할 수 있도록 허용합니다.
- 코덱 출력을 부분적으로 읽었을 때 변환기가 멈추는 문제를 수정합니다.
- Muxer가 해제될 때
Transformer.getProgress
의 잠재적 NPE를 수정합니다. - 변환 적용을 위한 데모 앱을 추가합니다.
- MediaSession 확장 프로그램:
- 기본적으로 이제
MediaSessionConnector
는 중지 시 재생목록을 지웁니다. 재생목록을 보관하려는 앱은 커넥터에서setClearMediaItemsOnStop(false)
를 호출할 수 있습니다.
- 기본적으로 이제
- Cast 확장 프로그램:
- FFmpeg 확장 프로그램:
build_ffmpeg.sh
가 GNU의 bin utils 대신 LLVM의 bin utils를 사용하도록 설정합니다. (#9933)
- Android 12 호환성:
com.google.android.gms:play-services-cast-framework:20.1.0
을 사용하도록 Cast 확장 프로그램을 업그레이드합니다. 이전 버전의play-services-cast-framework
는 Android 12를 타겟팅하는 앱과 호환되지 않으며,PendingIntent
를 생성할 때IllegalArgumentException
과 함께 비정상 종료됩니다. (#9528)
- 지원 중단된 기호 삭제:
Player.EventListener
를 삭제합니다. 대신Player.Listener
를 사용합니다.MediaSourceFactory#setDrmSessionManager
,MediaSourceFactory#setDrmHttpDataSourceFactory
,MediaSourceFactory#setDrmUserAgent
가 삭제됩니다. 대신MediaSourceFactory#setDrmSessionManagerProvider
를 사용합니다.MediaSourceFactory#setStreamKeys
가 삭제됩니다. 대신MediaItem.Builder#setStreamKeys
를 사용합니다.MediaSourceFactory#createMediaSource(Uri)
가 삭제됩니다. 대신MediaSourceFactory#createMediaSource(MediaItem)
을 사용합니다.DashMediaSource
,HlsMediaSource
,SsMediaSource
에서setTag
가 삭제됩니다. 대신MediaItem.Builder#setTag
를 사용합니다.DashMediaSource#setLivePresentationDelayMs(long, boolean)
을 삭제합니다. 매니페스트를 재정의하려면MediaItem.Builder#setLiveConfiguration
과MediaItem.LiveConfiguration.Builder#setTargetOffsetMs
를 사용하고 대체 값을 제공하려면DashMediaSource#setFallbackTargetLiveOffsetMs
를 사용합니다.(Simple)ExoPlayer.setThrowsWhenUsingWrongThread
가 삭제됩니다. 더 이상 스레드 적용을 선택 해제할 수 없습니다.ActionFile
및ActionFileUpgradeUtil
이 삭제됩니다.ActionFileUpgradeUtil
을 사용하여 기존 작업 파일을DefaultDownloadIndex
에 병합하려면 ExoPlayer 2.16.1 이전 버전을 사용합니다.ProgressiveMediaSource#setExtractorsFactory
가 삭제됩니다. 대신ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)
생성자를 사용합니다.ProgressiveMediaSource.Factory#setTag
및ProgressiveMediaSource.Factory#setCustomCacheKey
가 삭제됩니다. 대신MediaItem.Builder#setTag
및MediaItem.Builder#setCustomCacheKey
를 사용합니다.DefaultRenderersFactory(Context, @ExtensionRendererMode int)
및DefaultRenderersFactory(Context, @ExtensionRendererMode int, long)
생성자가 삭제됩니다. 대신DefaultRenderersFactory(Context)
생성자와DefaultRenderersFactory#setExtensionRendererMode
및DefaultRenderersFactory#setAllowedVideoJoiningTimeMs
를 사용합니다.- 모든 공개
CronetDataSource
생성자가 삭제됩니다. 대신CronetDataSource.Factory
를 사용합니다.
- 다음
IntDefs
만@Target(TYPE_USE)
로 변경됩니다. 이로 인해 Kotlin에서 사용 관련 컴파일이 중단될 수 있습니다. 주석을 이동하여 유형(Int
)을 주석 처리함으로써 문제를 해결할 수 있습니다.@AacAudioObjectType
@Ac3Util.SyncFrameInfo.StreamType
@AdLoadException.Type
@AdtsExtractor.Flags
@AmrExtractor.Flags
@AspectRatioFrameLayout.ResizeMode
@AudioFocusManager.PlayerCommand
@AudioSink.SinkFormatSupport
@BinarySearchSeeker.TimestampSearchResult.Type
@BufferReplacementMode
@C.BufferFlags
@C.ColorRange
@C.ColorSpace
@C.ColorTransfer
@C.CryptoMode
@C.Encoding
@C.PcmEncoding
@C.Projection
@C.SelectionReason
@C.StereoMode
@C.VideoOutputMode
@CacheDataSource.Flags
@CaptionStyleCompat.EdgeType
@DataSpec.Flags
@DataSpec.HttpMethods
@DecoderDiscardReasons
@DecoderReuseResult
@DefaultAudioSink.OutputMode
@DefaultDrmSessionManager.Mode
@DefaultTrackSelector.SelectionEligibility
@DefaultTsPayloadReaderFactory.Flags
@EGLSurfaceTexture.SecureMode
@EbmlProcessor.ElementType
@ExoMediaDrm.KeyRequest.RequestType
@ExtensionRendererMode
@Extractor.ReadResult
@FileTypes.Type
@FlacExtractor.Flags
(com.google.android.exoplayer2.ext.flac
패키지 내)@FlacExtractor.Flags
(com.google.android.exoplayer2.extractor.flac
패키지 내)@FragmentedMp4Extractor.Flags
@HlsMediaPlaylist.PlaylistType
@HttpDataSourceException.Type
@IllegalClippingException.Reason
@IllegalMergeException.Reason
@LoadErrorHandlingPolicy.FallbackType
@MatroskaExtractor.Flags
@Mp3Extractor.Flags
@Mp4Extractor.Flags
@NotificationUtil.Importance
@PlaybackException.FieldNumber
@PlayerNotificationManager.Priority
@PlayerNotificationManager.Visibility
@PlayerView.ShowBuffering
@Renderer.State
@RendererCapabilities.AdaptiveSupport
@RendererCapabilities.Capabilities
@RendererCapabilities.DecoderSupport
@RendererCapabilities.FormatSupport
@RendererCapabilities.HardwareAccelerationSupport
@RendererCapabilities.TunnelingSupport
@SampleStream.ReadDataResult
@SampleStream.ReadFlags
@StyledPlayerView.ShowBuffering
@SubtitleView.ViewType
@TextAnnotation.Position
@TextEmphasisSpan.MarkFill
@TextEmphasisSpan.MarkShape
@Track.Transformation
@TrackOutput.SampleDataPart
@Transformer.ProgressState
@TsExtractor.Mode
@TsPayloadReader.Flags
@WebvttCssStyle.FontSizeUnit
버전 1.0.0-alpha01
2021년 10월 27일
androidx.media3:media3-*:1.0.0-alpha01
가 출시되었습니다.
버전 1.0.0-alpha01에 포함된 커밋을 확인하세요.
새로운 기능
Media3은 ExoPlayer 등의 미디어 지원 라이브러리를 위한 새로운 공간입니다. 첫 번째 알파 버전에는 다음과 같은 미디어 사용 사례 구현을 위한 라이브러리의 초기 기능 구현이 포함되어 있습니다.
- 맞춤설정과 확장이 쉬운 Android용 애플리케이션 수준 미디어 플레이어인 ExoPlayer.
- 재생을 노출하고 제어하는 미디어 세션 기능. 이 새로운 세션 모듈은 ExoPlayer와 같은
Player
인터페이스를 사용합니다. - 미디어 재생 사용자 인터페이스를 빌드하는 UI 구성요소.
- ExoPlayer와 함께 사용할 다른 라이브러리의 모듈 래핑 기능(예: IMA SDK를 통한 광고 삽입).
자세한 내용은 Media3 GitHub 프로젝트를 참고하세요.
ExoPlayer는 이전에 별도의 ExoPlayer GitHub 프로젝트에서 호스팅되었습니다. Media3에서 패키지 이름은
androidx.media3.exoplayer
입니다. Google에서는 앱에 Media3으로 이전할 시간을 제공하기 위해 한동안 ExoPlayer GitHub 프로젝트를 계속 유지하고 출시할 계획입니다. Media3은 모든 ExoPlayer 모듈을 대체합니다. 단, 기존 media2 및 mediasession 확장 프로그램은 예외인데 이는 새 media3-session
모듈로 대체됩니다. 따라서 어댑터/커넥터 클래스를 사용하지 않고도 플레이어와 미디어 세션을 직접 통합할 수 있습니다.