Media3
Ostatnia aktualizacja | Wersja stabilna | Wersja kandydująca | Wersja Beta | Wersja alfa |
---|---|---|---|---|
20 grudnia 2024 r. | 1.5.1 | - | - | 1.6.0-alpha01 |
Deklarowanie zależności
Aby dodać zależność od Media3, musisz dodać repozytorium Google Maven do projektu. Więcej informacji znajdziesz w repozytorium Maven firmy Google.
Dodaj zależności dla artefaktów, których potrzebujesz, w pliku build.gradle
aplikacji lub modułu:
Odlotowe
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") }
Więcej informacji o zależnościach znajdziesz w artykule Dodawanie zależności kompilacji.
Opinia
Twoja opinia pomoże nam ulepszyć Jetpacka. Korzystając z śledzika problemów z Media3, możesz znaleźć odpowiedzi na pytania, zgłaszać znane problemy i zgłaszać prośby o dodanie funkcji oraz zgłaszać nowe problemy.
Wersja 1.6.0
Wersja 1.6.0-alpha01
20 grudnia 2024 r.
androidx.media3:media3-*:1.6.0-alpha01
został zwolniony.
Wersja 1.6.0-alpha01 zawiera te komity.
- Biblioteka wspólna:
- Usuń metodę
Format.toBundle(boolean excludeMetadata)
i użyj zamiast niej metodyFormat.toBundle()
. - Dodaj
AudioManagerCompat
iAudioFocusRequestCompat
, aby zastąpić klasy równoważne wandroidx.media
.
- Usuń metodę
- ExoPlayer:
- Wybierając ścieżkę wideo, weź pod uwagę język. Domyślnie wybierana jest „główna” ścieżka wideo w języku dopasowanym do wybranej ścieżki audio (jeśli jest dostępna). Preferencje dotyczące języka filmu z wulgaryzmami można określić za pomocą
TrackSelectionParameters.Builder.setPreferredVideoLanguage(s)
. - Dodaj parametr
selectedAudioLanguage
do metodyDefaultTrackSelector.selectVideoTrack()
. - Dodaj parametr
retryCount
do metodMediaSourceEventListener.onLoadStarted
iMediaSourceEventListener.EventDispatcher
. - Rozwiązanie problemu, w którym elementy playlisty lub okresy w strumieniach DASH z wieloma okresami o czas trwania niepasującym do rzeczywistej zawartości mogły powodować zablokowanie klatek na końcu elementu (#1698).
- Zmniejsz domyślne wartości parametrów
bufferForPlaybackMs
ibufferForPlaybackAfterRebufferMs
w sekcjiDefaultLoadControl
do odpowiednio 1000 i 2000 ms. - Dodaj
MediaExtractorCompat
, nową klasę, która zapewnia funkcje równoważne platformieMediaExtractor
. - Przenieś
BasePreloadManager.Listener
do poziomu najwyższego poziomuPreloadManagerListener
. RenderersFactory.createSecondaryRenderer
można wdrożyć, aby zapewnić wstępne podgrzanie w przypadku dodatkowych mechanizmów renderowania. Wstępna optymalizacja umożliwia szybsze przełączanie się między elementami multimediów podczas odtwarzania.- Włączanie wysyłania
CmcdData
w przypadku żądań manifestu w formacie adaptacyjnego strumieniowego przesyłania danych DASH, HLS i SmoothStreaming (#1951). - Podaj
MediaCodecInfo
kodeka, który zostanie zainicjowany w funkcjiMediaCodecRenderer.onReadyToInitializeCodec
(#1963). - Zmień
AdsMediaSource
, aby umożliwićAdPlaybackStates
zwiększanie się przez dodawanie grup reklam. Nieprawidłowe modyfikacje są wykrywane i wyjątek jest zgłaszany.
- Wybierając ścieżkę wideo, weź pod uwagę język. Domyślnie wybierana jest „główna” ścieżka wideo w języku dopasowanym do wybranej ścieżki audio (jeśli jest dostępna). Preferencje dotyczące języka filmu z wulgaryzmami można określić za pomocą
- Transformator:
- Zaktualizuj parametry
VideoFrameProcessor.registerInputStream
iVideoFrameProcessor.Listener.onInputStreamRegistered
, aby używaćFormat
. - Dodać obsługę transmuxowania do alternatywnych formatów zgodnych wstecznie.
- wygenerować metadane statyczne HDR, gdy używasz
DefaultEncoderFactory
;
- Zaktualizuj parametry
- Wyodrębnianie:
- AVI: rozwiązanie problemu z obsługą plików z dźwiękiem skompresowanym z stałym bitrate, w których nagłówek strumienia przechowuje liczbę bajtów zamiast liczby fragmentów.
- Dźwięk:
- Naprawić funkcję
onAudioPositionAdvancing
, aby była wywoływana po wznowieniu odtwarzania (wcześniej była wywoływana po wstrzymaniu odtwarzania).
- Naprawić funkcję
- Film:
- Popraw
MediaCodecVideoRenderer
tak, aby w przypadku brakuSurface
renderowanie pomijało tylko te ramki, które są zbyt wczesne, jeśliVideoFrameReleaseControl.getFrameReleaseAction
nie jestFRAME_RELEASE_TRY_AGAIN_LATER
.
- Popraw
- Tekst:
- Zatrzymaj pospieszne wczytywanie wszystkich plików napisów skonfigurowanych za pomocą parametru
MediaItem.Builder.setSubtitleConfigurations
i zamiast tego wczytuj tylko jeden, jeśli został wybrany przez funkcję wyboru ścieżki (#1721).
- Zatrzymaj pospieszne wczytywanie wszystkich plików napisów skonfigurowanych za pomocą parametru
- Skutek:
- Przeniesiono funkcje
OverlaySettings
doStaticOverlaySettings
.OverlaySettings
może być podklasą, aby umożliwić dynamiczne ustawienia nakładki.
- Przeniesiono funkcje
- Muxers:
- Aby uniknąć bardzo długiej nazwy,
MuxerException
zostało przeniesione poza interfejsMuxer
.
- Aby uniknąć bardzo długiej nazwy,
- Sesja:
- Dodaj „Context” jako parametr do metody „MediaButtonReceiver.shouldStartForegroundService” (#1887).
- UI:
- Dodaj kompozyt
PlayerSurface
do modułumedia3-ui-compose
. - Dodaj do modułu
media3-ui-compose
klasyPlayPauseButtonState
,NextButtonState
,PreviousButtonState
,RepeatButtonState
iShuffleButtonState
oraz odpowiadające im komponentyrememberPlayPauseButtonState
,rememberNextButtonState
,rememberPreviousButtonState
,rememberRepeatButtonState
irememberShuffleButtonState
.
- Dodaj kompozyt
- Rozszerzenie HLS:
- Dodaj pierwszą wersję
HlsInterstitialsAdsLoader
. Ładowarka reklam odczytuje reklamy pełnoekranowe HLS z playlisty multimediów HLS i przypisze je doAdPlaybackState
, który jest przekazywany doAdsMediaSource
. Ta początkowa wersja obsługuje tylko strumienie HLS VOD z atrybutamiX-ASSET-URI
. - Dodaj
HlsInterstitialsAdsLoader.AdsMediaSourceFactory
. Aplikacje mogą go używać do tworzenia instancjiAdsMediaSource
, które korzystają zHlsInterstitialsAdsLoader
w wygodny i bezpieczny sposób.
- Dodaj pierwszą wersję
- Rozszerzenie DASH:
- Dodaj obsługę formatu AC-4 poziomu 4 dla DASH (#1898).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Dodaj moduł dekodera MPEG-H, który używa natywnego modułu dekodera MPEG-H do dekodowania dźwięku MPEG-H (#1826).
- Aplikacja demonstracyjna:
- Dodaj elementy interfejsu
MinimalControls
(PlayPauseButton
,NextButton
,PreviousButton
) iExtraControls
(RepeatButton
,ShuffleButton
) dodemo-compose
, korzystając z elementówPlayPauseButtonState
,NextButtonState
,PreviousButtonState
,RepeatButtonState
iShuffleButtonState
.
- Dodaj elementy interfejsu
- Usuń symbole wycofane:
- Usuń wycofaną metodę
AudioMixer.create()
. Zamiast tego użyj atrybutuDefaultAudioMixer.Factory().create()
. - Usuń te wycofane metody
Transformer.Builder
:setTransformationRequest()
, użyj zamiast niej zasadsetAudioMimeType()
,setVideoMimeType()
isetHdrMode()
.setAudioProcessors()
, ustaw procesor audio wEditedMediaItem.Builder.setEffects()
i przekaż go doTransformer.start()
.setVideoEffects()
, ustaw efekt wideo wEditedMediaItem.Builder.setEffects()
i przekaż go doTransformer.start()
.setRemoveAudio()
, użyjEditedMediaItem.Builder.setRemoveAudio()
, aby usunąć dźwięk zEditedMediaItem
przekazanego doTransformer.start()
.setRemoveVideo()
, użyjEditedMediaItem.Builder.setRemoveVideo()
, aby usunąć film zEditedMediaItem
przekazanego doTransformer.start()
.setFlattenForSlowMotion()
, użyj funkcjiEditedMediaItem.Builder.setFlattenForSlowMotion()
, aby spłaszczyć obiektEditedMediaItem
przekazywany do funkcjiTransformer.start()
.setListener()
, użyj zamiast niej zasadaddListener()
,removeListener()
lubremoveAllListeners()
.
- Usuń te wycofane metody
Transformer.Listener
:onTransformationCompleted(MediaItem)
, użyj zamiast tegoonCompleted(Composition, ExportResult)
.onTransformationCompleted(MediaItem, TransformationResult)
, użyj zamiast tegoonCompleted(Composition, ExportResult)
.onTransformationError(MediaItem, Exception)
, użyj zamiast tegoonError(Composition, ExportResult, ExportException)
.onTransformationError(MediaItem, TransformationException)
, użyj zamiast tegoonError(Composition, ExportResult, ExportException)
.onTransformationError(MediaItem, TransformationResult, TransformationException)
, użyj zamiast tegoonError(Composition, ExportResult, ExportException)
.onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest)
, użyj zamiast tegoonFallbackApplied(Composition, TransformationRequest, TransformationRequest)
.
- Usuń wycofane zajęcia
TransformationResult
. Zamiast tego użyj polaExportResult
. - Usuń wycofane zajęcia
TransformationException
. Zamiast tego użyj polaExportException
. - Usuń wycofany element
Transformer.PROGRESS_STATE_NO_TRANSFORMATION
. Zamiast tego użyj atrybutuTransformer.PROGRESS_STATE_NOT_STARTED
. - Usuń wycofany element
Transformer.setListener()
. Zamiast niej użyj właściwościTransformer.addListener()
,Transformer.removeListener()
lubTransformer.removeAllListeners()
. - Usuń wycofany element
Transformer.startTransformation()
. Zamiast tego użyjTransformer.start(MediaItem, String)
. - Usuń wycofany element
SingleFrameGlShaderProgram
. Zamiast tego użyj atrybutuBaseGlShaderProgram
. - Usuń
Transformer.flattenForSlowMotion
. Zamiast tego użyj atrybutuEditedMediaItem.flattenForSlowMotion
.
- Usuń wycofaną metodę
Wersja 1.5
Wersja 1.5.1
19 grudnia 2024 r.
androidx.media3:media3-*:1.5.1
został zwolniony.
Wersja 1.5.1 zawiera te komitowane zmiany.
- ExoPlayer:
- Aby uniknąć problemów z czasem oczekiwania na dekodowanie w przypadku kodeków, wyłącz użycie asynchronicznego dekodowania w MediaCodec (problem 1641).
- Wyodrębnianie:
- MP3: nie przerywaj odtwarzania, gdy spis treści
VBRI
nie obejmuje wszystkich danych MP3 w pliku (#1904).
- MP3: nie przerywaj odtwarzania, gdy spis treści
- Film:
- Przywrócenie korzystania z wartości współczynnika proporcji piksela podanego w
MediaCodecAdapter
podczas przetwarzaniaonOutputFormatChanged
(#1371).
- Przywrócenie korzystania z wartości współczynnika proporcji piksela podanego w
- Tekst:
- Naprawiono błąd w
ReplacingCuesResolver.discardCuesBeforeTimeUs
, w którym cue aktywny w czasietimeUs
(rozpoczęty wcześniej, ale jeszcze nie zakończony) został błędnie odrzucony (#1939).
- Naprawiono błąd w
- Metadane:
- Wyodrębnij numerację dysków/ścieżek i gatunek z komentarzy Vorbis do pliku
MediaMetadata
(#1958).
- Wyodrębnij numerację dysków/ścieżek i gatunek z komentarzy Vorbis do pliku
Wersja 1.5.0
27 listopada 2024 r.
androidx.media3:media3-*:1.5.0
został zwolniony.
Wersja 1.5.0 zawiera te komity.
- Biblioteka wspólna:
- Dodaj
ForwardingSimpleBasePlayer
, który umożliwia przekierowanie do innego odtwarzacza z niewielkimi zmianami, zapewniając przy tym pełną spójność i obsługę odbiorcy (#1183). - Zastąp metodę
SimpleBasePlayer.State.playlist
metodągetPlaylist()
. - Dodaj zastąpienie dla
SimpleBasePlayer.State.Builder.setPlaylist()
, aby bezpośrednio określićTimeline
oraz bieżąceTracks
iMetadata
zamiast tworzyć strukturę playlisty. - Zwiększ
minSdk
do 21 (Android Lollipop). Jest to zgodne ze wszystkimi innymi bibliotekami AndroidX. - Dodaj element
androidx.media3:media3-common-ktx
, który zapewnia funkcje związane z językiem Kotlin i oparte na bibliotece wspólnej. - Dodaj do biblioteki
media3-common-ktx
funkcjęPlayer.listen
zawieszającą rozszerzenie, aby uruchomić coroutine, która będzie słuchaćPlayer.Events
. - Usuń adnotacje
@DoNotInline
z ręcznie wylistowanych wewnętrznych klas, aby uniknąć błędów weryfikacji klasy w czasie wykonywania. Najnowsze wersje R8 automatycznie wywołują takie wywołania offline, aby uniknąć błędów w czasie wykonywania (nie jest już wymagane ręczne wywoływanie offline). Wszyscy użytkownicy biblioteki Gradle muszą już używać wersji wtyczki Gradle dla Androida, która korzysta z wersji R8, która to z kolei wykorzystujecompileSdk = 35
. Użytkownicy biblioteki korzystający z systemów kompilacji innych niż Gradle muszą zadbać o to, aby ich krok kompresji/zaciemnienia odpowiadający R8 wykonywał podobny automatyczny proces wyodrębniania, aby uniknąć błędów weryfikacji klasy w czasie wykonywania. Ta zmiana została już wprowadzona w innych bibliotekach AndroidX.
- Dodaj
- ExoPlayer:
MediaCodecRenderer.onProcessedStreamChange()
może teraz dzwonić do użytkownika w przypadku każdego elementu multimedialnego. Wcześniej nie był on wywoływany w przypadku pierwszego. Aby to zrobić, kliknijMediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart()
.- Dodaj element
PreloadMediaSource.PreloadControl.onPreloadError
, aby umożliwić implementacjomPreloadMediaSource.PreloadControl
wykonywanie działań w przypadku wystąpienia błędu. - Dodaj
BasePreloadManager.Listener
, aby rozpowszechniać zdarzenia wstępnego wczytania w aplikacjach. - Zezwalanie na zmianę limitu czasu klienta SNTP i ponowne próby wysyłania do adresów alternatywnych w przypadku przekroczenia limitu czasu (problem 1540).
- Usuń
MediaCodecAdapter.Configuration.flags
, ponieważ pole zawsze zawierało wartość zero. - Zezwalanie użytkownikowi na wybór wbudowanego głośnika do odtwarzania na Wear OS API 35 lub nowszy (gdzie urządzenie reklamuje obsługę tej funkcji).
- Odrocz blokowanie połączenia z numerem
Context.getSystemService(Context.AUDIO_SERVICE)
do momentu włączenia obsługi skupienia na dźwięku. Dzięki temu nie dochodzi do blokowania połączeń, jeśli nie jest włączone obsługiwanie dźwięku w przypadku skupienia (#1616). - Zezwalanie na odtwarzanie niezależnie od czasu buforowania w przypadku niepowodzenia wczytywania (#1571).
- Dodaj
AnalyticsListener.onRendererReadyChanged()
, aby zasygnalizować, że poszczególne procesory graficzne są gotowe do odtwarzania. - Naprawiono błąd, który powodował, że
MediaCodec.CryptoException
był czasami zgłaszany jako „nieoczekiwany błąd podczas działania”, gdyMediaCodec.CryptoException
działał w trybie asynchronicznym (domyślne zachowanie w wersji interfejsu API 31 lub nowszej).MediaCodec
- Zamiast
bufferedPositionUs
podajbufferedDurationUs
wPreloadMediaSource.PreloadControl.onContinueLoadingRequested()
. ZmianaDefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS
naDefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS
powoduje, że aplikacje muszą przekazać wartość reprezentującą konkretny czas trwania od domyślnej pozycji początkowej, dla której odpowiednie źródło multimediów musi zostać wstępnie załadowane za pomocą tej definicji typu int, zamiast pozycji. - Dodaj implementację
ForwardingRenderer
, która przekierowuje wszystkie wywołania metod do innego renderera (1703). - Dodaj wstępne wczytywanie playlisty dla następnego elementu na playliście. Aplikacje mogą włączyć wstępny wczyt, wywołując funkcję
ExoPlayer.setPreloadConfiguration(PreloadConfiguration)
. Wstępne wczytywanie jest domyślnie wyłączone. Gdy ta opcja jest włączona, aby nie zakłócać odtwarzania,DefaultLoadControl
ogranicza wstępne wczytywanie do rozpoczęcia i kontynuowania tylko wtedy, gdy odtwarzacz nie wczytuje się do odtwarzania. Aplikacje mogą zmieniać to zachowanie, stosując odpowiednio funkcjęLoadControl.shouldContinuePreloading()
(np. przez zastąpienie tej metody w funkcjiDefaultLoadControl
). Domyślna implementacja funkcjiLoadControl
wyłącza wstępny wczyt, jeśli aplikacja używa niestandardowej implementacji funkcjiLoadControl
. - Dodaj metodę
MediaSourceEventListener.EventDispatcher.dispatchEvent()
, aby umożliwić wywoływanie zdarzeń detektorów podklas (1736). - Dodaj
DefaultPreloadManager.Builder
, który tworzy wystąpieniaDefaultPreloadManager
iExoPlayer
z konsekwentnie współdzielonymi konfiguracjami. - Usuń parametr
Renderer[]
z funkcjiLoadControl.onTracksSelected()
, ponieważ implementacjaDefaultLoadControl
może pobierać typy strumieni z funkcjiExoTrackSelection[]
. - Wycofana metoda
DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])
została oznaczona jako ostateczna, aby zapobiec jej zastąpieniu. Zamiast tego należy używać nowego elementuDefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])
. - Raportowanie zdarzeń
MediaSourceEventListener
ze źródeł dodatkowych wMergingMediaSource
. Spowoduje to zgłoszenie zdarzeń rozpoczęcia, błędu, anulowania i zakończenia wczytywania dla wczytanych z zewnętrznego napisów (dodanych za pomocąMediaItem.LocalConfiguration.subtitleConfigurations
), które mogą być wyświetlane jako zduplikowane zdarzenia wczytywania emitowane przezAnalyticsListener
. - zapobieganie błędom związanym z napisami i metadanymi, które mogą całkowicie zatrzymać odtwarzanie;
Zamiast tego wyłączyliśmy problemowy utwór, a pozostałe utwory będą odtwarzane dalej (#1722).
- W przypadku nowej obsługi napisów (podczas wyodrębniania) powiązane błędy analizy (np. nieprawidłowe dane napisów) i błędy wczytywania (np. HTTP 404) są emitowane za pomocą wywołań zwrotnych
onLoadError
. - W przypadku obsługi starszych napisów (podczas renderowania) tylko powiązane błędy wczytywania są emitowane za pomocą wywołań zwrotnych
onLoadError
, a błędy parsowania są ignorowane (jest to wcześniejsze zachowanie).
- W przypadku nowej obsługi napisów (podczas wyodrębniania) powiązane błędy analizy (np. nieprawidłowe dane napisów) i błędy wczytywania (np. HTTP 404) są emitowane za pomocą wywołań zwrotnych
- Rozwiązanie problemu, w którym elementy playlisty lub okresy w strumieniach DASH z wieloma okresami o czasie trwania niezgodnym z rzeczywistą zawartością mogły powodować zablokowanie klatek na końcu elementu (#1698).
- Dodaj metodę ustawiającą do
SntpClient
, aby ustawić maksymalny czas od ostatniej aktualizacji, po której klient jest ponownie inicjowany (#1794).
- Transformator:
- Dodaj
SurfaceAssetLoader
, który umożliwia kolejkowanie danych wideo do usługi Transformer za pomocąSurface
. ImageAssetLoader
zwraca nieobsługiwany typ danych za pomocąAssetLoader.onError
zamiastIllegalStateException
.- Ustaw czas trwania obrazu za pomocą funkcji
MediaItem.Builder.setImageDurationMs
jako obowiązkowy element eksportu obrazu. - Dodano obsługę eksportowania przerw w sekwencji audio EditedMediaItems.
- Dodaj
- Wybór utworu:
DefaultTrackSelector
: preferowanie dźwięku obiektowego nad dźwiękiem kanału, jeśli inne czynniki są takie same.
- Wyodrębnianie:
- Zezwalaj na to, aby
Mp4Extractor
iFragmentedMp4Extractor
rozpoznawały próbki H264, które nie są używane jako odniesienie przez kolejne próbki. - Dodać opcję włączenia przeskakiwania na podstawie indeksu w
AmrExtractor
. - Pliki MP3 z więcej niż 128 kB między prawidłowymi ramkami są traktowane jako obcięte (zamiast nieprawidłowe). Oznacza to, że pliki z danymi innymi niż MP3 na końcu, które nie mają innych metadanych wskazujących długość bajtów MP3, będą teraz odtwarzane do końca danych MP3 zamiast kończyć się z błędem
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}
(#1563). - Poprawiono obsługę próbki preroll dla pozycji początkowych mediów, które nie są kluczowymi klatkami podczas przetwarzania list edycji w plikach MP4 (#1659).
- Ulepszone obliczanie częstotliwości klatek za pomocą czasu trwania multimediów z pola
mdhd
wMp4Extractor
iFragmentedMp4Extractor
(#1531). - Poprawka nieprawidłowego skalowania
media_time
w listach edycji MP4. Podczas gdysegment_duration
została już prawidłowo przeskalowana za pomocą skali czasowej filmu,media_time
jest teraz prawidłowo przeskalowana za pomocą skali czasowej ścieżki zgodnie ze standardem formatu MP4 (#1792). - Obsługa klatek o nieprawidłowej kolejności w obliczeniach
endIndices
w pliku MP4 z listą edycji (#1797). - Napraw błędny parsowanie czasu trwania multimediów w polu
mdhd
plików MP4, aby obsługiwać wartości-1
(#1819). - Dodanie obsługi identyfikacji pola
h263
w plikach MP4 dla filmów H.263 (#1821). - Dodaj obsługę formatu pliku multimedialnego AC-4 Level-4 ISO (#1265).
- Zezwalaj na to, aby
- DataSource:
- Zaktualizuj
HttpEngineDataSource
, aby umożliwić korzystanie z wersji S rozszerzenia 7 zamiast poziomu interfejsu API 34 (#1262). DataSourceContractTest
: sprawdź, czy funkcjaDataSource.getUri()
zwraca rozstrzygnięty identyfikator URI (zgodnie z dokumentacją). Jeśli jest on inny niż żądany URI, testy mogą to wskazać za pomocą nowej metodyDataSourceContractTest.TestResource.Builder.setResolvedUri()
.DataSourceContractTest
: sprawdź, czy funkcjeDataSource.getUri()
igetResponseHeaders()
zwracają wartość „open” po nieudanym wywołaniu funkcjiopen()
(z powodu zasobu „not found”) i przed kolejnym wywołaniem funkcjiclose()
.- Przesłonięcie
DataSourceContractTest.getNotFoundResources()
pozwala testowanym podklasom udostępniać wiele zasobów z wartością „nie znaleziono” oraz udostępniać oczekiwane nagłówki. Pozwala to odróżnić kod 404 HTTP (z nagłówkami) od komunikatu „serwer nie znaleziono” (bez nagłówków).
- Przesłonięcie
- Zaktualizuj
- Dźwięk:
- Automatycznie skonfiguruj metadane głośności CTA-2075 w kodeki, jeśli są one obecne w multimediów.
- Głośność powinna się płynnie zmniejszać podczas przewijania.
- Poprawiono dźwięki trzasknięcia, które mogły występować podczas przewijania.
- Naprawiono gromadzenie błędów związanych z odcięciem w przypadku algorytmu rozciągania czasu i zmiany wysokości dźwięku w Sonic.
- Naprawiono błąd w bibliotece
SpeedChangingAudioProcessor
, który powodował utratę klatek na wyjściu.
- Film:
MediaCodecVideoRenderer
zapobiega dekodowaniu próbek, które nie są renderowane ani używane jako odniesienie przez inne próbki.- W interfejsie API 35 i nowszych
MediaCodecAdapter
może teraz otrzymywaćnull
Surface
wconfigure
i wywoływać nową metodędetachOutputSurface
, aby usunąć wcześniej ustawionySurface
, jeśli kodek obsługuje tę funkcję (MediaCodecInfo.detachedSurfaceSupported
). - Podczas przetwarzania
onOutputFormatChanged
użyj wartości współczynnika proporcji pikseliMediaCodecAdapter
, jeśli zostały podane (#1371). - Dodano obejście problemu z urządzeniem Galaxy Tab S7 FE, który powodował, że strumienie H264 z zabezpieczeniami i częstotliwością 60 fps były oznaczane jako niedostępne (#1619).
- Dodaj obejście problemu w przypadku kodeków, które utknęły po ostatnim próbku bez zwrócenia sygnału końca strumienia.
- Tekst:
- Dodaj niestandardowy element
VoiceSpan
i wypełnij go dla przedziałów głosowych WebVTT (#1632). - Upewnij się, że wyświetlane są napisy WebVTT w HLS z bardzo dużymi sygnaturami czasowymi napisów (które przekraczają 64-bitową wartość
long
, gdy są reprezentowane jako mikrosekundy i pomnożone przez bazę czasu MPEG90,000
) (#1763). - Obsługa napisów CEA-608 w treściach Dolby Vision (#1820).
- Naprawić zawieszanie odtwarzania w przypadku strumieni DASH z wieloma okresami, gdy włączone są napisy CEA-608 (#1863).
- Dodaj niestandardowy element
- Metadane:
- Przypisz typ
C.TRACK_TYPE_METADATA
do ścieżek zawierających treści icy lub vnd.dvb.ait.
- Przypisz typ
- Obraz:
- Dodaj
ExternallyLoadedImageDecoder
, aby uprościć integrację z bibliotekami zewnętrznymi do ładowania obrazów, takimi jak Glide czy Coil.
- Dodaj
- DataSource:
- Dodaj
FileDescriptorDataSource
, nowyDataSource
, który może być używany do odczytu zFileDescriptor
(#3757).
- Dodaj
- Skutek:
- Dodaj obejście problemu
DefaultVideoFrameProcessor
w przypadku drobnego skalowaniaSurfaceTexture
.SurfaceTexture
może zawierać niewielkie skalowanie, które odcina 1-texelską krawędź narożnika przyciętego bufora. Teraz jest to obsługiwane, dzięki czemu wyniki są bliższe oczekiwanym. - Przyspiesz
DefaultVideoFrameProcessor.queueInputBitmap()
. W rezultacie eksportowanie obrazów do filmów za pomocąTransformer
jest szybsze.
- Dodaj obejście problemu
- Rozszerzenie IMA:
- Naprawiono błąd, który powodował, że usunięcie playlisty mogło spowodować błąd
ArrayIndexOutOfBoundsException
wImaServerSideAdInsertionMediaSource
. - Naprawiono błąd, w którym strumienie DAI wstawiane po stronie serwera bez prerollu mogły powodować
ArrayIndexOutOfBoundsException
podczas odtwarzania po ostatniej reklamie midroll (#1741).
- Naprawiono błąd, który powodował, że usunięcie playlisty mogło spowodować błąd
- Sesja:
- Dodaj
MediaButtonReceiver.shouldStartForegroundService(Intent)
, aby umożliwić aplikacjom pominięcie polecenia odtwarzania przychodzącego w celu wznowienia odtwarzania przez zastąpienie tej metody. Domyślnie usługa jest zawsze uruchamiana, a odtwarzanie nie może zostać wstrzymane bez awarii systemu zForegroundServiceDidNotStartInTimeException
(#1528). - Naprawiono błąd, który powodował, że niestandardowe polecenia wysyłane z usługi
MediaBrowser
były wysyłane do usługiMediaSessionCompat.Callback
zamiast do usługiMediaBrowserServiceCompat
, gdy użytkownik był połączony ze starszą usługą. To uniemożliwiłoMediaBrowser
otrzymanie rzeczywistej wartości zwróconej przez starszą usługę (#1474). - Obsługa wyjątku
IllegalArgumentException
zgłaszanego przez urządzenia niektórych producentów podczas konfigurowania odbiornika transmisji dla intencji przycisku multimedialnego (#1730). - Dodawanie przycisków poleceń dla elementów multimedialnych. Dodaje interfejs Media3 API do tego, co było znane jako
Custom browse actions
, z zastosowaniem starszej biblioteki zMediaBrowserCompat
. Pamiętaj, że w przypadku Media3 przyciski poleceń dotyczące multimediów są dostępne zarówno dlaMediaBrowser
, jak iMediaController
. Zobacz niestandardowe działania przeglądania w AAOS. - Naprawiono błąd, który powodował, że kontroler Media3 nie zawsze pozwalał aplikacji sesji na uruchomienie usługi na pierwszym planie po wysłaniu żądania
play()
. - Ogranicz
CommandButton.Builder.setIconUri
, aby akceptować tylko identyfikatory URI treści. - Przekazywanie wskazówek dotyczących połączenia przeglądarki Media3 do początkowego
MediaBrowserCompat
podczas łączenia się z starszą wersjąMediaBrowserCompat
. Usługa może otrzymywać wskazówki dotyczące połączenia przekazywane jako wskazówki główne podczas pierwszego wywołaniaonGetRoot()
. - Rozwiązanie błędu polegającego na tym, że
MediaBrowser
połączony ze starszą usługą przeglądarki nie otrzymywał błędu wysłanego przez usługę po tym, jak przeglądarka zasubskrybowałaparentid
. - Poprawiliśmy działanie interoperacyjności, aby przeglądarka Media3 połączona ze starszą wersją
MediaBrowserService
nie wysyłała dwukrotnie żądania do podrzędnychparentId
podczas subskrybowania wersji nadrzędnej.
- Dodaj
- UI:
- Włącz opcję
PlayerView
w ComposeAndroidView
, aby korzystać z obejścia problemu związanego z rozszerzaniem lub przycinaniem filmów z powodu problemów z przejściami udostępnianymi na podstawie pliku XML. Aplikacje korzystające z funkcjiPlayerView
w ramachAndroidView
muszą wywoływać funkcjęPlayerView.setEnableComposeSurfaceSyncWorkaround
, aby wyrazić zgodę na korzystanie z tej funkcji (#1237, #1594). - Dodaj
setFullscreenButtonState
doPlayerView
, aby umożliwić aktualizacje ikony przycisku pełnoekranowego na żądanie, czyli poza pasmem i nie w reakcji na kliknięcie (#1590, #184). - Rozwiązanie błędu polegającego na tym, że opcja „Brak” w przypadku wyboru tekstu nie działa, jeśli istnieją określone przez aplikację preferencje wyboru ścieżki tekstowej.
- Włącz opcję
- Rozszerzenie DASH:
- Dodano obsługę okresów rozpoczynających się w połowie segmentu (#1440).
- Rozszerzenie płynnego przesyłania strumieniowego:
- Naprawiono błąd
Bad magic number for Bundle
podczas odtwarzania strumieni danych SmoothStreaming z ścieżkami tekstowymi (#1779).
- Naprawiono błąd
- Rozszerzenie RTSP:
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Dodaj moduł dekodera IAMF, który zapewnia obsługę odtwarzania plików MP4 zawierających ścieżki IAMF za pomocą natywnej biblioteki libiamf do syntezy dźwięku.
- Odtwarzanie jest włączone w układzie stereo i 5.1 ze sterowaniem przestrzennym oraz opcjonalnym śledzeniem ruchów głowy, ale obsługa odtwarzania binaural nie jest obecnie dostępna.
- Dodanie obsługi stron 16 KB dla rozszerzeń dekoderów w Androidzie 15 (#1685).
- Dodaj moduł dekodera IAMF, który zapewnia obsługę odtwarzania plików MP4 zawierających ścieżki IAMF za pomocą natywnej biblioteki libiamf do syntezy dźwięku.
- Rozszerzenie Cast:
- Zatrzymanie czyszczenia osi czasu po rozłączeniu sesji CastSession, co umożliwia aplikacji nadawcy wznowienie odtwarzania lokalnie po rozłączeniu.
- Wypełnij parametr
DeviceInfo
w CastPlayer, gdy podano parametrContext
. Umożliwia to połączenieMediaSession
zRoutingSession
, co jest konieczne do zintegrowania przełącznika wyjścia (#1056).
- Narzędzia testowe:
DataSourceContractTest
zawiera teraz testy, które sprawdzają:- Strumień wejściowy
read position
został zaktualizowany. - Bufor wyjściowy
offset
jest stosowany prawidłowo.
- Strumień wejściowy
- Aplikacja demonstracyjna
- Rozwiązać problem z wyciekami pamięci w wersji demonstracyjnej aplikacji Short (#1839).
- Usuń symbole wycofane:
- Usuń wycofane
Player.hasPrevious
,Player.hasPreviousWindow()
. Zamiast tego użyjPlayer.hasPreviousMediaItem()
. - Usuń wycofaną metodę
Player.previous()
. Zamiast tego użyj atrybutuPlayer.seekToPreviousMediaItem()
. - Usuń wycofaną metodę
DrmSessionEventListener.onDrmSessionAcquired
. - Usuń wycofane konstruktory
DefaultEncoderFactory
. Zamiast tego użyj atrybutuDefaultEncoderFactory.Builder
.
- Usuń wycofane
Wersja 1.5.0-rc02
19 listopada 2024 r.
Użyj wersji stabilnej 1.5.0.
Wersja 1.5.0-rc01
13 listopada 2024 r.
Użyj wersji stabilnej 1.5.0.
Wersja 1.5.0-beta01
30 października 2024 r.
Użyj wersji stabilnej 1.5.0.
Wersja 1.5.0-alpha01
10 września 2024 r.
Użyj wersji stabilnej 1.5.0.
Wersja 1.4.0
Wersja 1.4.1
27 sierpnia 2024 r.
androidx.media3:media3-*:1.4.1
został zwolniony.
Wersja 1.4.1 zawiera te komity.
- ExoPlayer:
- Wyodrębnianie:
- MP3: poprawka błędu
Searched too many bytes
polegająca na prawidłowym ignorowaniu danych niebędących w formacie MP3 na podstawie pola długości w ramceInfo
(#1480).
- MP3: poprawka błędu
- Tekst:
- TTML: poprawić obsługę wartości procentowych
tts:fontSize
, aby były one prawidłowo dziedziczone z węzłów nadrzędnych z wartościami procentowymitts:fontSize
. - Poprawka
IndexOutOfBoundsException
wLegacySubtitleUtil
z powodu nieprawidłowego obsługiwania przypadku, gdy żądany czas rozpoczęcia wyjścia jest równy lub większy od końcowego czasu zdarzenia wSubtitle
(#1516).
- TTML: poprawić obsługę wartości procentowych
- DRM:
- Naprawiono błąd
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE
na urządzeniach z interfejsem API w wersji 31 i nowszych, na których odtwarzane są treści L1 Widevine. Ten błąd jest spowodowany niepełną implementacją metodyMediaDrm.requiresSecureDecoder
(#1603).
- Naprawiono błąd
- Skutek:
- Dodaj formę płatności
release()
doGlObjectsProvider
.
- Dodaj formę płatności
- Sesja:
- Rozszerzenie RTSP:
- Pomijanie nieprawidłowych opisów multimediów podczas analizowania SDP (#1087).
Wersja 1.4.0
25 lipca 2024 r.
androidx.media3:media3-*:1.4.0
został zwolniony.
Wersja 1.4.0 zawiera te komitowane zmiany.
- Biblioteka wspólna:
- Przesyłaj do metod
BasePlayer.seekTo()
iSimpleBasePlayer.handleSeek()
chronione wywołania seek, które prawdopodobnie nie wymagają przesunięcia, zamiast je ignorować. Jeśli te metody są stosowane w niestandardowym odtwarzaczu, może być konieczne obsłużenie tych dodatkowych wywołań za pomocą funkcjimediaItemIndex == C.INDEX_UNSET
. - Usuń zależność kompilacji od ulepszonego usuwania cukru w Javie 8 (#1312).
- Upewnij się, że czas trwania przekazywany do elementu
MediaItem.Builder.setImageDurationMs()
jest ignorowany w przypadku elementów innych niż obrazyMediaItem
(jak to zostało udokumentowane). - Dodaj
Format.customData
, aby przechowywać informacje niestandardowe dotyczące instancjiFormat
dostarczone przez aplikację.
- Przesyłaj do metod
- ExoPlayer:
- Dodaj
BasePreloadManager
, który koordynuje wstępne wczytywanie wielu źródeł na podstawie priorytetów zdefiniowanych przez ichrankingData
. Dostosowywanie jest możliwe dzięki rozszerzeniu tej klasy. DodajDefaultPreloadManager
, który używaPreloadMediaSource
do wstępnego załadowania próbek multimediów źródeł do pamięci, oraz liczby całkowitejrankingData
, która wskazuje indeks elementu w interfejsie. - Dodaj
PlayerId
do większości metodLoadControl
, aby umożliwićLoadControl
implementacje obsługujące wielu graczy. - Usuń
Buffer.isDecodeOnly()
iC.BUFFER_FLAG_DECODE_ONLY
. Nie trzeba ustawiać tej flagi, ponieważ renderowanie i dekodowanie zdecydują o pominięciu buforów na podstawie sygnatury czasowej. Niestandardowe implementacjeRenderer
powinny sprawdzać, czy czas buforowania wynosi co najmniejBaseRenderer.getLastResetPositionUs()
, aby zdecydować, czy należy wyświetlić próbkę. W razie potrzeby niestandardowe implementacjeSimpleDecoder
mogą sprawdzać zmiennąisAtLeastOutputStartTimeUs()
lub oznaczać inne bufory za pomocą zmiennejDecoderOutputBuffer.shouldBeSkipped
, aby je pomijać. - Umożliw zwracanie przez funkcję
TargetPreloadStatusControl.getTargetPreloadStatus(T)
wartości null, aby wskazać, że nie należy wstępnie wczytywać elementuMediaSource
z danym elementemrankingData
. - Dodano
remove(MediaSource)
doBasePreloadManager
. - Dodaj
reset()
doBasePreloadManager
, aby zwolnić wszystkie źródła z zatrzymaniem, zachowując jednocześnie instancję menedżera wstępnego wczytywania. - Dodaj
ExoPlayer.setPriority()
(iBuilder.setPriority()
), aby zdefiniować wartość priorytetu używaną wPriorityTaskManager
i w przypadku znaczenia MediaCodec z interfejsu API 35. - Rozwiązanie problemu z aktualizacją ostatniego czasu ponownego buforowania, który powodował nieprawidłowy klucz
bs
(niedobór bufora) w CMCD (#1124). - Dodaj
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
, aby wskazać, że źródło zostało załadowane do końca. Umożliwia toDefaultPreloadManager
i spersonalizowanymPreloadMediaSource.PreloadControl
wstępne załadowanie następnego źródła lub wykonanie innych działań. - Naprawiono błąd, który powodował, że pomijanie ciszy na końcu elementów mogło wywołać wyjątek odtwarzania.
- Aby odrzucić okres wstępnego wczytywania, dodaj
clear
doPreloadMediaSource
. - Dodaj nowy kod błędu
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED
, który jest używany, gdy zasoby kodeka są odzyskiwane na potrzeby zadań o wyższym priorytecie. - Pozwól
AdsMediaSource
wczytywać reklamy przed zakończeniem przygotowywania początkowych treści multimedialnych (#1358). - Naprawiono błąd, który powodował, że odtwarzanie przenosiło się do
STATE_ENDED
podczas ponownego przygotowywania transmisji na żywo DASH z wieloma okresami po usunięciu oryginalnego okresu z pliku manifestu. - Zmień nazwę
onTimelineRefreshed()
naonSourcePrepared()
, aonPrepared()
naonTracksSelected()
wPreloadMediaSource.PreloadControl
. Odpowiednio zmień też nazwy definicji interfejsów w plikuDefaultPreloadManager.Stage
. - Dodanie eksperymentalnej obsługi dynamicznego harmonogramowania w celu lepszego dopasowania pracy do cykli aktywacji procesora i opóźnienia aktywacji do momentu, gdy renderowanie może się rozpocząć.
Możesz to włączyć, używając
experimentalSetDynamicSchedulingEnabled()
podczas konfigurowania instancji ExoPlayera. - Dodaj
Renderer.getDurationToProgressUs()
.Renderer
może zaimplementować tę metodę, aby zwrócić do ExoPlayera czas trwania odtwarzania, który musi zostać przesunięty, aby renderer mógł kontynuować. JeśliExoPlayer
jest ustawiony za pomocąexperimentalSetDynamicSchedulingEnabled()
,ExoPlayer
wywoła tę metodę podczas obliczania czasu, aby zaplanować zadanie robocze. - Dodaj
MediaCodecAdapter#OnBufferAvailableListener
, aby otrzymywać alerty, gdy bufory wejściowe i wyjściowe są dostępne do użycia przezMediaCodecRenderer
.MediaCodecRenderer
będzie wysyłać sygnały doExoPlayer
po otrzymaniu tych wywołań zwrotnych. JeśliExoPlayer
jest ustawiony naexperimentalSetDynamicSchedulingEnabled()
,ExoPlayer
będzie planować swoją pętlę roboczą, gdy tylko renderowanie będzie się posuwać do przodu. - Zamiast poszczególnych parametrów w metodach
LoadControl
używaj klasy danych. - Dodaj
ExoPlayer.isReleased()
, aby sprawdzić, czy funkcjaExoplayer.release()
została wywołana. - Dodaj
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()
, aby skonfigurować maksymalną pozycję, dla której funkcjaseekToPrevious()
ma szukać poprzedniego elementu (#1425). - Poprawiono niespójności w przyciąganiu uwagi dźwiękiem, np. brak zgłaszania pełnego lub chwilowego utraty skupienia podczas pauzy odtwarzacza (#1436).
- Naprawiono potencjalny błąd
IndexOutOfBoundsException
spowodowany przez ekstraktory raportujące dodatkowe ścieżki po początkowym etapie przygotowania (#1476). Effects
wExoPlayer.setVideoEffect()
otrzyma sygnatury czasowe z usuniętym przesunięciem w renderowaniu (#1098).- Naprawiono potencjalny błąd
IllegalArgumentException
podczas obsługi błędu odtwarzacza, który wystąpił podczas odczytu do przodu innego elementu playlisty (#1483).
- Dodaj
- Transformator:
- Dodaj
audioConversionProcess
ivideoConversionProcess
doExportResult
, aby wskazać, jak powstała dana ścieżka w pliku wyjściowym. - Zmniejszenie liczby kontroli poziomu H.264 w optymalizacji przycinania.
- Dodanie obsługi sekwencyjnego przełączania się między SDR a HDR.
- Dodaliśmy obsługę efektów dźwiękowych na poziomie kompozycji.
- Dodaliśmy obsługę transkodowania obrazów Ultra HDR na filmy HDR.
- Rozwiązanie problemu polegającego na tym, że funkcja
DefaultAudioMixer
nie zwraca prawidłowej ilości bajtów po zresetowaniu i ponownym użyciu. - obejście błędu dekodera, w którym liczba kanałów audio była ograniczona do stereo podczas obsługi wejścia PCM;
- Podczas wybierania ścieżek w
ExoPlayerAssetLoader
ignoruj ograniczenia dotyczące liczby kanałów audio, ponieważ dotyczą one tylko odtwarzania. - Zastąp interfejs
androidx.media3.transformer.Muxer
interfejsemandroidx.media3.muxer.Muxer
i usuńandroidx.media3.transformer.Muxer
. - Naprawiono wczytywanie obrazów HEIC ze schematów identyfikatorów URI treści. (#1373).
- Aby poprawić synchronizację obrazu i dźwięku, dostosuj czas trwania ścieżki audio w
AudioGraphInput
. - Usuń pole
ExportResult.processedInputs
. Jeśli używasz tego pola do określenia szczegółów kodeka, użyj polaDefaultDecoderFactory.listener
. W przypadku wyjątku dotyczącego kodeka szczegóły dotyczące tego kodeka będą dostępne wExportException.codecInfo
.
- Dodaj
- Wyodrębnianie:
- MPEG-TS: wprowadź zmianę, aby zapewnić renderowanie ostatniej klatki, przekazując ostatnią jednostkę dostępu strumienia do kolejki próbek (#7909). Wprowadzono poprawki, które rozwiązują problemy występujące w przypadku strumieni HLS tylko z ramkami I(#1150) i strumieni HLS H.262 (#1126).
- MP3: preferuj rozmiar danych z ramki
Info
zamiast rozmiaru podanego przez strumień źródłowy (np. rozmiar pliku lub nagłówek HTTPContent-Length
). Pomaga to wykluczyć dane dotyczące nieodtwarzalnych zwiastunów (np. okładki albumów) z obliczeń wyszukiwania z stałym bitratem, co zwiększa dokładność wyszukiwania (#1376). - MP3: do obliczenia średniej szybkości transmisji danych dla wyszukiwania stałej szybkości transmisji danych użyj liczby klatek i innych danych w
Info
kroku (jeśli jest obecny) zamiast ekstrapolować z szybkości transmisji danych w kroku poInfo
, która może być sztucznie mała, np.PCUT
krok (#1376). - Naprawić wyodrębnianie formatu audio PCM w kontenerach AVI.
- Dźwięk:
- Naprawiono atrybuty kodowania DTS:X Profile 2 w przypadku odtwarzania przezroczystego (#1299).
- W przypadku odtwarzania w pamięci podręcznej zresetuj pole śledzenia zakończenia strumienia w
DefaultAudioSink
przed wywołaniemAudioTrack.stop()
, abyAudioTrack.StreamEventCallback#onPresentationEnded
prawidłowo rozpoznawał, kiedy odtworzono wszystkie oczekujące dane. - Usunięto błąd w
SilenceSkippingAudioProcessor
, w którym przejścia między różnymi formatami audio (np. stereo na mono) mogły spowodować wyjątek w procesorze (#1352). - Wprowadź
MediaCodecAudioRenderer.getDurationToProgressUs()
, aby ExoPlayer dynamicznie planował główną pętlę roboczą w taki sposób, aby MediaCodecAudioRenderer mogła się rozwijać.
- Film:
- Rozwiązanie problemu polegającego na tym, że
Listener.onRenderedFirstFrame()
pojawia się zbyt wcześnie podczas przełączania powierzchni w trakcie odtwarzania. - Naprawić logikę zastępczego dekodera w przypadku Dolby Vision, aby w razie potrzeby używać zgodnego dekodera AV1 (#1389).
- Rozwiązanie problemu z wyjątkiem kodeka, który może być spowodowany włączeniem renderera wideo w trakcie odtwarzania.
- Rozwiązanie problemu polegającego na tym, że
- Tekst:
- Rozwiązaliśmy problem, który powodował pomijanie napisów, które zaczynają się przed pozycją przesunięcia. Ten problem pojawił się tylko w Media3 w wersji 1.4.0-alpha01.
- Zmień domyślne zachowanie parsowania napisów, aby miało ono miejsce podczas wyodrębniania, a nie podczas renderowania (aby poznać różnicę między wyodrębnianiem a renderowaniem, zapoznaj się z diagramem architektury ExoPlayera).
- Tę zmianę można zastąpić, wywołując obie funkcje
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)
iTextRenderer.experimentalSetLegacyDecodingEnabled(true)
. Aby dowiedzieć się, jak podłączyć te komponenty do instancjiExoPlayer
, zapoznaj się z dokumentacją dotyczącą dostosowywania. Te metody (oraz cała obsługa starszego dekodowania napisów) zostaną usunięte w przyszłej wersji. - Aplikacje z niestandardową implementacją
SubtitleDecoder
muszą zostać zaktualizowane, aby zamiast niej używaćSubtitleParser
(a zamiastSubtitleDecoderFactory
–SubtitleParser.Factory
).
- Tę zmianę można zastąpić, wywołując obie funkcje
- PGS: napraw dekodowanie długości sekwencji, aby traktować
0
jako indeks koloru zamiast dosłownej wartości koloru (#1367). - CEA-708: zignoruj wartość
rowLock
. Specyfikacja CEA-708-E S-2023 określa, że wartościrowLock
icolumnLock
powinny być uznawane za prawdziwe niezależnie od wartości obecnych w strumieniu (obsługa parametrucolumnLock
nie jest implementowana, więc jest on uznawany za zawsze fałszywy).- Informacje te zostały pierwotnie uwzględnione w informacjach o wersji
1.3.0-alpha01
, ale zostały przypadkowo cofnięte przed wydaniem wersji1.3.0-rc01
. Problem został rozwiązany, więc zmiana jest ponownie widoczna.
- Informacje te zostały pierwotnie uwzględnione w informacjach o wersji
- CEA-708: unikaj zduplikowanych znaków nowej linii dodawanych przez ExoPlayera w ramach prostego obsługiwania polecenia „set pen location” (#1315).
- Napraw
IllegalArgumentException
zLegacySubtitleUtil
, gdy próbka napisów WebVTT nie zawiera żadnych wskazówek, np. w ramach strumienia DASH (#1516).
- Metadane:
- Poprawne mapowanie tagów sortowania MP4 na ID3. Wcześniej tagi MP4 „album sort” (
soal
), „artist sort” (soar
) i „album artist sort” (soaa
) były błędnie mapowane na tagi ID3TSO2
,TSOA
iTSOP
(#1302). - Naprawiono odczyt tagów MP4 (/iTunes)
gnre
(gatunek) itmpo
(tempo), gdy ich wartość ma więcej niż 1 bajt. - Przekaż ramkę ID3
TCON
doMediaMetadata.genre
(#1305).
- Poprawne mapowanie tagów sortowania MP4 na ID3. Wcześniej tagi MP4 „album sort” (
- Obraz:
- Dodaj obsługę niekwadratowych siatek miniatur DASH (#1300).
- Dodanie obsługi formatu AVIF w przypadku interfejsu API w wersji 34 lub nowszej.
- Dopuszczanie wartości
null
jako parametru dlaExoPlayer.setImageOutput()
w celu wyczyszczenia wcześniej ustawionej wartościImageOutput
.
- DataSource:
- Wdrożyć obsługę identyfikatorów URI surowych zasobów
android.resource://package/id
, gdziepackage
jest inny niż pakiet bieżącej aplikacji. Ta metoda nie była wcześniej udokumentowana, ale jest wydajniejszym sposobem uzyskiwania dostępu do zasobów w innym pakiecie niż przez nazwę. - W konstruktorach
DataSpec
sprawdź, czyurl
jest niezerowany. Ten parametr został już oznaczony jako niepusty. - Dozwolić
ByteArrayDataSource
na rozwiązywanie identyfikatora URI do tablicy bajtów podczasopen()
, zamiast kodowania na stałe podczas tworzenia (#1405).
- Wdrożyć obsługę identyfikatorów URI surowych zasobów
- DRM:
- Zezwalaj na ustawienie
LoadErrorHandlingPolicy
wDefaultDrmSessionManagerProvider
(#1271).
- Zezwalaj na ustawienie
- Skutek:
- Obsługa wielu zmian szybkości w ramach tego samego
EditedMediaItem
lubComposition
wSpeedChangeEffect
. - Obsługa danych wyjściowych HLG i PQ z wejścia bitmapy ultra HDR.
- Dodaliśmy obsługę EGL_GL_COLORSPACE_BT2020_HLG_EXT, która poprawia wyjście powierzchni HLG w ExoPlayer.setVideoEffect i Debug SurfaceView w Transformer.
- Zaktualizuj implementację macierzy nakładki, aby była zgodna z dokumentacją. Aby to zrobić, obróć wartości x i y zastosowane w funkcji
setOverlayFrameAnchor()
. Jeśli używasz atrybutuOverlaySettings.Builder.setOverlayFrameAnchor()
, odwróć wartości x i y, mnożąc je przez-1
. - Naprawiono błąd, który powodował awarię aplikacji
TimestampWrapper
podczas korzystania z aplikacjiExoPlayer#setVideoEffects
(#821). - Zmień domyślną przestrzeń roboczą kolorów SDR z kolorów liniowych na elektryczne BT.709 SDR. Dodaj też trzecią opcję, aby zachować oryginalną przestrzeń barw.
- Zezwalanie na definiowanie nieokreślonego z-orderu dla EditedMediaItemSequences (#1055).
- Zachowanie spójnego zakresu luminacji w różnych częściach treści HDR (korzystanie z zakresu HLG).
- Dodanie obsługi nakładek Ultra HDR (map bitowych) w treściach HDR.
- Zezwalanie na używanie efektów
SeparableConvolution
przed wersją API 26. - Usuń nieużywane
OverlaySettings.useHdr
, ponieważ zakres dynamiczny nakładki i ramki musi być taki sam. - Dodaj obsługę HDR dla
TextOverlay
. Jasność nakładki tekstowej można dostosować za pomocąOverlaySettings.Builder.setHdrLuminanceMultiplier()
.
- Obsługa wielu zmian szybkości w ramach tego samego
- Rozszerzenie IMA:
- Przeniesienie interfejsu API, który jest wymagany do odtwarzania strumynów reklam DAI w aplikacjach, do wersji stabilnej.
- Dodaj tag
replaceAdTagParameters(Map <String, String>)
do taguImaServerSideAdInsertionMediaSource.AdLoader
, który umożliwia zastępowanie parametrów tagu reklamy w czasie wykonywania. - Naprawiono błąd, który powodował, że funkcja
VideoAdPlayer.VideoAdPlayerCallback.onError()
nie była wywoływana, gdy podczas odtwarzania reklamy wystąpił błąd odtwarzacza (#1334). - Zaktualizuj wersję pakietu IMA SDK do 3.33.0, aby naprawić błąd
NullPointerException
występujący podczas korzystania z URI tagu reklamydata://
(#700).
- Sesja:
- Zmień domyślną wartość
CommandButton.enabled
natrue
i upewnij się, że w przypadku kontrolerów wartość może pozostać jako fałsz, nawet jeśli powiązane polecenie jest dostępne. - Dodaj stałe ikony
CommandButton
, które powinny być używane zamiast niestandardowych zasobów ikon. - Dodaj
MediaSessionService.isPlaybackOngoing()
, aby umożliwić aplikacjom sprawdzanie, czy usługa musi zostać zatrzymana wonTaskRemoved()
(#1219). - Dodaj
MediaSessionService.pauseAllPlayersAndStopSelf()
, który pozwala w wygodny sposób wstrzymać odtwarzanie wszystkich sesji i wywołać funkcjęstopSelf()
, aby zakończyć cykl życiaMediaSessionService
. - Zastąpić
MediaSessionService.onTaskRemoved(Intent)
, aby zapewnić bezpieczną implementację domyślną, która utrzymuje usługę na pierwszym planie, jeśli odtwarzanie jest w toku, lub w przeciwnym razie zatrzymuje usługę. - Ukryj suwak w powiadomieniu o multimediów w przypadku transmisji na żywo, nie ustawiając czasu trwania w metadanych sesji platformy (#1256).
- Dopasuj konwersję atrybutu
MediaMetadata
do atrybutuMediaDescriptionCompat
, aby podczas wybierania właściwości metadanych używać tej samej preferowanej kolejności i logiki co w przypadku atrybutów w media1. - Dodaj
MediaSession.sendError()
, który umożliwia wysyłanie błędów niekrytycznych do kontrolera Media3. Podczas korzystania z kontrolera powiadomień (patrz:MediaSession.getMediaNotificationControllerInfo()
) błąd niestandardowy służy do aktualizowaniaPlaybackState
sesji platformy do stanu błędu z podanymi informacjami o błędzie (#543). - Dodaj
MediaSession.Callback.onPlayerInteractionFinished()
, aby informować o zakończeniu serii interakcji gracza z konkretnym kontrolerem. - Dodaj
SessionError
i użyj go wSessionResult
iLibraryResult
zamiast kodu błędu, aby przekazać więcej informacji o błędzie i sposobie jego rozwiązania (jeśli to możliwe). - Opublikuj kod aplikacji testowej sterownika media3, która może służyć do testowania interakcji z aplikacjami publikującymi sesję multimedialną.
- Przekaż dodatkowe parametry przekazane do
MediaSession[Builder].setSessionExtras()
w media3 doPlaybackStateCompat.getExtras()
w sterowniku media1. - Mapowanie błędów krytycznych i niekrytycznych na sesję platformy i z niej.
PlaybackException
jest mapowane na stan krytycznego błęduPlaybackStateCompat
.SessionError
wysłany do kontrolera powiadomień o mediach z wartościąMediaSession.sendError(ControllerInfo, SessionError)
jest mapowany na błąd niekrytyczny wPlaybackStateCompat
, co oznacza, że kod błędu i komunikat są ustawione, ale stan sesji platformy pozostaje inny niżSTATE_ERROR
. - Zezwalanie na ustawianie aktywności sesji na poziomie kontrolera w celu zastąpienia aktywności sesji globalnej. Aktywność sesji można zdefiniować dla kontrolera w momencie połączenia, tworząc
ConnectionResult
zAcceptedResultBuilder.setSessionActivivty(PendingIntent)
. Po nawiązaniu połączenia aktywność sesji można zaktualizować za pomocąMediaSession.setSessionActivity(ControllerInfo, PendingIntent)
. - Poprawiono replikowanie błędów wywołań do
MediaLibrarySession.Callback
. Replikację błędów można teraz skonfigurować, używając opcjiMediaLibrarySession.Builder.setLibraryErrorReplicationMode()
do wyboru typu błędu lub rezygnacji z replikacji błędów, która jest domyślnie włączona.
- Zmień domyślną wartość
- UI:
- Dodaj obsługę wyświetlania obrazów w
PlayerView
po połączeniu zExoPlayer
(#1144). - Dodaj możliwość dostosowywania różnych ikon w elementach
PlayerControlView
za pomocą atrybutów XML, aby umożliwić tworzenie różnych obiektów do rysowania na podstawie poszczególnych wystąpień elementuPlayerControlView
, a nie globalnych zastąpień (#1200).PlayerView
- Obchodzenie błędu platformy, który powoduje rozciąganie lub przycinanie wideo podczas używania elementu
SurfaceView
w komponencieAndroidView
w wersji interfejsu API 34 (#1237).
- Dodaj obsługę wyświetlania obrazów w
- Pobrane:
- Upewnij się, że
DownloadHelper
nie wycieka niepublikowanych instancjiRenderer
, co może ostatecznie spowodować awarię aplikacji zIllegalStateException: Too many receivers, total of 1000, registered for pid
(#1224).
- Upewnij się, że
- Rozszerzenie Cronet:
- Napraw błąd
SocketTimeoutException
wCronetDataSource
. W niektórych wersjach Cronet żądanie przekazywane przez funkcję wywołania zwrotnego nie jest zawsze takie samo. Powoduje to, że wywołanie zwrotne nie jest wykonywane, a żądanie zostaje anulowane (https://issuetracker.google.com/328442628).
- Napraw błąd
- Rozszerzenie HLS:
- Naprawiono błąd, który powodował, że oczekujące próbki EMSG oczekujące na przerwę były delegowane w
HlsSampleStreamWrapper
z nieprawidłowym przesunięciem, co powodowało błądIndexOutOfBoundsException
lub błądIllegalArgumentException
(#1002). - Usunięto błąd, który powodował ciągłe wczytywanie niegłównych playlist w przypadku strumieni LL-HLS (#1240).
- Naprawiono błąd, który powodował, że włączenie CMCD dla HLS z segmentami inicjowania powodowało błąd
Source Error
iIllegalArgumentException
. - Usunięto błąd, który powodował, że inne niż główne odtwarzane playlisty nie były odświeżane podczas odtwarzania na żywo (#1240).
- Naprawiono błąd, który powodował problemy z włączeniem CMCD w przypadku transmisji na żywo HLS.
ArrayIndexOutOfBoundsException
(#1395)
- Naprawiono błąd, który powodował, że oczekujące próbki EMSG oczekujące na przerwę były delegowane w
- Rozszerzenie DASH:
- Rozszerzenie Cast:
- Naprawiono błąd, który powodował konwersję tytułu albumu
MediaQueueItem
na wykonawcę w elemencie multimedialnym Media3 (#1255).
- Naprawiono błąd, który powodował konwersję tytułu albumu
- Narzędzia testowe:
- Zaimplementuj
onInit()
ionRelease()
wFakeRenderer
. - Zmień metody
TestPlayerRunHelper.runUntil()/playUntil()
tak, aby nie działały w przypadku błędów niekrytycznych (np. zgłoszonych doAnalyticsListener.onVideoCodecError()
). Aby wyłączyć to zachowanie, użyj nowego łańcucha metodTestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()
.
- Zaimplementuj
- Aplikacja demonstracyjna:
- Użyj
DefaultPreloadManager
w aplikacji demonstracyjnej krótkich formularzy. - Umożliwienie ustawiania trybu powtarzania za pomocą argumentów
Intent
z poziomu wiersza poleceń (#1266). - Użyj
HttpEngineDataSource
jakoHttpDataSource
, jeśli urządzenie obsługuje tę funkcję.
- Użyj
- Usuń symbole wycofane:
- Usuń
CronetDataSourceFactory
. Zamiast tego użyj polaCronetDataSource.Factory
. - Usuń niektóre konstruktory
DataSpec
. Zamiast tego użyjDataSpec.Builder
. - Usuń metodę płatności
setContentTypePredicate(Predicate)
z kontDefaultHttpDataSource
,OkHttpDataSource
iCronetDataSource
. Zamiast tego użyj w przypadku każdego elementuXXXDataSource.Factory
odpowiednich metod. - Usuń konstruktory
OkHttpDataSource
iOkHttpDataSourceFactory
. Zamiast tego użyjOkHttpDataSource.Factory
. - Usuń
PlayerMessage.setHandler(Handler)
. Zamiast tego użyj polasetLooper(Looper)
. - Usuń pole
Timeline.Window.isLive
. Zamiast tego użyj metodyisLive()
. - Usuń konstruktory
DefaultHttpDataSource
. Zamiast tego użyj atrybutuDefaultHttpDataSource.Factory
. - Usuń
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS
. Zamiast tego użyj atrybutuDashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS
. - Usuń
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)
. Zamiast tego użyjMediaCodecInfo.canReuseCodec(Format, Format)
. - Usuń metody płatności
DrmSessionManager.DUMMY
igetDummyDrmSessionManager()
. Zamiast tego użyjDrmSessionManager.DRM_UNSUPPORTED
. - Usuń:
AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)
,AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)
,AudioRendererEventListener.onAudioInputFormatChanged(Format)
,VideoRendererEventListener.onVideoInputFormatChanged(Format)
. Zamiast tego użyj przeciążeń, które przyjmują argumentDecoderReuseEvaluation
. - Usuń stałe
RendererSupport.FormatSupport
IntDef iFORMAT_HANDLED
,FORMAT_EXCEEDS_CAPABILITIES
,FORMAT_UNSUPPORTED_DRM
,FORMAT_UNSUPPORTED_SUBTYPE
,FORMAT_UNSUPPORTED_TYPE
. Zamiast tego użyj odpowiednich definicji typu IntDef i konstant w funkcjiandroidx.media3.common.C
(np.C.FORMAT_HANDLED
). - Usuń interfejs
Bundleable
. Obejmuje to usunięcie wszystkich pól stałychBundleable.Creator<Foo> CREATOR
. W takich przypadkach należy używać metodBundle toBundle()
istatic Foo fromBundle(Bundle)
w przypadku każdego typu.
- Usuń
Wersja 1.4.0-rc01
10 lipca 2024 r.
Użyj wersji stabilnej 1.4.0.
Wersja 1.4.0-beta01
26 czerwca 2024 r.
Użyj wersji stabilnej 1.4.0.
Wersja 1.4.0-alpha02
7 czerwca 2024 r.
Użyj wersji stabilnej 1.4.0.
Wersja 1.4.0-alpha01
17 kwietnia 2024 r.
Użyj wersji stabilnej 1.4.0.
Wersja 1.3.0
Wersja 1.3.1
11 kwietnia 2024 r.
androidx.media3:media3-*:1.3.1
został zwolniony.
Wersja 1.3.1 zawiera te komity.
- Biblioteka wspólna:
- Dodaj
Format.labels
, aby zezwolić na lokalizowane lub inne alternatywne etykiety.
- Dodaj
- ExoPlayer:
- Rozwiązanie problemu polegającego na tym, że
PreloadMediaPeriod
nie może zachować strumieni danych, gdy są one ponownie wczytywane. - Zastosowanie odpowiedniego
TrackSelectionResult
do okresu odtwarzania podczas ponownego wybierania ścieżki. - Rozpoczynanie renderowania wczesnego tylko po przesunięciu okresu odtwarzania podczas przechodzenia między elementami multimediów (#1017).
- Dodaj brakujący typ zwracania do reguły proguard
-keepclasseswithmembers
w przypadkuDefaultVideoFrameProcessor.Factory.Builder.build()
(#1187).
- Rozwiązanie problemu polegającego na tym, że
- Transformator:
- Dodaj obejście problemu z wyjątkiem wywołanym z powodu braku obsługi negatywnych sygnałów czasowych w prezentacji przed wersją API 30.
MediaMuxer
- Dodaj obejście problemu z wyjątkiem wywołanym z powodu braku obsługi negatywnych sygnałów czasowych w prezentacji przed wersją API 30.
- Wybór utworu:
DefaultTrackSelector
: preferuj ścieżki wideo z „rozsądną” liczbą klatek na sekundę (≥ 10 fps) zamiast tych z niższą lub nieskonfigurowaną liczbą klatek na sekundę. Dzięki temu odtwarzacz wybierze „prawdziwą” ścieżkę wideo w plikach MP4 wyodrębnionych z filmów poklatkowych, które mogą zawierać 2 ścieżki HEVC, z których jedna ma wyższą rozdzielczość, ale bardzo małą liczbę klatek (#1051).
- Wyodrębnianie:
- Rozwiązanie problemu, który powodował, że podczas odczytu nieparzystych rozmiarów fragmentów z plików WAV nie było pomijane wypełnienie (#1117).
- MP3: wypełnij pole
Format.averageBitrate
za pomocą ramek metadanych, takich jakXING
iVBRI
. - MPEG-TS: cofnij zmianę, która miała na celu zapewnienie renderowania ostatniego obrazu przez przekazanie ostatniej jednostki dostępu strumienia do kolejki próbek (#7909). Wynika to z faktu, że ta zmiana spowodowała nowe problemy ze strumieniami HLS zawierającymi tylko ramki I (#1150) i strumieniami HLS H.262 (#1126).
- Dźwięk:
- Zezwalanie na odzyskiwanie przez procesor graficzny poprzez wyłączenie funkcji offload, jeśli nie uda się zainicjować ścieżki audio w trybie offload.
- Film:
- Dodanie obejścia problemu z urządzeniem Galaxy Tab S7 FE, Chromecastem z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie H265 60 fps są oznaczone jako niedostępne
- Dodaj obejście, które zapewni, że pierwszy kadr będzie zawsze renderowany podczas tunelowania, nawet jeśli urządzenie nie robi tego automatycznie zgodnie z wymaganiami interfejsu API (#1169). (#966).
- Rozwiązanie problemu, w którym obsługa informacji o kolorze HDR powodowała nieprawidłowe działanie kodeka i uniemożliwiała przełączanie na format adaptacyjny w przypadku ścieżek wideo SDR (#1158).
- Tekst:
- WebVTT: zapobieganie tworzeniu przez bezpośrednio następujące po sobie sygnały dodatkowego
CuesWithTiming
instancje zWebvttParser.parse
(#1177).
- WebVTT: zapobieganie tworzeniu przez bezpośrednio następujące po sobie sygnały dodatkowego
- DRM:
- obejście problemu
NoSuchMethodError
, który może zostać wywołany przez frameworkMediaDrm
zamiastResourceBusyException
lubNotProvisionedException
na niektórych urządzeniach z Androidem 14 (#1145);
- obejście problemu
- Skutek:
- Ulepszona mapa tonów PQ na SDR poprzez konwersję przestrzeni kolorów.
- Sesja:
- UI:
- Uwzględnij nazwę języka ścieżki audio, jeśli
Locale
nie może zidentyfikować nazwy wyświetlanej (#988).
- Uwzględnij nazwę języka ścieżki audio, jeśli
- Rozszerzenie DASH:
- Wypełnij wszystkie elementy
Label
z pliku manifestu wFormat.labels
(#1054).
- Wypełnij wszystkie elementy
- Rozszerzenie RTSP:
- Pomijanie pustych wartości informacji o sesji (tagów i) podczas analizowania SDP (#1087).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Domyślnie wyłącz rozszerzenie MIDI jako zależność lokalną, ponieważ wymaga skonfigurowania dodatkowego repozytorium Maven. Użytkownicy, którzy potrzebują tego modułu z lokalnej zależności, mogą go ponownie włączyć.
Wersja 1.3.0
6 marca 2024 roku
androidx.media3:media3-*:1.3.0
został zwolniony.
Wersja 1.3.0 zawiera te komity.
- Biblioteka wspólna:
- Wprowadź obsługę nieprzetworzonych identyfikatorów URI zasobów
android.resource://package/[type/]name
, gdziepackage
jest inny niż pakiet bieżącej aplikacji. Ta funkcja była zawsze udokumentowana, ale do tej pory nie była prawidłowo implementowana. - Normalizuj typy MIME ustawione przez kod aplikacji lub odczytane z multimediów, tak aby były w całości małymi literami.
- Zamiast pojedynczej wartości
Uri
w poluAdPlaybackState
definiuj reklamy za pomocą pełnej wartościMediaItem
. - Zwiększ wartość
minSdk
do 19 (Android KitKat). Jest to zgodne ze wszystkimi innymi bibliotekami AndroidX i jest wymagane, abyśmy mogli zaktualizować do najnowszych wersji zależności AndroidX. - Wypełnij pola
artworkUri
iartworkData
w kolumnieMediaMetadata.Builder.populate(MediaMetadata)
, gdy co najmniej jedno z nich ma wartość niezerową (#964).
- Wprowadź obsługę nieprzetworzonych identyfikatorów URI zasobów
- ExoPlayer:
- Dodaj
PreloadMediaSource
iPreloadMediaPeriod
, które umożliwiają aplikacjom wstępne załadowanie źródła multimediów w konkretnej pozycji początkowej przed odtworzeniem.PreloadMediaSource
zajmuje się przygotowaniem źródła multimediów treści do odbioruTimeline
, przygotowaniem i zapisaniem okresu w podanej pozycji początkowej, wybraniem ścieżek i załadowaniem danych multimediów dla tego okresu. Aplikacje kontrolują postępy w wstępnym wczytywaniu, wdrażającPreloadMediaSource.PreloadControl
, i ustawiają wstępnie wczytane źródło w odtwarzaczu do odtwarzania. - Dodaj uprawnienie
ExoPlayer.setImageOutput
, które umożliwia aplikacjom ustawianie wartościImageRenderer.ImageOutput
. DefaultRenderersFactory
udostępnia terazImageRenderer
graczowi domyślnie z wartością nullImageOutput
iImageDecoder.Factory.DEFAULT
.- Emituj zdarzenie
Player.Listener.onPositionDiscontinuity
, gdy pominięto wyciszenie (#765). - Dodanie eksperymentalnej obsługi analizowania napisów podczas wyodrębniania. Możesz to włączyć za pomocą
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
. - Obsługa dostosowanych źródeł multimediów za pomocą
PreloadMediaSource
. - Zaimplementuj
HttpEngineDataSource
, czyliHttpDataSource
, za pomocą interfejsu HttpEngine API. - Zapobieganie tworzeniu podklas
CompositeSequenceableLoader
. Ten komponent został wcześniej rozszerzony, ale nigdy nie został podklasyfikowany w bibliotece. Dostosowania można wprowadzić, owijając instancję za pomocą wzoru dekoratora i wdrażając niestandardową funkcjęCompositeSequenceableLoaderFactory
. - Rozwiązanie problemu polegającego na tym, że powtarzanie tego samego czasu powoduje wyczyszczenie metadanych tego elementu (#1007).
- Zmień nazwę metod
experimentalSetSubtitleParserFactory
wBundledChunkExtractor.Factory
iDefaultHlsExtractorFactory
nasetSubtitleParserFactory
i zablokuj przekazywanie argumentunull
. Używaj nowych metodexperimentalParseSubtitlesDuringExtraction(boolean)
do kontrolowania zachowania podczas analizowania. - Dodano obsługę dostosowywania
SubtitleParser.Factory
używanego podczas ekstrakcji. Można to zrobić za pomocąMediaSource.Factory.setSubtitleParserFactory()
. - Dodaj prefiks źródła do wszystkich pól
Format.id
wygenerowanych zMergingMediaSource
. Pomaga to zidentyfikować źródło, które wygenerowało odpowiedźFormat
(#883). - Popraw wyrażenie regularne używane do sprawdzania nazw niestandardowych kluczy danych klienta w ramach usługi Common Media Data (CMCD) tak, aby sprawdzało tylko obecność myślnika (#1028).
- Zaprzestanie podwójnego kodowania parametrów zapytania CMCD (#1075).
- Dodaj
- Transformator:
- Dodanie obsługi spłaszczenia filmów w zwolnionym tempie w formacie H.265/HEVC SEF.
- Zwiększ szybkość transmuxowania, zwłaszcza w przypadku zmian typu „usuń wideo”.
- Dodaj interfejs API, aby plik wyjściowy zaczynał się od klatki filmu. Dzięki temu operacje przycinania będą bardziej kompatybilne z implementacjami odtwarzaczy, które nie wyświetlają pierwszego klatki wideo do momentu jej sygnatury czasowej (#829).
- Dodano obsługę optymalizacji operacji przycinania plików MP4 pojedynczego komponentu.
- Dodaj obsługę, aby mieć pewność, że pierwsza sygnatura czasowa w pliku wyjściowym będzie odpowiadać klatce filmu. Naprawiono problem z plikami wyjściowymi zaczynającymi się od czarnego kadru w odtwarzaczach na iOS (#829).
- Wybór utworu:
- Dodaj
DefaultTrackSelector.selectImageTrack
, aby włączyć wybór ścieżki obrazu. - Dodaj
TrackSelectionParameters.isPrioritizeImageOverVideoEnabled
, aby określić, czy wybrać ścieżkę obrazu, jeśli dostępne są zarówno ścieżka obrazu, jak i ścieżka wideo. Wartość domyślna tofalse
, co oznacza, że priorytetem jest wybór ścieżki wideo.
- Dodaj
- Wyodrębnianie:
- Dodaj do ekstraktora MP4 dodatkowe parsowanie AV1C, aby pobrać wartości
ColorInfo.colorSpace
,ColorInfo.colorTransfer
iColorInfo.colorRange
(#692). - MP3: użyj wyszukiwania z stałym bitrate (CBR) dla plików z nagłówkiem
Info
(odpowiadającemu CBR nagłówkowiXing
). Wcześniej używaliśmy tabeli przeskakiwania z nagłówkaInfo
, ale powoduje to mniej precyzyjne przeskakiwanie niż wtedy, gdy zignorujemy ten nagłówek i zakładamy, że plik jest w formacie CBR. - MPEG2-TS: dodanie obsługi DTS, DTS-LBR i DTS:X Profile2 (#275).
- Wyodrębnianie typów dźwięku z opisów TS i przypisywanie im flag ról, co pozwala użytkownikom na dokonywanie bardziej świadomych wyborów ścieżek audio (#973).
- Dodaj do ekstraktora MP4 dodatkowe parsowanie AV1C, aby pobrać wartości
- Dźwięk:
- Film:
- Zmień konstruktor
MediaCodecVideoRenderer
, który przyjmuje argumentVideoFrameProcessor.Factory
, i zastąp go konstruktorem, który przyjmuje argumentVideoSinkProvider
. Aplikacje, które chcą wstrzyknąć niestandardoweVideoFrameProcessor.Factory
, mogą utworzyć instancjęCompositingVideoSinkProvider
, która używa niestandardowegoVideoFrameProcessor.Factory
, i przekazać dostawcę odbiornika wideo doMediaCodecVideoRenderer
.
- Zmień konstruktor
- Tekst:
- Naprawić serializację wskazówek bitmapy, aby rozwiązać błąd
Tried to marshall a Parcel that contained Binder objects
podczas używaniaDefaultExtractorsFactory.setTextTrackTranscodingEnabled
(#836). - CEA-708: zignoruj wartość
rowLock
. Specyfikacja CEA-708-E S-2023 określa, że wartościrowLock
icolumnLock
powinny być uznawane za prawdziwe niezależnie od wartości obecnych w strumieniu (obsługa parametrucolumnLock
nie jest implementowana, więc jest on uznawany za zawsze fałszywy).
- Naprawić serializację wskazówek bitmapy, aby rozwiązać błąd
- Obraz:
- Dodaj obsługę miniatur DASH. Obrazy siatki są przycinane, a pojedyncze miniatury są dostarczane w
ImageOutput
w przybliżeniu do czasu ich wyświetlania.
- Dodaj obsługę miniatur DASH. Obrazy siatki są przycinane, a pojedyncze miniatury są dostarczane w
- DRM:
- Domyślnie odtwarzaj niezwłocznie nieszyfrowane próbki w treściach z DRM, nawet jeśli klucze do późniejszych zaszyfrowanych próbek nie są jeszcze gotowe. Może to spowodować zacinanie się odtwarzania, jeśli klucze nie będą jeszcze gotowe, gdy pozycja odtwarzania osiągnie zaszyfrowane próbki (ale wcześniej odtwarzanie nie zostało jeszcze w ogóle rozpoczęte). To zachowanie można wyłączyć za pomocą parametru
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey
lubDefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
.
- Domyślnie odtwarzaj niezwłocznie nieszyfrowane próbki w treściach z DRM, nawet jeśli klucze do późniejszych zaszyfrowanych próbek nie są jeszcze gotowe. Może to spowodować zacinanie się odtwarzania, jeśli klucze nie będą jeszcze gotowe, gdy pozycja odtwarzania osiągnie zaszyfrowane próbki (ale wcześniej odtwarzanie nie zostało jeszcze w ogóle rozpoczęte). To zachowanie można wyłączyć za pomocą parametru
- Rozszerzenie IMA:
- Rozwiązanie problemu polegającego na tym, że reklamy DASH i HLS bez odpowiedniej rozszerzenia pliku nie mogą być odtwarzane.
- Sesja:
- Wyłącz wykrywanie kliknięć dwukrotnych w aplikacjach na telewizory (#962).
- Rozwiązanie problemu polegającego na tym, że
MediaItem.RequestMetadata
z tylko niezerowymi dodatkami nie jest przesyłany między kontrolerami multimediów i sesjami. - Dodaj konstruktor do klasy
MediaLibrarySession.Builder
, który przyjmuje tylko argumentContext
zamiastMediaLibraryService
.
- Rozszerzenie HLS:
- Zmniejsz widoczność
HlsMediaPeriod
do widoczności prywatnej pakietu. Ten typ nie powinien być bezpośrednio zależny od elementów spoza pakietu HLS. - Rozwiązanie skuteczniej przeszukuje początek segmentu (#1031).
- Zmniejsz widoczność
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Dekoder MIDI: ignoruj komunikaty zdarzeń SysEx (#710).
- Narzędzia testowe:
- Nie wstrzymywaj odtwarzania w aplikacji
TestPlayerRunHelper.playUntilPosition
. Test utrzymuje odtwarzanie w stanie odtwarzania, ale wstrzymuje postępy, dopóki nie będzie można dodać stwierdzeń i dalszych działań.
- Nie wstrzymywaj odtwarzania w aplikacji
- Aplikacja demonstracyjna:
- Dodaj moduł demonstracyjny krótkich treści, aby zaprezentować wykorzystanie
PreloadMediaSource
w przypadku użycia treści krótkich.
- Dodaj moduł demonstracyjny krótkich treści, aby zaprezentować wykorzystanie
Wersja 1.3.0-rc01
22 lutego 2024 r.
Użyj wersji stabilnej 1.3.0.
Wersja 1.3.0-beta01
7 lutego 2024 r.
Użyj wersji stabilnej 1.3.0.
Wersja 1.3.0-alpha01
15 stycznia 2024 r.
Użyj wersji stabilnej 1.3.0.
Wersja 1.2.0
Wersja 1.2.1
9 stycznia 2024 r.
- ExoPlayer:
- Rozwiązaliśmy problem, w którym ręczne przewijanie poza zakres
LiveConfiguration.min/maxOffset
powodowało przesunięcie z powrotem domin/maxOffset
. - Rozwiązanie problemu polegający na tym, że układy kanałów OPUS i VORBIS są nieprawidłowe w przypadku 3, 5, 6, 7 i 8 kanałów (#8396).
- Rozwiązaliśmy problem, który powodował, że wybór ścieżki po przesunięciu do zera w transmisji na żywo nieprawidłowo pozwalał na rozpoczęcie transmisji od pozycji domyślnej (#9347).
- Rozwiązanie problemu, w którym nowe wystąpienia
CmcdData.Factory
otrzymywały ujemne wartości atrybutubufferedDurationUs
ze źródeł fragmentów, co powodowało błądIllegalArgumentException
(#888).
- Rozwiązaliśmy problem, w którym ręczne przewijanie poza zakres
- Transformator:
- Rozwiązanie problemu polegające na tym, że koder zgłasza błąd podczas konfiguracji z powodu ustawienia wysokiej szybkości działania.
- Wyodrębnianie:
- Oznacz jako
ROLE_FLAG_ALTERNATE
dodatkowe (nieodtwarzalne) ścieżki HEVC w zdjęciach w formacie JPEG, aby nie były automatycznie wybierane do odtwarzania ze względu na wyższą rozdzielczość. - Poprawić wykrywanie nieprawidłowej klatki kluczowej w przypadku strumieni TS H264 (#864).
- Naprawiono szacowanie czasu trwania strumieni TS dłuższych niż 47721 sekund (#855).
- Oznacz jako
- Dźwięk:
- Poprawka obsługi EOS dla
SilenceSkippingAudioProcessor
, gdy jest wywoływany kilka razy (#712).
- Poprawka obsługi EOS dla
- Film:
- Dodaj obejście problemu z urządzeniem Galaxy Tab S7 FE, Chromecastem z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie AVC z częstotliwością 60 FPS są oznaczone jako niedostępne (#693).
- Metadane:
- Naprawiono błąd, w którym
MediaMetadata
było wypełniane tylko z komentarzy Vorbis z kluczami w wielkiej literze (#876). - Wyłapywanie
OutOfMemoryError
podczas analizowania bardzo dużych ramek ID3, co oznacza, że odtwarzanie może być kontynuowane bez informacji o tagu, a nie zakończyć się całkowicie.
- Naprawiono błąd, w którym
- DRM:
- Rozszerzenie obejścia problemu z nieprawidłowym adresem URL licencji ClearKey
https://default.url
do poziomu API 33 lub nowszego (wcześniej obejście działało tylko w przypadku poziomu API 33) (#837). - Rozwiązanie problemu z
ERROR_DRM_SESSION_NOT_OPENED
podczas przełączania się z zaszyfrowanych na przejrzyste treści bez powierzchni przymocowanej do odtwarzacza. Ten błąd wystąpił z powodu nieprawidłowego użycia bezpiecznego dekodera do odtwarzania treści bez szyfrowania.
- Rozszerzenie obejścia problemu z nieprawidłowym adresem URL licencji ClearKey
- Sesja:
- Umieść klucze i wartości niestandardowe w wartościach
MediaMetadataCompat
doMediaMetadata.extras
iMediaMetadata.extras
doMediaMetadataCompat
(#756, #802). - Naprawiono problem z transmisją
notifyChildrenChanged
w przypadku starszych kontrolerów (#644). - Naprawiliśmy błąd, który powodował awarię na niektórych urządzeniach po ustawieniu ujemnego czasu dla wyłączonego
setWhen
minutnika powiadomienia (#903). - Naprawiono błąd
IllegalStateException
, gdy kontroler powiadomienia o multimediach nie ukończy połączenia po wysłaniu żądania pierwszego powiadomienia (#917).
- Umieść klucze i wartości niestandardowe w wartościach
- UI:
- Rozwiązanie problemu polegającego na tym, że przyciski przewijania do przodu i do tyłu nie są widoczne, gdy są używane w ramach interfejsu Material Design w BottomSheetDialogFragment (#511).
- Rozwiązanie problemu polegającego na tym, że przyciski przewijania do przodu w
PlayerControlView
były nieprawidłowo wyrównane (#547).
- Rozszerzenie DASH:
- Przeanalizuj „f800” jako liczbę kanałów 5 dla Dolby w pliku manifestu DASH (#688).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Rozszerzenie Cast:
- Sanitize creation of a
Timeline
to not crash the app when loading media fails on the cast device (#708).
- Sanitize creation of a
Wersja 1.2.0
15 listopada 2023 r.
- Biblioteka wspólna:
- Dodaj parametr
@Nullable Throwable
do metod w interfejsieLog.Logger
. Parametrmessage
tych metod nie zawiera już żadnych informacji o parametryThrowable
przekazanych metodomLog.{d,i,w,e}()
, więc implementacje będą musiały ręcznie dołączać te informacje (np. za pomocą parametruLogger.appendThrowableString(String, Throwable)
). - Rozwiązanie problemu z kompatybilnością Kotlina polegającego na tym, że parametry typu ogólnego z możliwością wartości pustej i typy elementów tablicy z możliwością wartości pustej nie są wykrywane jako umożliwiające wartości pustą. Przykładami są parametry metody
TrackSelectorResult
iSimpleDecoder
(#6792). - Zmień domyślne zachowanie interfejsu i powiadomień w
Util.shouldShowPlayButton
, aby wyświetlić przycisk „odtwórz” podczas tymczasowego wstrzymania odtwarzania (np. z powodu chwilowego utraty skupienia na dźwięku). Aby zachować zachowanie zgodne ze starszymi wersjami, użyj opcjiPlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)
lubMediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)
(#11213). - Aby rozwiązać problem https://issuetracker.google.com/251172715, zaktualizuj wersję
androidx.annotation:annotation-experimental
na1.3.1
. - Przenieś
ExoPlayer.setAudioAttributes
do interfejsuPlayer
.
- Dodaj parametr
- ExoPlayer:
- Rozwiązanie problemów z przewijaniem w strumieniu AC4 spowodowanych nieprawidłowym rozpoznawaniem próbek przeznaczonych tylko do dekodowania (#11000).
- Dodaj funkcję blokowania odtwarzania na nieodpowiednich urządzeniach z wyjściami audio (np. wbudowany głośnik na urządzeniach z Wear OS), gdy ta funkcja jest włączona za pomocą
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput
. Jeśli podczas odtwarzania nie ma dostępnych odpowiednich wyjść audio lub wszystkie odpowiednie wyjścia zostaną odłączone podczas odtwarzania, przyczyna tłumienia odtwarzania zostanie zaktualizowana naPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
. Po podłączeniu odpowiedniego wyjścia przyczyna pominięcia zostanie usunięta. - Dodaj elementy
MediaSource.canUpdateMediaItem
iMediaSource.updateMediaItem
, aby akceptować aktualizacjeMediaItem
po utworzeniu za pomocą elementuPlayer.replaceMediaItem(s)
. - Zezwalaj na aktualizacje
MediaItem
dla wszystkich klasMediaSource
udostępnianych przez bibliotekę za pomocąPlayer.replaceMediaItem(s)
(#33, #9978). - Zmień nazwę
MimeTypes.TEXT_EXOPLAYER_CUES
naMimeTypes.APPLICATION_MEDIA3_CUES
. - Dodaj
PngExtractor
, który wysyła i odczytuje cały plik PNG doTrackOutput
jako jedną próbkę. - Ulepszona metoda
SequenceableLoader.continueLoading(long)
w interfejsieSequenceableLoader
została zastąpiona metodąSequenceableLoader.continueLoading(LoadingInfo loadingInfo)
. TagLoadingInfo
zawiera dodatkowe parametry, w tymplaybackSpeed
ilastRebufferRealtimeMs
, oprócz dotychczasowego parametruplaybackPositionUs
. - Zaktualizuj metodę
ChunkSource.getNextChunk(long, long, List, ChunkHolder)
w interfejsieChunkSource
, aby stała sięChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
. - Dodaj dodatkowe pola do rejestrowania danych klienta w ramach wspólnego interfejsu mediów (CMCD): buffer starvation (
bs
), deadline (dl
), playback rate (pr
) i startup (su
) (#8699). - Dodaj głębię bitową luminacji i chrominancji do
ColorInfo
(#491). - Dodaj dodatkowe pola do rejestrowania danych klienta w ramach wspólnego interfejsu mediów (CMCD): żądanie następnego obiektu (
nor
) i żądanie następnego zakresu (nrr
) (#8699). - Dodaj funkcję przesyłania danych klienta wspólnego multimediów (CMCD) za pomocą parametrów zapytania (#553).
- Napraw problem
ConcurrentModificationException
w sekcjiExperimentalBandwidthMeter
(#612). - Dodaj parametr
MediaPeriodId
doCompositeMediaSource.getMediaTimeForChildMediaTime
. - Obsługa
ClippingMediaSource
(i innych źródeł z przesunięciem czasowym okresu/okna) wConcatenatingMediaSource2
(#11226). - Zmień
BaseRenderer.onStreamChanged()
, aby otrzymywać również argumentMediaPeriodId
.
- Transformator:
- Przetwarzanie danych EXIF dotyczących obracania dla danych wejściowych obrazu.
- Usuń typ adnotacji
TransformationRequest.HdrMode
i powiązane z nim stałe. Zamiast tego użyj funkcjiComposition.HdrMode
i powiązanych z nią stałych. - Uprość
OverlaySettings
, aby rozwiązać problemy z rotacją. - Zmieniono parametry
frameRate
idurationUs
w urządzeniuSampleConsumer.queueInputBitmap
naTimestampIterator
.
- Wybór utworu:
- Dodaj
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness
, aby wyraźnie zezwolić lub zabronić niepłynnej adaptacji. Domyślnie działanie pozostaje takie samo jak w przypadku wartościtrue
.
- Dodaj
- Wyodrębnianie:
- MPEG-TS: aby mieć pewność, że ostatnia klatka zostanie wyrenderowana, prześlij ostatnią jednostkę dostępu strumienia do kolejki próbek (#7909).
- Poprawiono literówkę w przypadku określania
rotationDegrees
. ZmienionoprojectionPosePitch
naprojectionPoseRoll
(#461). - Usuń założenie, że instancje
Extractor
można bezpośrednio przeglądać za pomocą funkcjiinstanceof
. Jeśli chcesz uzyskać dostęp do szczegółów implementacji funkcjiExtractor
w czasie wykonywania, musisz najpierw wywołać funkcjęExtractor.getUnderlyingInstance
. - Dodaj
BmpExtractor
. - Dodaj
WebpExtractor
. - Dodaj
HeifExtractor
. - Dodaj obsługę klasycznej wersji QuickTime do
Mp4Extractor
.
- Dźwięk:
- Dodano obsługę 24-/32-bitowego kodowania PCM w formacie big-endian w plikach MP4 i Matroska oraz zanalizowano kodowanie
lpcm
w formacie PCM w plikach MP4. - Dodano obsługę wyodrębniania dźwięku Vorbis w formacie MP4.
- Dodaj
AudioSink.getFormatOffloadSupport(Format)
, który pobiera poziom obsługi offloadu, który może zapewnić odbiornik dla formatu za pomocąDefaultAudioOffloadSupportProvider
. Zwraca nową kolumnęAudioOffloadSupport
zawierającą kolumnyisFormatSupported
,isGaplessSupported
iisSpeedChangeSupported
. - Dodaj
AudioSink.setOffloadMode()
, za pomocą którego konfigurowana jest konfiguracja przesyłania na gniazdo audio. Wartość domyślna toAudioSink.OFFLOAD_MODE_DISABLED
. - Przesyłanie danych można włączyć w sekcji
setAudioOffloadPreference
w ustawieniachTrackSelectionParameters
. Jeśli ustawione ustawienie to „Włącz”, urządzenie obsługuje przenoszenie danych dla danego formatu, a wybrana ścieżka to pojedyncza ścieżka audio, przenoszenie danych audio zostanie włączone. - Jeśli
audioOffloadModePreference
ma wartośćAUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED
,DefaultTrackSelector
wybierze tylko ścieżkę audio, o ile format tej ścieżki jest obsługiwany w ramach funkcji offload. Jeśli podczas przenoszenia nie jest obsługiwana żadna ścieżka audio, nie zostanie wybrana żadna ścieżka. - Wyłączenie obsługi bez przerw dla przenoszenia w przypadku interfejsu API w wersji wcześniejszej niż 33 ze względu na problem z pozycją odtwarzania po przejściu do następnego utworu.
- Usuń parametr
enableOffload
z podpisu metodyDefaultRenderersFactory.buildAudioSink
. - Usuń metodę
DefaultAudioSink.Builder.setOffloadMode
. - Usuń wartość nieokreśloną
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
. - Dodawanie obsługi metadanych Opus bez przerw podczas odtwarzania offline.
- Zezwalanie na odzyskiwanie przez procesor graficzny polegające na wyłączeniu przesyłania, jeśli nie udało się podczas pierwszego zapisu (#627).
- Domyślnie włącz harmonogram przenoszenia danych w przypadku odtwarzania tylko dźwięku.
- Usuń
ExoPlayer.experimentalSetOffloadSchedulingEnabled
iAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
. - Zmieniono nazwę
onExperimentalSleepingForOffloadChanged
naonSleepingForOffloadChanged
, aonExperimentalOffloadedPlayback
naonOffloadedPlayback
. - Przenieś interfejsy
TrackSelectionParameters
i definicje związane z trybem przesyłania audio do wewnętrznej klasyAudioOffloadPreferences
. - Dodaj wywołania zwrotne
onAudioTrackInitialized
ionAudioTrackReleased
do funkcjiAnalyticsListener
,AudioRendererEventListener
iAudioSink.Listener
. - Rozwiązanie problemu z przepełnieniem bufora dźwięku DTS Express (#650).
- Naprawiono błąd, który powodował, że sprawdzanie możliwości E-AC3-JOC powodowało błąd
IllegalArgumentException
(#677).
- Dodano obsługę 24-/32-bitowego kodowania PCM w formacie big-endian w plikach MP4 i Matroska oraz zanalizowano kodowanie
- Film:
- Zezwalaj aplikacji
MediaCodecVideoRenderer
na korzystanie z niestandardowejVideoFrameProcessor.Factory
. - Usunęliśmy błąd, który powodował, że nie można było wyświetlić pierwszego klatki, jeśli strumień audio zaczyna się od ujemnych sygnatur czasowych (#291).
- Zezwalaj aplikacji
- Tekst:
- Usuń
ExoplayerCuesDecoder
. Ścieżki tekstowe zsampleMimeType = application/x-media3-cues
są teraz obsługiwane bezpośrednio przezTextRenderer
bez konieczności korzystania z instancjiSubtitleDecoder
.
- Usuń
- Metadane:
- Funkcja
MetadataDecoder.decode
nie będzie już wywoływana w przypadku próbek „tylko do dekodowania”, ponieważ implementacja musi zwracać null.
- Funkcja
- Skutek:
- Dodaj
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)
ustawienie kolejki danych bitmapy według sygnatury czasowej. - Zmień
VideoFrameProcessor.registerInputStream()
na nieblokujący. Aplikacje muszą implementowaćVideoFrameProcessor.Listener#onInputStreamRegistered()
. - Zmieniono parametry
frameRate
idurationUs
w urządzeniuVideoFrameProcessor.queueInputBitmap
naTimestampIterator
.
- Dodaj
- Rozszerzenie IMA:
- Naprawiono błąd, który powodował, że transmisja na żywo DASH obejmująca wiele okresów, która nie jest pierwszym elementem na playliście, mogła wywołać wyjątek (#571).
- Przed wywołaniem
AdsLoader.destroy()
zwalniaj obiekt StreamManager - Zaktualizuj pakiet IMA SDK do wersji 3.31.0.
- Sesja:
- W pliku
DefaultMediaNotificationProvider
ustaw zachowanie usługi powiadomień na pierwszym planie naFOREGROUND_SERVICE_IMMEDIATE
(#167). - Aby uniknąć problemów z nieobsługiwanym interfejsem API na urządzeniach Samsung, używaj tylko wersji
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()
powyżej 31 (#167). - Użyj kontrolera powiadomień multimedialnych jako elementu pośredniczącego, aby ustawić dostępne polecenia i niestandardowy układ służący do wypełniania powiadomień i sesji platformy.
- Konwertuj zdarzenia przycisku multimediów otrzymywane przez
MediaSessionService.onStartCommand()
w Media3 zamiast kierować je do sesji platformy i z powrotem do Media3. W tym przypadku kontroler wywołującego jest zawsze kontroler powiadomienia multimedialnego, a aplikacje mogą łatwo rozpoznawać wywołania przychodzące z powiadomienia w taki sam sposób na wszystkich obsługiwanych poziomach interfejsu API. - Usunęliśmy błąd, który powodował, że
MediaController.getCurrentPosition()
nie przewija się, gdy jest połączony ze starszą wersjąMediaSessionCompat
. - Dodaj
MediaLibrarySession.getSubscribedControllers(mediaId)
dla wygody. - Zastąp
MediaLibrarySession.Callback.onSubscribe()
, aby potwierdzić dostępność identyfikatora nadrzędnego, do którego subskrybuje kontroler. Jeśli operacja się powiedzie, subskrypcja zostanie zaakceptowana, a funkcjanotifyChildrenChanged()
zostanie natychmiast wywołana, aby poinformować przeglądarkę (#561). - Dodaj moduł demonstracyjny sesji dla Automotive OS i włącz demonstrację sesji dla Androida Auto.
- Nie ustawiaj kolejki sesji frameworku, gdy
COMMAND_GET_TIMELINE
jest niedostępna dla kontrolera powiadomień multimedialnych. Gdy Android Auto jest kontrolerem klienta odczytuje dane z sesji frameworku, w interfejsie Androida Auto nie będzie widoczny przyciskqueue
(#339). - Domyślnie używaj wartości
DataSourceBitmapLoader
zamiast wartościSimpleBitmapLoader
(#271, #327). - Dodaj
MediaSession.Callback.onMediaButtonEvent(Intent)
, który umożliwia aplikacjom zastąpienie domyślnego sposobu obsługi zdarzeń przycisku multimediów.
- W pliku
- UI:
- Dodaj implementację
Player.Listener
na urządzeniach z Wear OS, która obsługuje tłumienie odtwarzania z powoduPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
, uruchamiając okno dialogowe systemu, aby umożliwić użytkownikowi podłączenie odpowiedniego wyjścia audio (np. słuchawek Bluetooth). Odtwarzanie zostanie automatycznie wznowione, jeśli odpowiednie urządzenie zostanie podłączone w określonym czasie (domyślnie 5 minut).
- Dodaj implementację
- Pobrane:
- Zadeklaruj typ usługi na pierwszym planie „synchronizacja danych” dla
DownloadService
, aby zapewnić zgodność z Androidem 14. Aby korzystać z tej usługi, aplikacja musi też dodaćdataSync
jakoforegroundServiceType
w pliku manifestu i dodać uprawnienieFOREGROUND_SERVICE_DATA_SYNC
(#11239).
- Zadeklaruj typ usługi na pierwszym planie „synchronizacja danych” dla
- Rozszerzenie HLS:
- Odświeżaj playlistę z transmisją na żywo HLS z interwałem obliczanym od ostatniego czasu rozpoczęcia wczytywania, a nie od ostatniego ukończonego wczytania (#663).
- Rozszerzenie DASH:
- Zezwalanie na występowanie tego samego identyfikatora DASH w adresie URL szablonu segmentu.
- Dodanie eksperymentalnej obsługi analizowania napisów podczas wyodrębniania. Wprowadziliśmy też lepszą obsługę łączenia nakładających się napisów, w tym usunięcie migotania podczas przełączania między segmentami napisów. Możesz to włączyć za pomocą
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
(#288).
- Rozszerzenie RTSP:
- Usunięto warunek wyścigu, który mógł prowadzić do
IndexOutOfBoundsException
podczas korzystania z TCP lub zawieszania odtwarzania w pewnych sytuacjach. - Sprawdź stan w konfiguracji RTSP podczas zwracania stanu wczytywania
RtspMediaPeriod
(#577). - Ignorowanie niestandardowych metod żądania RTSP w nagłówku publicznym odpowiedzi opcji (#613).
- Użyj wartości czasu oczekiwania na odpowiedź konfiguracji RTSP w interwale czasu wysyłania próśb o opcje RTSP keep-alive (#662).
- Usunięto warunek wyścigu, który mógł prowadzić do
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Opublikuj moduł dekodera MIDI, który zapewnia obsługę odtwarzania standardowych plików MIDI za pomocą biblioteki Jsyn do syntezy dźwięku.
- Dodaj
DecoderOutputBuffer.shouldBeSkipped
, aby bezpośrednio oznaczyć bufory wyjściowe, które nie muszą być prezentowane. Jest to preferowane rozwiązanie w związku z tym, że funkcjaC.BUFFER_FLAG_DECODE_ONLY
zostanie wycofana. - Dodaj
Decoder.setOutputStartTimeUs
iSimpleDecoder.isAtLeastOutputStartTimeUs
, aby dekodery mogły odrzucić próbki tylko do dekodowania przed czasem rozpoczęcia. Należy używać tego parametru zamiast parametruBuffer.isDecodeOnly
, który zostanie wycofany. - Naprawiono błąd publikowania artefaktu dekodera MIDI w repozytorium Maven. Nazwa artefaktu została zmieniona na
media3-exoplayer-midi
(#734).
- Rozszerzenie leanback:
- Naprawiono błąd, który powodował, że wyłączenie powierzchni mogło spowodować błąd
ArithmeticException
w Leanback (#617).
- Naprawiono błąd, który powodował, że wyłączenie powierzchni mogło spowodować błąd
- Narzędzia testowe:
- Spraw, aby
TestExoPlayerBuilder
iFakeClock
były zgodne z testami interfejsu użytkownika Espresso i testami interfejsu użytkownika Compose. Rozwiązanie to naprawia błąd polegający na tym, że odtwarzanie nie działało w sposób deterministyczny podczas interakcji z widokami Espresso lub Compose.
- Spraw, aby
- Usuń symbole wycofane:
- Usuń
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)
iTransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)
. Zamiast tego użyj operatoraComposition.Builder.setHdrMode(int)
i przekaż parametrComposition
do funkcjiTransformer.start(Composition, String)
. - Usuń wycofaną metodę
DownloadNotificationHelper.buildProgressNotification
i zamiast niej użyj metody, która nie została wycofana i przyjmuje parametrnotMetRequirements
.
- Usuń
Wersja 1.2.0-rc01
1 listopada 2023 roku
Użyj wersji stabilnej 1.2.0.
Wersja 1.2.0-beta01
19 października 2023 r.
Użyj wersji stabilnej 1.2.0.
Wersja 1.2.0-alpha02
29 września 2023 r.
Użyj wersji stabilnej 1.2.0.
Wersja 1.2.0-alpha01
17 sierpnia 2023 r.
Użyj wersji stabilnej 1.2.0.
Wersja 1.1.0
Wersja 1.1.1
16 sierpnia 2023 r.
- Biblioteka wspólna:
- Usuń ze wszystkich modułów przypadkowo dodaną zależność
multidex
(#499).
- Usuń ze wszystkich modułów przypadkowo dodaną zależność
- ExoPlayer:
- Rozwiązanie problemu w
PlaybackStatsListener
, w którym po wyczyszczeniu playlisty tworzone są nieprawidłowePlaybackStats
. - Dodaj dodatkowe pola do rejestrowania danych klienta wspólnego (CMCD): format strumieniowania (sf), typ strumienia (st), wersja (v), najwyższy bitrate (tb), czas trwania obiektu (d), zmierzona przepustowość (mtp) i typ obiektu (ot) (#8699).
- Rozwiązanie problemu w
- Dźwięk:
- Rozwiązanie błędu, który powodował, że
Player.getState()
nigdy nie przechodziło doSTATE_ENDED
podczas odtwarzania bardzo krótkich plików (#538).
- Rozwiązanie błędu, który powodował, że
- Przesyłanie ścieżki audio:
- Dodaj nagłówek identyfikatora Ogg i strony nagłówka komentarza do bitstreama na potrzeby odtwarzania Opusa w chmurze zgodnie ze standardem RFC 7845.
- Film:
- H.265/HEVC: poprawiono analizowanie informacji o krótkim i długim okresie referencyjnym obrazu SPS.
- Tekst:
- CEA-608: zmiana logiki skracania cue, aby uwzględniać tylko widoczny tekst. Wcześniej wcięcie i przesunięcie tabulacji były uwzględniane przy ograniczaniu długości cue do 32 znaków (co było technicznie zgodne ze specyfikacją) (#11019).
- Rozszerzenie IMA:
- Zaktualizuj wersję pakietu IMA SDK do 3.30.3.
- Sesja:
- Dodaj niestandardowy układ do stanu kontrolera i zapewnij dostęp do niego za pomocą metody gettera. Gdy układ niestandardowy ulegnie zmianie, zostanie wywołana funkcja
MediaController.Listener.onCustomLayoutChanged
. Aplikacje, które chcą wysyłać różne układy niestandardowe do różnych kontrolerów Media3, mogą to zrobić wMediaSession.Callback.onConnect
, używającAcceptedResultBuilder
, aby upewnić się, że układ niestandardowy jest dostępny dla kontrolera po zakończeniu procesu łączenia. - Rozwiązanie problemu, w którym
MediaLibraryServiceLegacyStub
wysyła błąd doResult
, który nie obsługuje tej funkcji, co powoduje błądUnsupportedOperationException
(#78). - Napraw sposób, w jaki
PlayerWrapper
tworzyVolumeProviderCompat
, określającvolumeControlType
za pomocą zarówno starszych poleceń (COMMAND_ADJUST_DEVICE_VOLUME
iCOMMAND_SET_DEVICE_VOLUME
), jak i nowych poleceń (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
iCOMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
) (#554).
- Dodaj niestandardowy układ do stanu kontrolera i zapewnij dostęp do niego za pomocą metody gettera. Gdy układ niestandardowy ulegnie zmianie, zostanie wywołana funkcja
Wersja 1.1.0
5 lipca 2023 r.
- Biblioteka wspólna:
- Dodaj powód pominięcia nieodpowiedniej ścieżki audio i odtwarzania po zakończeniu. Zmień powód pominięcia zbyt długiego odtwarzania. (#15).
- Dodawanie poleceń do odtwarzacza:
COMMAND_GET_METADATA
COMMAND_SET_PLAYLIST_METADATA
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- Dodaj do Playera przeciążone metody, które umożliwiają użytkownikom określanie flag głośności:
void setDeviceVolume(int, int)
void increaseDeviceVolume(int)
void decreaseDeviceVolume(int)
void setDeviceMuted(boolean, int)
- Dodaj
Builder
dlaDeviceInfo
i wycofaj istniejący konstruktor. - Dodaj
DeviceInfo.routingControllerId
, aby określić identyfikator kontrolera routingu na potrzeby odtwarzania zdalnego. - Dodaj
Player.replaceMediaItem(s)
jako skrót do dodawania i usuwania elementów w tej samej pozycji (#8046).
- ExoPlayer:
- Zezwalaj ExoPlayerowi na kontrolowanie głośności urządzenia tylko wtedy, gdy użytkownik wyraźnie wyrazi na to zgodę. Użyj
ExoPlayer.Builder.setDeviceVolumeControlEnabled
, aby uzyskać dostęp do:getDeviceVolume()
isDeviceMuted()
setDeviceVolume(int)
isetDeviceVolume(int, int)
increaseDeviceVolume(int)
iincreaseDeviceVolume(int, int)
decreaseDeviceVolume(int)
idecreaseDeviceVolume(int, int)
- Dodaj
FilteringMediaSource
, który umożliwia filtrowanie dostępnych typów ścieżek wMediaSource
. - Dodaj obsługę dołączania danych klienta Common Media Data (CMCD) w wychodzących żądaniach formatów strumieniowego przesyłania danych w systemie adaptacyjnej transmisji danych DASH, HLS i SmoothStreaming. Zostały uwzględnione pola:
br
,bl
,cid
,rtp
isid
(#8699). Struktura interfejsu API i metody API:- Rejestrowanie CMCD jest domyślnie wyłączone. Aby je włączyć, użyj polecenia
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory)
. - Domyślnie wszystkie klucze są włączone. Aby wykluczyć niektóre z nich z logowania, użyj parametru override:
CmcdConfiguration.RequestConfig.isKeyAllowed(String key)
. - Zastąp
CmcdConfiguration.RequestConfig.getCustomData()
, aby włączyć logowanie niestandardowych kluczy.
- Rejestrowanie CMCD jest domyślnie wyłączone. Aby je włączyć, użyj polecenia
- Dodaj dodatkową akcję do pliku manifestu głównej wersji demonstracyjnej, aby ułatwić uruchamianie aplikacji demonstracyjnej za pomocą niestandardowego pliku
*.exolist.json
(#439). - Dodaj
ExoPlayer.setVideoEffects()
, aby używaćEffect
podczas odtwarzania filmu. - Zaktualizuj
SampleQueue
, aby przechowywaćsourceId
jakolong
, a nieint
. Zmiana ta zmienia sygnatury publicznych metodSampleQueue.sourceId
iSampleQueue.peekSourceId
. - Dodaj do metod
LoadControl
shouldStartPlayback
ionTracksSelected
parametry, które umożliwiają powiązanie tych metod z odpowiednimiMediaPeriod
. - Zmień podpis
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)
, dodając parametr osi czasu zawierający okresy z identyfikatorami unikatowymi (UID) używanymi jako klucze na mapie. Jest to konieczne, aby uniknąć problemów z jednoczesnością w przypadku transmisji na żywo obejmujących wiele okresów. - Wycofaj funkcje
EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)
iBaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)
. Zamiast tego można wywołać wariant metody bez parametrumediaTimeOffsetUs
. Pamiętaj, że nawet w przypadku wycofanych wersji offset nie jest już dodawany do wartościstartTimeUs
iendTimeUs
obiektówMediaLoadData
, które są wysyłane przez moduł rozsyłający. - Zmień nazwę
ExoTrackSelection.blacklist
naexcludeTrack
, aisBlacklisted
naisTrackExcluded
. - Naprawiono niespójności między metodami
ExoPlayer.setMediaItem(s)
iaddMediaItem(s)
podczas wywołania pustej playlisty.
- Zezwalaj ExoPlayerowi na kontrolowanie głośności urządzenia tylko wtedy, gdy użytkownik wyraźnie wyrazi na to zgodę. Użyj
- Transformator:
- Usuń
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)
. Zamiast niej użyj zasadExoPlayerAssetLoader.Factory(MediaSource.Factory)
iTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)
. - Usuń
Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
. - Usunęliśmy błąd, który powodował zawieszanie się przekształcenia (co prowadziło do przekroczenia limitu czasu muxera), jeśli koniec strumienia wideo był sygnalizowany w momencie, gdy ramka wejściowa oczekiwała na przetworzenie.
- Aby zwiększyć obsługę, wysyłaj zapytania do kodeków za pomocą narzędzia
MediaCodecList
zamiast narzędziafindDecoder/EncoderForFormat
. - Usuń konfigurację ramki B w urządzeniu
DefaultEncoderFactory
, ponieważ nie działa ona na niektórych urządzeniach.
- Usuń
- Wybór ścieżki:
- Dodaj
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange
który jest domyślnie wyłączony. Po włączeniu opcjaDefaultTrackSelector
wywołuje wybór nowego utworu, gdy zmienią się możliwości renderera.
- Dodaj
- Wyodrębnianie:
- Dźwięk:
- Naprawiono błąd, który powodował, że niektóre odtwarzania nie działały, gdy tunelowanie było włączone, a
AudioProcessors
były aktywne, np. w przypadku przycinania bez przerw (#10847). - Opakowanie ramek Opus w pakietach Ogg w przypadku bezpośredniego odtwarzania (przesyłania).
- ekstrapolowanie bieżącej pozycji podczas uśpienia za pomocą harmonogramu przenoszenia;
- Dodaj
Renderer.release()
iAudioSink.release()
, aby uwolnić zasoby na końcu cyklu życia odtwarzacza. - Słuchaj zmian w możliwościach związanych z dźwiękiem w
DefaultAudioSink
. Do konstruktora klasyDefaultAudioSink
dodaj parametr wymaganycontext
, za pomocą którego klasaDefaultAudioSink
zarejestruje się jako odbiorca zdarzeń w klasieAudioCapabilitiesReceiver
i zaktualizuje swoją właściwośćaudioCapabilities
, gdy zostanie poinformowana o zmianie możliwości. - Rozpowszechnianie zmian w możliwościach dotyczących dźwięku za pomocą nowego zdarzenia
onAudioCapabilitiesChanged
w interfejsieAudioSink.Listener
oraz nowego interfejsuRendererCapabilities.Listener
, który uruchamia zdarzeniaonRendererCapabilitiesChanged
. - Dodaj
ChannelMixingAudioProcessor
, aby zastosować skalowanie lub miksowanie do kanałów audio. - Dodaj nową wartość int
DISCARD_REASON_AUDIO_BYPASS_POSSIBLE
doDecoderDiscardReasons
, aby odrzucić dekoder audio, gdy tryb obejścia jest możliwy po zmianie możliwości audio. - Dodano obsługę bezpośredniego odtwarzania dla DTS Express i DTS:X (#335).
- Naprawiono błąd, który powodował, że niektóre odtwarzania nie działały, gdy tunelowanie było włączone, a
- Film:
- Gdy renderowanie jest wyłączone, element
MediaCodecVideoRenderer
powinien raportować elementVideoSize
o szerokości i wysokości 0. FunkcjaPlayer.Listener.onVideoSizeChanged
jest wywoływana odpowiednio, gdy zmienia się wartość zmiennejPlayer.getVideoSize()
. Dzięki tej zmianie rozmiar wideo ExoPlayera zMediaCodecVideoRenderer
ma szerokość i wysokość 0, gdyPlayer.getCurrentTracks
nie obsługuje wideo lub gdy rozmiar obsługiwanej ścieżki wideo nie został jeszcze określony.
- Gdy renderowanie jest wyłączone, element
- DRM:
- Zmniejsz widoczność kilku metod tylko wewnętrznych w
DefaultDrmSession
, które nie powinny być wywoływane spoza pakietu DRM:void onMediaDrmEvent(int)
void provision()
void onProvisionCompleted()
onProvisionError(Exception, boolean)
- Zmniejsz widoczność kilku metod tylko wewnętrznych w
- Muxer:
- Dodaj nową bibliotekę muxera, której można używać do tworzenia plików kontenera MP4.
- Rozszerzenie IMA:
- Włącz transmisje na żywo DASH z wieloma przedziałami czasu na potrzeby dynamicznego wstawiania reklam. Pamiętaj, że obecna implementacja nie obsługuje jeszcze przewijania w transmisjach na żywo (#10912).
- Naprawiono błąd, który powodował wstawianie nowej grupy reklam w transmisjach na żywo z powodu niewielkich różnic w obliczonej pozycji treści na kolejnych liniach czasowych.
- Sesja:
- Dodaj pomocniczą metodę
MediaSession.getControllerForCurrentRequest
, aby uzyskać informacje o kontrolerze, który obecnie wywołuje metodęPlayer
. - Dodaj
androidx.media3.session.MediaButtonReceiver
, aby umożliwić aplikacjom wznawianie odtwarzania za pomocą zdarzeń przycisku multimediów wysyłanych przez przykładowo zestaw słuchawkowy Bluetooth (#167). - Dodaj do
MediaSession.Callback.onAddMediaItems
domyślną implementację, aby umożliwić przekazywanie żądanychMediaItems
doPlayer
, jeśli mają oneLocalConfiguration
(np. URI) (#282). - Dodaj przyciski poleceń „przewinąć do poprzedniego” i „przewinąć do następnego” w kompaktowym widoku powiadomienia o mediach domyślnie w Androidzie 12 i starszych (#410).
- Dodaj do
MediaSession.Callback.onAddMediaItems
domyślną implementację, aby umożliwić przekazywanie żądanychMediaItems
doPlayer
, jeśli mają oneLocalConfiguration
(np. URI) (#282). - Dodaj przyciski poleceń „przewinąć do poprzedniego” i „przewinąć do następnego” w kompaktowym widoku powiadomienia o mediach domyślnie w Androidzie 12 i starszych (#410).
- Dodaj pomocniczą metodę
- UI:
- Dodaj metody Util
shouldShowPlayButton
ihandlePlayPauseButtonAction
, aby pisać niestandardowe elementy interfejsu z przyciskiem odtwarzania/pauzowania.
- Dodaj metody Util
- Rozszerzenie RTSP:
- Rozszerzenie DASH:
- Usuń przesunięcie czasu multimediów z
MediaLoadData.startTimeMs
iMediaLoadData.endTimeMs
w przypadku strumieni DASH z wieloma okresami. - Usunęliśmy błąd, który powodował, że ponowne przygotowanie źródła multi-periodycznego strumienia danych Dash do multimediów powodowało błąd
IndexOutOfBoundsException
(#10838).
- Usuń przesunięcie czasu multimediów z
- Rozszerzenie HLS:
- Dodaj
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)
, aby ustawić limit czasu dla wątku ładowania, który ma czekać na zainicjowanie funkcjiTimestampAdjuster
. Jeśli inicjalizacja nie zostanie zakończona przed upływem czasu oczekiwania, zostanie wywołana funkcjaPlaybackException
, aby uniknąć niekończącego się opóźnienia odtwarzania. Domyślnie czas oczekiwania jest ustawiony na 0 (#323).
- Dodaj
- Narzędzia testowe:
- Sprawdź, czy w
DataSourceContractTest
schemat adresu URL jest niezależny od wielkości liter.
- Sprawdź, czy w
- Usuń symbole wycofane:
- Usuń konstruktory
DefaultAudioSink
i zamiast nich użyj konstruktoraDefaultAudioSink.Builder
. - Usuń polecenie
HlsMasterPlaylist
i użyj zamiast niego poleceniaHlsMultivariantPlaylist
. - Usuń
Player.stop(boolean)
. Zamiast niej użyj zasadPlayer.stop()
iPlayer.clearMediaItems()
(jeślireset
ma wartośćtrue
). - Usuń 2 wycofane konstruktory
SimpleCache
i zamiast nich użyj konstruktora, który przyjmuje argumentDatabaseProvider
, aby uzyskać lepszą wydajność. - Usuń konstruktor
DefaultBandwidthMeter
i zamiast niego użyj konstruktoraDefaultBandwidthMeter.Builder
. - Usuń konstruktory
DefaultDrmSessionManager
i zamiast nich użyj konstruktoraDefaultDrmSessionManager.Builder
. - Usuń 2 wycofane konstruktory
HttpDataSource.InvalidResponseCodeException
, użyj konstruktora, który nie został wycofany i akceptuje dodatkowe pola(cause
,responseBody
), aby zwiększyć możliwości rejestrowania błędów. - Usuń zasady
DownloadHelper.forProgressive
,DownloadHelper.forHls
,DownloadHelper.forDash
iDownloadHelper.forSmoothStreaming
, a zamiast nich użyj zasadyDownloadHelper.forMediaItem
. - Usuń przestarzały konstruktor
DownloadService
i użyj konstruktora, który nie został wycofany i zawiera opcję podania parametruchannelDescriptionResourceId
. - Usuń wycofane stałe ciągu znaków dla kodowania (
ASCII_NAME
,UTF8_NAME
,ISO88591_NAME
,UTF16_NAME
iUTF16LE_NAME
). Zamiast tego użyj kodowania Kotlin z pakietukotlin.text
,java.nio.charset.StandardCharsets
lubcom.google.common.base.Charsets
. - Usuń wycofany konstruktor
WorkManagerScheduler
i zamiast niego użyj konstruktora, który nie został wycofany i zawiera opcję przekazywania parametruContext
. - Usuń wycofane metody
createVideoSampleFormat
,createAudioSampleFormat
,createContainerFormat
icreateSampleFormat
, które były używane do tworzenia instancji klasyFormat
. Zamiast tego użyj funkcjiFormat.Builder
do tworzenia instancjiFormat
. - Usuń przestarzałe metody
copyWithMaxInputSize
,copyWithSubsampleOffsetUs
,copyWithLabel
,copyWithManifestFormatInfo
,copyWithGaplessInfo
,copyWithFrameRate
,copyWithDrmInitData
,copyWithMetadata
,copyWithBitrate
icopyWithVideoSize
. Zamiast nich użyj metodyFormat.buildUpon()
i setter. - Usuń wycofany tag
ExoPlayer.retry()
i użyj zamiast niego taguprepare()
. - Usuń wycofany konstruktor
DefaultTrackSelector
z argumentem o wartości zerowej. Zamiast niego użyj konstruktoraDefaultTrackSelector(Context)
. - Usuń wycofany konstruktor
OfflineLicenseHelper
i zamiast niego użyj konstruktoraOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
. - Usuń wycofany konstruktor
DownloadManager
i zamiast niego użyj konstruktora, który przyjmuje parametrExecutor
. - Usuń wycofane konstruktory
Cue
i użyj zamiast nich konstruktoraCue.Builder
. - Usuń wycofany konstruktor
OfflineLicenseHelper
i zamiast niego użyj konstruktoraOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
. - Usuń 4 wycofane metody
AnalyticsListener
:onDecoderEnabled
, użyj zamiast niej zasadonAudioEnabled
lubonVideoEnabled
.onDecoderInitialized
, użyj zamiast niej zasadonAudioDecoderInitialized
lubonVideoDecoderInitialized
.onDecoderInputFormatChanged
, użyj zamiast niej zasadonAudioInputFormatChanged
lubonVideoInputFormatChanged
.onDecoderDisabled
, użyj zamiast niej zasadonAudioDisabled
lubonVideoDisabled
.
- Usuń wycofane tagi
Player.Listener.onSeekProcessed
iAnalyticsListener.onSeekProcessed
. Zamiast nich użyj tagówonPositionDiscontinuity
iDISCONTINUITY_REASON_SEEK
. - Usuń polecenie
ExoPlayer.setHandleWakeLock(boolean)
i użyj zamiast niego poleceniasetWakeMode(int)
. - Usuń wycofany tag
DefaultLoadControl.Builder.createDefaultLoadControl()
i użyj zamiast niego tagubuild()
. - Usuń wycofany tag
MediaItem.PlaybackProperties
i użyj zamiast niego taguMediaItem.LocalConfiguration
. Wycofane poleMediaItem.playbackProperties
ma teraz typMediaItem.LocalConfiguration
.
- Usuń konstruktory
Wersja 1.1.0-rc01
21 czerwca 2023 r.
Użyj wersji stabilnej 1.1.0.
Wersja 1.1.0-beta01
7 czerwca 2023 r.
Użyj wersji stabilnej 1.1.0.
Wersja 1.1.0-alpha01
10 maja 2023 r.
Użyj wersji stabilnej 1.1.0.
Wersja 1.0.0
Wersja 1.0.2
18 maja 2023 r.
androidx.media3:media3-*:1.0.2
został zwolniony.
Wersja 1.0.2 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayer 2.18.7.
W tej wersji wprowadziliśmy następujące zmiany w porównaniu z wersją 1.0.1:
- Biblioteka podstawowa:
- Dodaj
Buffer.isLastSample()
, który oznacza, czyBuffer
zawiera flagęC.BUFFER_FLAG_LAST_SAMPLE
. - Rozwiązanie problemu polegający na tym, że ostatnia klatka może nie zostać wyrenderowana, jeśli ostatnia próbka z ramkami zostanie zdjęta z kolejki bez odczytania próbki „Koniec strumienia”. (#11079).
- Dodaj
- Wyodrębnianie:
- Naprawianie analizowania SPS H.265 w plikach MPEG-TS przez ponowne użycie logiki analizowania używanej już przez wyodrębniarki RTSP i MP4 (#303).
- Tekst:
- SSA: dodano obsługę plików UTF-16, jeśli zaczynają się od oznaczenia kolejności bajtów (#319).
- Sesja:
- Rozwiązanie problemu polegającego na tym, że
MediaController
nie aktualizuje dostępnych poleceń po połączeniu ze starszą wersjąMediaSessionCompat
, która aktualizuje swoje działania. - Naprawiono błąd, który uniemożliwiał wywołaniu
MediaLibraryService
zwracanie wartości null w przypadku wywołaniaCallback.onGetLibraryRoot
z interfejsu System UI z parametremparams.isRecent == true
w interfejsie API 30 (#355). - Naprawiono wyciek pamięci w funkcjach
MediaSessionService
iMediaLibraryService
(#346). - Naprawiono błąd, w którym połączona aktualizacja
Timeline
i pozycji w funkcjiMediaSession
mogła spowodować wygenerowanie przez funkcjęMediaController
błęduIllegalStateException
.
- Rozwiązanie problemu polegającego na tym, że
Wersja 1.0.1
18 kwietnia 2023 r.
androidx.media3:media3-*:1.0.1
został zwolniony.
Wersja 1.0.1 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayer 2.18.6.
- Biblioteka podstawowa:
- Resetowanie zastąpienia docelowej transmisji na żywo podczas przewijania do pozycji domyślnej (#11051).
- Naprawiono błąd, który powodował, że puste strumienie próbek w mediach mogły powodować zablokowanie odtwarzania.
- Sesja:
- Naprawiliśmy błąd polegający na tym, że wiele identycznych elementów kolejki opublikowanych przez starszy
MediaSessionCompat
powodowało wyjątek wMediaController
(#290). - Dodanie brakującego przekierowania
MediaSession.broadcastCustomCommand
do starszegoMediaControllerCompat.Callback.onSessionEvent
(#293). - Naprawiono błąd polegający na tym, że wywołanie
MediaSession.setPlayer
nie aktualizowało dostępnych poleceń. - Rozwiązanie problemu polegającego na tym, że instancje
TrackSelectionOverride
wysyłane zMediaController
są ignorowane, jeśli odwołują się do grupy zFormat.metadata
(#296). - Rozwiązanie problemu, w którym
Player.COMMAND_GET_CURRENT_MEDIA_ITEM
musi być dostępna, aby uzyskać dostęp do metadanych za pomocą starszej wersjiMediaSessionCompat
. - Rozwiązanie problemu, w którym wystąpienia elementu
MediaSession
w wątku tle wywoływały awarie podczas używania w elementachMediaSessionService
(#318). - Rozwiązanie problemu polegającego na tym, że biblioteka zadeklarowała odbiornik przycisku multimediów bez zamiaru aplikacji (#314).
- Naprawiliśmy błąd polegający na tym, że wiele identycznych elementów kolejki opublikowanych przez starszy
- DASH:
- Poprawiono obsługę pustych linii czasu segmentów (#11014).
- RTSP:
- Jeśli konfiguracja RTSP z UDP zakończy się niepowodzeniem z błędem RTSP 461 UnsupportedTransport (#11069), spróbuj ponownie użyć protokołu TCP.
Wersja 1.0.0
22 marca 2023 r.
androidx.media3:media3-*:1.0.0
został zwolniony.
Wersja 1.0.0 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayer 2.18.5.
Brak zmian od wersji 1.0.0-rc02.
Wersja 1.0.0-rc02
2 marca 2023 r.
androidx.media3:media3-*:1.0.0-rc02
został zwolniony.
Wersja 1.0.0-rc02 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayer 2.18.4.
- Biblioteka podstawowa:
- Pobrane:
- Umożliw konfigurowanie maksymalnej różnicy w czasie rozpoczęcia 2 segmentów, które mają zostać scalone, w klasie
SegmentDownloader
i jej podklasach (#248).
- Umożliw konfigurowanie maksymalnej różnicy w czasie rozpoczęcia 2 segmentów, które mają zostać scalone, w klasie
- Dźwięk:
- Film:
- Zamiast
HEVCProfileMain10
mapuj format HEVC HDR10 naHEVCProfileMain10HDR10
. - Dodaj obejście problemu z urządzeniem Chromecast z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie AVC z częstotliwością 60 FPS są oznaczane jako niedostępne (#10898).
- Rozwiązanie problemów z wydajnością podczas uwalniania klatek podczas odtwarzania multimediów z częstotliwością klatek znacznie wyższą niż częstotliwość odświeżania ekranu.
- Zamiast
- Przesyłanie:
- Naprawiono przejście
STATE_IDLE
podczas przełączania się między elementami multimediów (#245).
- Naprawiono przejście
- RTSP:
- Przechwyć IllegalArgumentException wyrzucone podczas analizowania nieprawidłowego RTSP. Opisz komunikaty odpowiedzi (#10971).
- Sesja:
- Usunęliśmy błąd, który powodował, że przycisk odtwarzania/pauzowania w powiadomieniu nie aktualizował się zgodnie ze stanem odtwarzacza (#192).
- Rozszerzenie IMA:
- Naprawiono błąd, który uniemożliwiał uruchamianie strumieni DAI bez reklam, ponieważ nie był odbierany pierwszy (a w przypadku braku reklam jedyny)
LOADED
.
- Naprawiono błąd, który uniemożliwiał uruchamianie strumieni DAI bez reklam, ponieważ nie był odbierany pierwszy (a w przypadku braku reklam jedyny)
Wersja 1.0.0-rc01
16 lutego 2023 r.
androidx.media3:media3-*:1.0.0-rc01
został zwolniony.
Wersja 1.0.0-rc01 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayer 2.18.3.
- Biblioteka podstawowa:
- Dostosuj logikę kolejkowania dekodera w rendererze, aby zachować ustawienia
MediaCodecSelector
, nawet jeśli dekoder może nie być w stanie odtworzyć multimediów z odpowiednią wydajnością. Na przykład w przypadku domyślnego selektora dekoder sprzętowy z ograniczonym wsparciem będzie preferowany od dekodera oprogramowania, który w pełni obsługuje format (#10604). - Dodaj
ExoPlayer.Builder.setPlaybackLooper
, który ustawia istniejący wątek odtwarzania dla nowej instancji ExoPlayera. - Zezwalaj na usuwanie pomocników menedżera pobierania (#10776).
- Dodaj parametr do
BasePlayer.seekTo
, aby wskazać polecenie używane do przewijania. - Używanie motywu podczas wczytywania plików drawable w wersji interfejsu API 21 lub nowszej (#220).
- Dodaj
ConcatenatingMediaSource2
, który umożliwia łączenie wielu elementów multimedialnych w jednym oknie (#247).
- Dostosuj logikę kolejkowania dekodera w rendererze, aby zachować ustawienia
- Wyodrębnianie:
- Wyrzuć
ParserException
zamiastNullPointerException
, jeśli w tabeli próbek (stbl) brakuje wymaganego opisu próbki (stsd) podczas analizowania atomów trak. - Prawidłowo pomijać próbki podczas przechodzenia bezpośrednio do synchronizowanej klatki w pliku fMP4 (#10941).
- Wyrzuć
- Dźwięk:
- Użyj bitrate’u skompresowanego formatu audio, aby obliczyć minimalny rozmiar bufora dla
AudioTrack
w przypadku bezpośredniego odtwarzania (przepuszczania).
- Użyj bitrate’u skompresowanego formatu audio, aby obliczyć minimalny rozmiar bufora dla
- Tekst:
- Naprawiono błąd polegający na przekazywaniu przez
TextRenderer
nieprawidłowego (ujemnego) indeksu do funkcjiSubtitle.getEventTime
, jeśli plik z napisami nie zawiera żadnych cue. - SubRip: dodano obsługę plików UTF-16, jeśli zaczynają się od znacznika kolejności bajtów.
- Naprawiono błąd polegający na przekazywaniu przez
- Metadane:
- Parsowanie wielu wartości rozdzielonych znakiem null z ramek ID3 zgodnie z zaleceniami ID3 w wersji 2.4.
- Dodaj
MediaMetadata.mediaType
, aby oznaczyć typ treści lub typ folderu opisanego przez metadane. - Dodaj
MediaMetadata.isBrowsable
jako zamiennikMediaMetadata.folderType
. W następnej wersji wycofamy ten typ folderu.
- DASH:
- Dodano pełne parsowanie zestawów dostosowań obrazu, w tym liczby kafelków (#3752).
- UI:
- Napraw przestarzały kod
PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener)
aby upewnić się, że zmiany widoczności są przekazywane do zarejestrowanego słuchacza (#229). - Poprawić kolejność elementów sterujących odtwarzaczem w
PlayerView
w przypadku układu od prawej do lewej (#227).
- Napraw przestarzały kod
- Sesja:
- Dodaj abstrakcyjny
SimpleBasePlayer
, aby ułatwić implementację interfejsuPlayer
dla niestandardowych graczy. - Dodaj metodę pomocniczą do konwertowania tokenu sesji platformy na Media3
SessionToken
(#171). - Użyj
onMediaMetadataChanged
, aby wywołać aktualizacje sesji multimediów platformy (#219). - Dodaj sesję multimediów jako argument funkcji
getMediaButtons()
w funkcjiDefaultMediaNotificationProvider
i użyj niezmiennych list, aby zwiększyć przejrzystość kodu (#216). - Dodaj odbiorczy interfejs wywołania
onSetMediaItems
, aby umożliwić modyfikowanie/ustawianie listyMediaItem
, indeksu początkowego i pozycji w ramach sesji przed ustawieniem ich w odtwarzaczu (#156). - Unikaj wykrywania dwukrotnego dotknięcia w przypadku zdarzeń przycisku multimediów innych niż Bluetooth (#233).
- Spraw, aby
QueueTimeline
był bardziej niezawodny w przypadku niejasnego stanu sesji w starszej wersji (#241).
- Dodaj abstrakcyjny
- Metadane:
- Parsowanie wielu wartości rozdzielonych znakiem null z ramek ID3 zgodnie z zaleceniami ID3 w wersji 2.4.
- Dodaj
MediaMetadata.mediaType
, aby oznaczyć typ treści lub typ folderu opisanego przez metadane. - Dodaj
MediaMetadata.isBrowsable
jako zamiennikMediaMetadata.folderType
. W następnej wersji wycofamy ten typ folderu.
- Rozszerzenie przesyłania:
- Zaktualizuj wersję pakietu SDK Cast do 21.2.0.
- Rozszerzenie IMA:
- Usuń listenera odtwarzacza
ImaServerSideAdInsertionMediaSource
na wątku aplikacji, aby uniknąć problemów z wątkami. - Dodaj właściwość
focusSkipButtonWhenAvailable
do elementuImaServerSideAdInsertionMediaSource.AdsLoader.Builder
, aby poprosić o skupienie na przycisku pominięcia na urządzeniach TV i ustawić domyślnie wartość „Prawda”. - Dodaj metodę
focusSkipButton()
do klasyImaServerSideAdInsertionMediaSource.AdsLoader
, aby programowo poprosić o skupienie się na przycisku pominięcia. - Zaktualizuj pakiet IMA SDK do wersji 3.29.0.
- Usuń listenera odtwarzacza
- Aplikacja demonstracyjna:
- Proś o pozwolenie na powiadomienia o pobieraniu w czasie działania aplikacji (#10884).
Wersja 1.0.0-beta03
22 listopada 2022 r.
androidx.media3:media3-*:1.0.0-beta03
został zwolniony.
Wersja 1.0.0-beta03 zawiera te komitowane zmiany.
Ta wersja odpowiada wersji ExoPlayer 2.18.2.
- Biblioteka podstawowa:
- Dodaj
ExoPlayer.isTunnelingEnabled
, aby sprawdzić, czy tunelowanie jest włączone dla wybranych ścieżek (#2518). - Dodaj
WrappingMediaSource
, aby uprościć owinięcie pojedynczego elementuMediaSource
(#7279). - odrzucenie bufora z danymi z bufora odtwarzania, zanim odtwarzanie się zatrzyma z powodu niewystarczającej ilości dostępnej pamięci;
- Zamknij blok kodu śledzenia „doSomeWork” po włączeniu funkcji przenoszenia.
- Rozwiązano problem ze śledzeniem sesji w przypadku szybkiego przewijania w
PlaybackStatsListener
(#180). - Wysyłanie brakującego wywołania zwrotnego
onMediaItemTransition
podczas wywoływania funkcjiseekToNext
lubseekToPrevious
na playliście z 1 elementem (#10667). - Dodaj funkcję
Player.getSurfaceSize
, która zwraca rozmiar powierzchni, na której renderowany jest film. - Naprawiono błąd, który powodował, że usuwanie słuchaczy podczas publikacji odtwarzacza mogło spowodować błąd
IllegalStateException
(#10758).
- Dodaj
- Kompilacja:
- Wymuś minimalną wartość
compileSdkVersion
, aby uniknąć błędów kompilacji (#10684). - Unikaj publikowania bloku, gdy jest on uwzględniony w innej kompilacji Gradle.
- Wymuś minimalną wartość
- Wybór ścieżki:
- preferuj inne ścieżki niż Dolby Vision, jeśli wyświetlacz go nie obsługuje; (#8944).
- Pobrane:
- Naprawiono potencjalną nieskończoną pętlę w
ProgressiveDownloader
spowodowaną jednoczesnym pobieraniem i odtwarzaniem tego samegoPriorityTaskManager
(#10570). - Aby powiadomienie o pobieraniu wyświetlało się natychmiast (#183).
- Ogranicz liczbę równoczesnych usuwania plików do 1, aby uniknąć nadmiernego tworzenia wątków (#10458).
- Naprawiono potencjalną nieskończoną pętlę w
- Film:
- Jeśli wyświetlacz nie obsługuje Dolby Vision, spróbuj użyć alternatywnego dekodera. (#9794).
- Dźwięk:
- Aby uniknąć błędów OutOfMemory podczas uwalniania wielu odtwarzaczy w tym samym czasie (#10057), używaj funkcji
SingleThreadExecutor
do uwalniania instancjiAudioTrack
. - Dodaje
AudioOffloadListener.onExperimentalOffloadedPlayback
do stanu przenoszenia ścieżki audio. (#134). - Ustaw
AudioTrackBufferSizeProvider
jako interfejs publiczny. - Dodaj
ExoPlayer.setPreferredAudioDevice
, aby ustawić preferowane urządzenie wyjściowe audio (#135). - Zmień nazwę
androidx.media3.exoplayer.audio.AudioProcessor
naandroidx.media3.common.audio.AudioProcessor
. - Mapowanie 8-kanałowego i 12-kanałowego dźwięku na maski kanałów 7.1 i 7.1.4 odpowiednio we wszystkich wersjach Androida (#10701).
- Aby uniknąć błędów OutOfMemory podczas uwalniania wielu odtwarzaczy w tym samym czasie (#10057), używaj funkcji
- Metadane:
MetadataRenderer
można teraz skonfigurować tak, aby renderować metadane, gdy tylko staną się dostępne. Utwórz instancję za pomocą parametruMetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean)
, aby określić, czy renderer ma wyprowadzać metadane wcześniej, czy zsynchronizowanie z pozycją odtwarzacza.
- DRM:
- obejście błędu w implementacji ClearKey w Androidzie 13, który zwraca nieprawidłowy adres URL licencji, ale nie pusty;
- Naprawiono błąd
setMediaDrmSession failed: session not opened
podczas przełączania się między schematami DRM w liście odtwarzania (np. z Widevine na ClearKey).
- Tekst:
- CEA-608: upewnij się, że polecenie przełączenia usługi w polu 2 jest obsługiwane prawidłowo (#10666).
- DASH:
- Analizowanie wartości
EventStream.presentationTimeOffset
z plików manifestu (#10460).
- Analizowanie wartości
- UI:
- Używanie bieżących zastąpień odtwarzacza jako wstępnie ustawionych w
TrackSelectionDialogBuilder
(#10429).
- Używanie bieżących zastąpień odtwarzacza jako wstępnie ustawionych w
- Sesja:
- Zadbaj o to, aby polecenia były zawsze wykonywane we właściwej kolejności, nawet jeśli niektóre z nich wymagają asynchronicznego rozwiązania (#85).
- Dodaj
DefaultMediaNotificationProvider.Builder
, aby tworzyć instancjeDefaultMediaNotificationProvider
. Kreator może skonfigurować identyfikator powiadomienia, identyfikator kanału powiadomienia i nazwę kanału powiadomienia używane przez dostawcę. Dodaj też metodęDefaultMediaNotificationProvider.setSmallIcon(int)
, aby ustawić małą ikonę powiadomień. (#104). - Upewnij się, że polecenia wysłane przed
MediaController.release()
nie są pomijane (#99). SimpleBitmapLoader
może wczytywać bitmapy z identyfikatorów URIfile://
(#108).- Poprawić twierdzenie, które uniemożliwia
MediaController
przeskakiwanie przez reklamę w okresie (#122). - Po zakończeniu odtwarzania
MediaSessionService
przestaje być wyświetlany na pierwszym planie i wyświetla się powiadomienie z prośbą o ponowne uruchomienie ostatnio odtwarzanego elementu multimedialnego (#112). - Nie uruchamiaj usługi na pierwszym planie z oczekującym zamiarem wstrzymania (#167).
- Ręczne ukrywanie „plakietki” powiązanej z powiadomieniem utworzonym przez
DefaultNotificationProvider
w interfejsach API 26 i 27 (w interfejsach API 28 i nowszych plakietka jest ukryta automatycznie) (#131). - Naprawiono błąd, który powodował, że drugie połączenie bindera z starszego obiektu MediaSession z obiektem Media3 MediaController powodowało wyjątek IllegalStateException (#49).
- RTSP:
- IMA:
- Dodaj limit czasu na wczytywanie informacji o reklamach, aby rozwiązać problemy, w których pakiet IMA SDK zawiesza się podczas wczytywania reklamy (#10510).
- Zapobieganie pomijaniu reklam w trakcie filmu podczas przewijania do końca treści (#10685).
- Prawidłowo obliczać czas trwania okna w przypadku transmisji na żywo z reklamami wstawianymi po stronie serwera, na przykład IMA DAI (#10764).
- Rozszerzenie FFmpeg:
- Dodaj nowe wymagane flagi, aby połączyć biblioteki FFmpeg z NDK 23.1.7779620 i nowszymi (#9933).
- Rozszerzenie AV1:
- Zaktualizuj wersję CMake, aby uniknąć niezgodności z najnowszymi wersjami Android Studio (#9933).
- Rozszerzenie przesyłania:
- Wdrożyć
getDeviceInfo()
, aby można było zidentyfikowaćCastPlayer
podczas sterowania odtwarzaniem za pomocąMediaController
(#142).
- Wdrożyć
- Transformator:
- Dodaj licznik czasu muxera, aby wykrywać zbyt wolne generowanie próbki wyjściowej.
- Usuń symbole wycofane:
- Usuń
Transformer.Builder.setOutputMimeType(String)
. Ta funkcja została usunięta. Gdy używany jest domyślny muxer, typ MIME będzie zawsze MP4.
- Usuń
Wersja 1.0.0-beta02
21 lipca 2022 r.
androidx.media3:media3-*:1.0.0-beta02
został zwolniony.
Wersja 1.0.0-beta02 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayer 2.18.1.
- Biblioteka podstawowa:
- Upewnij się, że zastąpienie
ShuffleOrder
wartościąExoPlayer.setShuffleOrder
powoduje wywołanie funkcjiPlayer.Listener#onTimelineChanged
z wartościąreason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED
(#9889). - W przypadku mediów progresywnych uwzględniaj tylko wybrane ścieżki w pozycji buforowanej (#10361).
- Zezwalaj na niestandardowy rejestrator dla wszystkich danych wyjściowych dziennika ExoPlayer (#9752).
- Naprawiono implementację funkcji
setDataSourceFactory
wDefaultMediaSourceFactory
, która w niektórych przypadkach nie działała (#116).
- Upewnij się, że zastąpienie
- Wyodrębnianie:
- DASH:
- Parsowanie adresu URL licencji ClearKey z plików manifestu (#10246).
- UI:
- Sprawdzanie, czy TalkBack ogłasza aktualnie aktywną opcję szybkości w menu elementów sterujących odtwarzaniem (#10298).
- RTSP:
- Dodaj obsługę fragmentowanych pakietów VP8 (#110).
- Rozszerzenie leanback:
- Posłuchaj zmian w
playWhenReady
wLeanbackAdapter
(10420).
- Posłuchaj zmian w
- Przesyłanie:
Wersja 1.0.0-beta01
16 czerwca 2022 r.
androidx.media3:media3-*:1.0.0-beta01
został zwolniony.
Wersja 1.0.0-beta01 zawiera te commity.
Odpowiada to wersji ExoPlayer 2.18.0.
- Biblioteka podstawowa:
- Włącz obsługę diagnostyki platformy Android za pomocą
MediaMetricsManager
. ExoPlayer przekaże na platformę zdarzenia odtwarzania i dane dotyczące wydajności, co pomoże w dostarczaniu informacji o wydajności systemu i debugowaniu na urządzeniu. Te dane mogą być też gromadzone przez Google, jeśli użytkownik urządzenia włączył udostępnianie danych o użyciu i diagnostyce. Aplikacje mogą zrezygnować z udzielania danych do diagnostyki platformy ExoPlayer za pomocą funkcjiExoPlayer.Builder.setUsePlatformDiagnostics(false)
. - Rozwiązanie problemu polegającego na zbyt częstym resetowaniu ścieżek podczas korzystania z funkcji
MergingMediaSource
, na przykład podczas wczytywania napisów i zmiany wybranych napisów w trakcie odtwarzania (#10248). - Zatrzymanie wykrywania typu sieci 5G-NSA w interfejsach API 29 i 30. Odtwarzanie będzie odbywać się w sieci 4G.
- Nie zezwalaj na przekazywanie
null
doMediaSource.Factory.setDrmSessionManagerProvider
iMediaSource.Factory.setLoadErrorHandlingPolicy
. W razie potrzeby można jawnie przekazywać instancje funkcjiDefaultDrmSessionManagerProvider
iDefaultLoadErrorHandlingPolicy
. - Dodaj
MediaItem.RequestMetadata
, aby reprezentować metadane potrzebne do odtworzenia multimediów, gdy dokładna wartośćLocalConfiguration
jest nieznana. Usuń teżMediaMetadata.mediaUrl
, ponieważ jest ono teraz uwzględnione wRequestMetadata
. - Dodaj
Player.Command.COMMAND_SET_MEDIA_ITEM
, aby umożliwić graczom ustawianie pojedynczego elementu.
- Włącz obsługę diagnostyki platformy Android za pomocą
- Wybór ścieżki:
- Spłaszcz zajęcia
TrackSelectionOverrides
do poziomu zajęćTrackSelectionParameters
i przenieś zajęciaTrackSelectionOverride
na najwyższy poziom. - Zmień nazwę
TracksInfo
naTracks
, aTracksInfo.TrackGroupInfo
naTracks.Group
. NazwaPlayer.getCurrentTracksInfo
iPlayer.Listener.onTracksInfoChanged
została zmieniona naPlayer.getCurrentTracks
iPlayer.Listener.onTracksChanged
. Obejmuje to „odwrócenie” wycofania metodyPlayer.Listener.onTracksChanged
, ale z różnymi typami parametrów. - Zmień operatory
DefaultTrackSelector.buildUponParameters
iDefaultTrackSelector.Parameters.buildUpon
, aby zwracały wartośćDefaultTrackSelector.Parameters.Builder
zamiast przestarzałego operatoraDefaultTrackSelector.ParametersBuilder
. - Dodaj
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities
, które jest domyślnie włączone. Po włączeniuDefaultTrackSelector
będzie preferować ścieżki audio, których liczba kanałów nie przekracza możliwości wyjściowych urządzenia. Na urządzeniach przenośnychDefaultTrackSelector
preferuje format stereo/mono zamiast formatów audio wielokanałowych, chyba że format wielokanałowy może być przestrzenny (Android 12L+) lub jest formatem dźwięku przestrzennego Dolby. Dodatkowo na urządzeniach obsługujących przestrzenny dźwiękDefaultTrackSelector
będzie sprawdzać zmiany w właściwościach Spatializer i uruchamiać wybór nowej ścieżki. Urządzenia ztelevision
trybem interfejsu użytkownika są wyłączone z tych ograniczeń, a preferowany będzie format z największą liczbą kanałów. Aby włączyć tę funkcję, instancjaDefaultTrackSelector
musi być utworzona za pomocąContext
.
- Spłaszcz zajęcia
- Film:
- Zmień nazwę
DummySurface
naPlaceholderSurface
. - Dodaj obsługę AV1 do
MediaCodecVideoRenderer.getCodecMaxInputSize
.
- Zmień nazwę
- Dźwięk:
- Użyj niestandardowego typu MIME reklamy dekodera audio LG AC3.
- Zmień typ zwracanej wartości funkcji
AudioAttributes.getAudioAttributesV21()
zandroid.media.AudioAttributes
na nową klasę owijającąAudioAttributesV21
, aby zapobiec powolnej weryfikacji ART w interfejsie API <21. - Wysłać zapytanie do platformy (API 29+), aby uzyskać liczbę kanałów kodowania dźwięku, lub przyjąć liczbę kanałów kodowania dźwięku w przypadku przesyłania dźwięku, gdy liczba kanałów formatu dźwięku nie jest ustawiona (co występuje w przypadku przygotowania bez fragmentów HLS (10204).
- Skonfiguruj
AudioTrack
z maską kanałuAudioFormat.CHANNEL_OUT_7POINT1POINT4
, jeśli dekoder wyprowadza 12-kanałowe audio PCM (#10322).
- DRM
- Upewnij się, że sesja DRM jest zawsze prawidłowo aktualizowana podczas przewijania bezpośrednio po zmianie formatu (10274).
- Tekst:
- Zmień
Player.getCurrentCues()
, aby zwracał wartośćCueGroup
zamiastList<Cue>
. - SSA: obsługa ustawienia stylu
OutlineColour
, gdyBorderStyle == 3
(tzn.OutlineColour
ustawia tło cue) (#8435). - CEA-708: Przeanalizuj dane w wiele bloki usług i ignoruj bloki niezwiązane z obecnie wybranym numerem usługi.
- Usuń
RawCcExtractor
, który był używany tylko do obsługi formatu napisów wewnętrznych Google.
- Zmień
- Wyodrębnianie:
- UI:
- Naprawić przesyłanie zdarzeń do
OnClickListener
s ustawionych wPlayerView
w przypadku, gdyuseController=false
(#9605). Naprawiono też przesyłanie zdarzeń doOnLongClickListener
we wszystkich konfiguracjach widoku. - Rozwiązanie problemu polegającego na nieprawidłowym traktowaniu sekwencji zdarzeń dotyku, które wychodzą poza granice
PlayerView
przedACTION_UP
, jako kliknięcia (#9861). - Rozwiązanie problemu
PlayerView
z ułatwieniami dostępu, w którym dotknięcie mogło włączyć odtwarzanie zamiast ukryć elementy sterujące (#8627). - Zmień polecenia
TrackSelectionView
iTrackSelectionDialogBuilder
, aby działały z interfejsemPlayer
, a nieExoPlayer
. Dzięki temu widoki można używać z innymi implementacjamiPlayer
, a także usunąć zależność modułu interfejsu od modułu ExoPlayer. To jest zmiana zasadnicza. - Nie wyświetlaj ścieżek z wymuszonym tekstem w selektorze ścieżek
PlayerView
i zachowaj odpowiednią ścieżkę z wymuszonym tekstem, jeśli wybrana jest opcja „Brak” (#9432).
- Naprawić przesyłanie zdarzeń do
- DASH:
- Przeanalizuj liczbę kanałów z elementów DTS
AudioChannelConfiguration
. Ta zmiana ponownie włącza przepuszczanie dźwięku w przypadku strumieni DTS (#10159). - Nie zezwalaj na przekazywanie wartości
null
doDashMediaSource.Factory.setCompositeSequenceableLoaderFactory
. W razie potrzeby instancjeDefaultCompositeSequenceableLoaderFactory
można przekazywać wprost.
- Przeanalizuj liczbę kanałów z elementów DTS
- HLS:
- W przypadku, gdy atrybut CODECS playlisty nie zawiera kodu audio, należy użyć przygotowania w kawałkach (#10065).
- Nie zezwalaj na przekazywanie wartości
null
do usługHlsMediaSource.Factory.setCompositeSequenceableLoaderFactory
,HlsMediaSource.Factory.setPlaylistParserFactory
iHlsMediaSource.Factory.setPlaylistTrackerFactory
. W razie potrzeby można jawnie przekazywać instancje funkcjiDefaultCompositeSequenceableLoaderFactory
,DefaultHlsPlaylistParserFactory
lub odwołania do funkcjiDefaultHlsPlaylistTracker.FACTORY
.
- Wygładzanie strumieniowego przesyłania danych:
- Nie zezwalaj na przekazywanie wartości
null
doSsMediaSource.Factory.setCompositeSequenceableLoaderFactory
. W razie potrzeby instancjeDefaultCompositeSequenceableLoaderFactory
można przekazać wprost.
- Nie zezwalaj na przekazywanie wartości
- RTSP:
- Dodaj czytnik RTP dla H263 (#63).
- Dodaj czytnik RTP dla MPEG4 (#35).
- Dodaj czytnik RTP dla HEVC (#36).
- Dodaj czytnik RTP dla AMR. Obecnie obsługiwane są tylko monokanałowe strumienie AMR bez przeplotu. Złożony strumień AMR RTP nie jest obsługiwany. (#46)
- Dodaj czytnik RTP dla VP8 (#47).
- Dodaj czytnik RTP dla WAV (#56).
- Popraw nagłówek autoryzacji podstawowej RTSP. (#9544).
- Zatrzymaj sprawdzanie pól SDP, ponieważ ExoPlayer ich nie potrzebuje (#10049).
- Wyjątek kontrolowany podczas analizowania czasu RTSP (#10165).
- Dodaj czytnik RTP dla VP9 (#47).
- Dodaj czytnik RTP dla OPUS (#53).
- Źródła danych:
- Zmień nazwę
DummyDataSource
naPlaceholderDataSource
. - Sposób obejścia problemu z przerwaniem wywołania OkHttp.
- Zmień nazwę
- Sesja:
- Zastąp
MediaSession.MediaItemFiller
wartościąMediaSession.Callback.onAddMediaItems
, aby umożliwić asynchroniczne przetwarzanie żądań. - Obsługuje metody
setMediaItems(s)
, gdyMediaController
łączy się z sesją multimediów starszej wersji. - Usuń
MediaController.setMediaUri
iMediaSession.Callback.onSetMediaUri
. Tę samą funkcję można uzyskać, używając pólMediaController.setMediaItem
iMediaSession.Callback.onAddMediaItems
. - Przekierowuj połączenia z usług
MediaController
, które odtwarzają treści multimedialne, doMediaSession.Callback.onAddMediaItems
zamiast doonSetMediaUri
. - Dodaj atrybuty
MediaNotification.Provider
iDefaultMediaNotificationProvider
, aby dostosować powiadomienie. - Dodaj
BitmapLoader
iSimpleBitmapLoader
do pobierania obrazów z elementami graficznymi. - Dodaj
MediaSession.setCustomLayout()
, aby zapewnić zgodność wsteczną ze starszą sesją. - Dodaj
MediaSession.setSessionExtras()
, aby zapewnić zgodność funkcji z sesją w wersji starszej. - Zmień nazwę
MediaSession.MediaSessionCallback
naMediaSession.Callback
,MediaLibrarySession.MediaLibrarySessionCallback
naMediaLibrarySession.Callback
, aMediaSession.Builder.setSessionCallback
nasetCallback
. - Naprawić NPE w
MediaControllerImplLegacy
(#59). - Zaktualizuj informacje o pozycji sesji na osi czasu(#51).
- Naprawiono NPE w
MediaControllerImplBase
po zwolnieniu kontrolera (#74).
- Zastąp
- Odtwarzanie reklamy / IMA:
- Zmniejsz częstotliwość sprawdzania reklam z co 100 ms na co 200 ms, aby dostosować się do zaleceń Media Rating Council (MRC).
- Rozszerzenie FFmpeg:
- Zaktualizuj wersję CMake do
3.21.0+
, aby uniknąć błędu w CMake, który powoduje niepowodzenie synchronizacji Gradle w Android Studio (#9933).
- Zaktualizuj wersję CMake do
- Usuń symbole wycofane:
- Usuń
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
. Zamiast tego użyj polaPlayer.Listener.onTracksChanged(Tracks)
. - Usuń
Player.getCurrentTrackGroups
iPlayer.getCurrentTrackSelections
. Zamiast tego użyj polaPlayer.getCurrentTracks
. Możesz też nadal używać metodExoPlayer.getCurrentTrackGroups
iExoPlayer.getCurrentTrackSelections
, chociaż są one nadal wycofywane. - Usuń stałe
DownloadHelper
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
iDEFAULT_TRACK_SELECTOR_PARAMETERS
. W miarę możliwości używaj tagugetDefaultTrackSelectorParameters(Context)
, a w przeciwnym razie taguDEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT
. - Usuń konstruktor
DefaultTrackSelector(ExoTrackSelection.Factory)
. Zamiast tego użyjDefaultTrackSelector(Context, ExoTrackSelection.Factory)
. - Usuń
Transformer.Builder.setContext
. Zamiast tego parametrContext
powinien być przekazywany do konstruktoraTransformer.Builder
.
- Usuń
Wersja 1.0.0-alpha03
14 marca 2022 r.
androidx.media3:media3-*:1.0.0-alpha03
został zwolniony.
Wersja 1.0.0-alpha03 zawiera te commity.
Odpowiada ona wersji ExoPlayer 2.17.1.
- Dźwięk:
- Naprawiono błąd sprawdzania możliwości dźwięku Dolby Atmos (E-AC3-JOC) w HLS.
- Wyodrębnianie:
- FMP4: rozwiązano problem polegający na tym, że metadane próbki emsg mogły być wyświetlane w złym kolejności w przypadku strumieni zawierających zarówno atomy emsg w wersji 0, jak i w wersji 1 (#9996).
- Tekst:
- Napraw interfejs
SingleSampleMediaSource.Factory.setTrackId
iMediaItem.SubtitleConfiguration.Builder.setId
, aby nadać priorytet poluSubtitleConfiguration
i użyć wartościFactory
, jeśli nie jest ono ustawione (#10016).
- Napraw interfejs
- Odtwarzanie reklamy:
- Naprawianie problemów z dźwiękiem w okresach reklamowych w transmisjach na żywo HLS SSAI.
Wersja 1.0.0-alpha02
2 marca 2022 r.
androidx.media3:media3-*:1.0.0-alpha02
został zwolniony.
Wersja 1.0.0-alpha02 zawiera te commity.
Odpowiada to wersji ExoPlayer 2.17.0.
- Podstawowa biblioteka:
- Dodaj metodę
DefaultRenderersFactory.getCodecAdapterFactory()
chronioną przed modyfikacją, aby podklasy klasyDefaultRenderersFactory
, które zastępują metodębuildVideoRenderers()
lubbuildAudioRenderers()
, mogły uzyskać dostęp do fabryki adaptera kodeka i przekazać ją do tworzonych przez siebie wystąpieńMediaCodecRenderer
. - Przeprowadź pola nagłówka ICY
name
igenre
odpowiednio do pólMediaMetadata.station
iMediaMetadata.genre
, aby dotarły do aplikacji przez polePlayer.Listener.onMediaMetadataChanged()
(#9677). - Usuń klucze null z elementu
DefaultHttpDataSource#getResponseHeaders
. - Przejście w stan uśpienia i ponowne próby tworzenia instancji
MediaCodec
, gdy się nie uda. Rozwiązanie to pozwala obejść problem, który występuje na niektórych urządzeniach podczas przełączania powierzchni z bezpiecznego kodeka na inny (#8696). - Dodaj
MediaCodecAdapter.getMetrics()
, aby umożliwić użytkownikom uzyskiwanie danych pomiarowych zMediaCodec
. (#9766). - Naprawiono rozwiązanie zależności Maven (#8353).
- Wyłącz automatyczne dostosowywanie szybkości w przypadku transmisji na żywo, które nie mają funkcji niskiej latencji ani nie mają ustawionej szybkości przez użytkownika (#9329).
- Zmień nazwę
DecoderCounters#inputBufferCount
naqueuedInputBufferCount
. - Ustaw
SimpleExoPlayer.renderers
jako prywatne. Do renderowania można uzyskać dostęp za pomocąExoPlayer.getRenderer
. - Zaktualizowano niektóre wartości stałych
AnalyticsListener.EventFlags
, aby pasowały do wartości w plikuPlayer.EventFlags
. - Podziel
AnalyticsCollector
na interfejs i domyślną implementację, aby umożliwić usunięcie go przez R8, jeśli aplikacja go nie potrzebuje.
- Dodaj metodę
- Wybór ścieżki:
- Obsługa flag preferowanych ról wideo w wyborze ścieżki (#9402).
- Aktualizacja logiki wyboru ścieżki wideo w celu uwzględnienia preferowanych typów MIME i flag ról podczas wybierania wielu ścieżek wideo do adaptacji (#9519).
- Zaktualizowano logikę wyboru ścieżki wideo i ścieżki audio, aby wybierać tylko formaty dla opcji dostosowanych, które mają ten sam poziom obsługi dekodera i sprzętu (#9565).
- Zaktualizuj logikę wyboru ścieżki wideo, aby preferować bardziej wydajne kodeki, jeśli wiele kodeków jest obsługiwanych przez podstawowe dekodery z akceleracją sprzętową (#4835).
- Preferuj ustawienia treści audio (np. „domyślny” ścieżka audio lub ścieżka dopasowana do języka systemu) zamiast ograniczeń technicznych dotyczących wyboru ścieżki (np. preferowany typ MIME lub maksymalna liczba kanałów).
- Rozwiązanie problemu z wybieraniem ścieżek, w którym zastąpienie jednej grupy ścieżek nie wyłączało innych grup ścieżek tego samego typu (#9675).
- Rozwiązanie problemu z wybieraniem ścieżek, w którym nieprawidłowo stosowano mieszankę niepustych i pustych zastąpień ścieżek (#9649).
- Zabrania zduplikowanych
TrackGroup
wTrackGroupArray
.TrackGroup
s może być zawsze odróżniany przez ustawienieid
w konstruktorzeTrackGroup
. Rozwiązanie problemu z zawieszaniem się aplikacji podczas wznawiania odtwarzania po przełączeniu aplikacji na tło z aktywną zamianą ścieżki (#9718). - Zmień reguły działania w
AdaptiveTrackSelection
, aby umożliwić zwiększenie jakości przy wystarczającej przepustowości sieci, nawet jeśli odtwarzanie jest bardzo bliskie do krawędzi na żywo (#9784).
- Film:
- Popraw logikę dekodera zapasowego dla Dolby Vision, aby w razie potrzeby używać zgodnego dekodera H264/H265.
- Dźwięk:
- Popraw logikę dekodera zapasowego w przypadku Dolby Atmos (E-AC3-JOC), aby w razie potrzeby użyć zgodnego dekodera E-AC3.
- Zmień interfejsy API
AudioCapabilities
, aby wymagały przekazywania wartościAudioCapabilities.DEFAULT_AUDIO_CAPABILITIES
zamiastnull
. - Umożliw dostosowanie obliczeń rozmiaru bufora
AudioTrack
przez wstrzyknięcie wartościAudioTrackBufferSizeProvider
doDefaultAudioSink
. (#8891). - Ponownie utwórz
AudioTrack
, jeśli żądany rozmiar bufora wynosił > 1 MB. (#9712).
- Wyodrębnianie:
- Tekst:
- Dodaj pole
MediaItem.SubtitleConfiguration.id
, które jest propagowane do polaFormat.id
ścieżki napisów utworzonej na podstawie konfiguracji (#9673). - Dodaj podstawową obsługę napisów WebVTT w kontenerach Matroska (#9886).
- Uniemożliwia
Cea708Decoder
odczytywanie większej ilości danych niż zadeklarowany rozmiar bloku usługi.
- Dodaj pole
- DRM:
- Usuń
playbackLooper
z kontaDrmSessionManager.(pre)acquireSession
. Gdy aplikacja używa elementuDrmSessionManager
w niestandardowym elemencieMediaSource
,playbackLooper
musi zostać przekazany do elementuDrmSessionManager.setPlayer
.
- Usuń
- Odtwarzanie reklamy / IMA:
- Dodano obsługę dynamicznego wstawiania reklam IMA (DAI) (#8213).
- Dodaj do metody
AdPlaybackState
metodę resetowania grupy reklam, aby można było ją odtworzyć ponownie (#9615). - Wymuś szybkość odtwarzania 1,0 podczas odtwarzania reklamy (#9018).
- Rozwiązanie problemu, który powodował natychmiastowe zresetowanie odtwarzania po załadowaniu grupy reklam, która nie załadowała się (#9929).
- UI:
- DASH:
- Dodaj zanalizowane właściwości podstawowe i dodatkowe do elementu
Representation
(#9579). - Obsługa roli ścieżki
forced-subtitle
(#9727). - Zatrzymaj interpretowanie roli ścieżki
main
jakoC.SELECTION_FLAG_DEFAULT
. - Poprawiono logikę wykluczania adresów URL podstawowych w przypadku manifestów, które nie deklarują przestrzeni nazw DVB (#9856).
- Obsługa względnych adresów URL
MPD.Location
(#9939).
- Dodaj zanalizowane właściwości podstawowe i dodatkowe do elementu
- HLS:
- Prawidłowo wypełnij
Format.label
w przypadku strumieni HLS zawierających tylko dźwięk (#9608). - Aby skrócić czas uruchamiania, domyślnie używaj przygotowania bez segmentów. Jeśli Twoje wersje zawierają zmiksowane napisy, które nie są określone w playliście głównej, dodaj je do tej playlisty, aby były dostępne do odtwarzania, lub wyłącz przygotowanie bez segmentów za pomocą opcji
HlsMediaSource.Factory.setAllowChunklessPreparation(false)
. - Obsługa dokładnego przewijania do kluczowych klatek w HLS (#2882).
- Prawidłowo wypełnij
- RTSP:
- Dostarczyć interfejs API klienta, aby zastąpić wartość
SocketFactory
używaną dla dowolnego połączenia z serwerem (#9606). - Jeśli dostępne są obie metody, preferuj DIGEST zamiast BASIC (#9800).
- Obsługa sytuacji, gdy czas trwania utworu RTSP jest niedostępny (#9775).
- Ignoruj nieprawidłowe wartości nagłówka RTP-Info (#9619).
- Dostarczyć interfejs API klienta, aby zastąpić wartość
- Transformator:
- Zwiększ wymaganą minimalną wersję interfejsu API do 21.
- Wartość
TransformationException
służy teraz do opisywania błędów występujących podczas przekształcenia. - Dodaj
TransformationRequest
, aby określić opcje przekształcania. - Zezwalanie na rejestrację wielu słuchaczy.
- Rozwiązanie problemu z zawieszaniem się Transformera, gdy kodek jest częściowo odczytywany.
- Napraw potencjalny NPE w
Transformer.getProgress
podczas zwalniania muxera. - Dodaj aplikację demonstracyjną, aby zastosować przekształcenia.
- Rozszerzenie MediaSession:
- Domyślnie
MediaSessionConnector
teraz czyści playlistę po zatrzymaniu. Aplikacje, które chcą zachować playlistę, mogą wywołać funkcjęsetClearMediaItemsOnStop(false)
w oprogramowaniu sprzęgającym.
- Domyślnie
- Rozszerzenie przesyłania:
- Rozszerzenie FFmpeg:
- Ustaw zależność
build_ffmpeg.sh
od bin utils LLVM zamiast GNU (#9933).
- Ustaw zależność
- Zgodność z Androidem 12:
- Zaktualizuj rozszerzenie Cast, aby zależało od
com.google.android.gms:play-services-cast-framework:20.1.0
. Wcześniejsze wersjeplay-services-cast-framework
nie są zgodne z aplikacjami kierowanymi na Androida 12 i spowodują błądIllegalArgumentException
podczas tworzeniaPendingIntent
(#9528).
- Zaktualizuj rozszerzenie Cast, aby zależało od
- Usuń symbole wycofane:
- Usuń
Player.EventListener
. Zamiast tego użyjPlayer.Listener
. - Usuń
MediaSourceFactory#setDrmSessionManager
,MediaSourceFactory#setDrmHttpDataSourceFactory
iMediaSourceFactory#setDrmUserAgent
. Zamiast tego użyj atrybutuMediaSourceFactory#setDrmSessionManagerProvider
. - Usuń
MediaSourceFactory#setStreamKeys
. Zamiast tego użyj atrybutuMediaItem.Builder#setStreamKeys
. - Usuń
MediaSourceFactory#createMediaSource(Uri)
. Zamiast tego użyj atrybutuMediaSourceFactory#createMediaSource(MediaItem)
. - Usuń
setTag
z kontDashMediaSource
,HlsMediaSource
iSsMediaSource
. Zamiast tego użyjMediaItem.Builder#setTag
. - Usuń
DashMediaSource#setLivePresentationDelayMs(long, boolean)
. Użyj wartościMediaItem.Builder#setLiveConfiguration
iMediaItem.LiveConfiguration.Builder#setTargetOffsetMs
, aby zastąpić plik manifestu, lub wartościDashMediaSource#setFallbackTargetLiveOffsetMs
, aby podać wartość zapasową. - Usuń
(Simple)ExoPlayer.setThrowsWhenUsingWrongThread
. Wycofanie się z przestrzegania zasad dotyczących wątków nie jest już możliwe. - Usuń
ActionFile
iActionFileUpgradeUtil
. Aby scalić starsze pliki akcji z plikiemActionFileUpgradeUtil
, musisz użyć ExoPlayera w wersji 2.16.1 lub nowszej.DefaultDownloadIndex
- Usuń
ProgressiveMediaSource#setExtractorsFactory
. Zamiast tego użyj konstruktoraProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)
. - Usuń
ProgressiveMediaSource.Factory#setTag
iProgressiveMediaSource.Factory#setCustomCacheKey
. Zamiast niej użyj właściwościMediaItem.Builder#setTag
iMediaItem.Builder#setCustomCacheKey
. - Usuń konstruktory
DefaultRenderersFactory(Context, @ExtensionRendererMode int)
iDefaultRenderersFactory(Context, @ExtensionRendererMode int, long)
. Zamiast tego użyj konstruktoraDefaultRenderersFactory(Context)
, funkcjiDefaultRenderersFactory#setExtensionRendererMode
i funkcjiDefaultRenderersFactory#setAllowedVideoJoiningTimeMs
. - Usuń wszystkich publicznych konstruktorów
CronetDataSource
. Zamiast tego użyj atrybutuCronetDataSource.Factory
.
- Usuń
- Zmień te
IntDefs
na@Target(TYPE_USE)
. Może to spowodować błąd kompilacji w Kotlinie, który można naprawić, przenosząc adnotację, aby oznaczyć typ (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
(w pakieciecom.google.android.exoplayer2.ext.flac
)@FlacExtractor.Flags
(w pakieciecom.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
Wersja 1.0.0-alpha01
27 października 2021 roku
androidx.media3:media3-*:1.0.0-alpha01
został zwolniony.
Wersja 1.0.0-alpha01 zawiera te commity.
Nowe funkcje
Media3 to nowe miejsce dla bibliotek obsługujących multimedia, w tym ExoPlayer. Pierwsza wersja alfa zawiera wczesne, funkcjonalne implementacje bibliotek do implementowania przypadków użycia multimediów, w tym:
- ExoPlayer – odtwarzacz multimediów na poziomie aplikacji na Androida, który jest łatwy do dostosowania i rozszerzania.
- Funkcje sesji multimediów, które umożliwiają odtwarzanie i sterowanie nim. Ten nowy moduł sesji używa tego samego interfejsu
Player
co ExoPlayer. - Komponenty UI do tworzenia interfejsów odtwarzania multimediów.
- moduły otaczające funkcje w innych bibliotekach na potrzeby ExoPlayera, na przykład wstawianie reklam za pomocą pakietu IMA SDK;
Więcej informacji znajdziesz w projekcie Media3 na GitHubie.
ExoPlayer był wcześniej hostowany w osobnym projekcie GitHub ExoPlayer. W Media3 jego nazwa to androidx.media3.exoplayer
. Planujemy jeszcze przez jakiś czas utrzymywać i publikować projekt ExoPlayer na GitHubie, aby dać aplikacjom czas na migrację do Media3. Media3 zawiera zamienniki wszystkich modułów ExoPlayera, z wyjątkiem starszych rozszerzeń media2 i mediasession, które zostały zastąpione nowym modułem media3-session
. Umożliwia to bezpośrednią integrację odtwarzaczy z sesjami multimediów bez konieczności korzystania z klasy adaptera lub złącza.