Media3
Najnowsza aktualizacja | Wersja stabilna | Wersja kandydująca do publikacji | Wersja Beta | Wersja alfa |
---|---|---|---|---|
2 lipca 2025 r. | 1.7.1 | - | 1.8.0-beta01 | 1.8.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 Google.
Dodaj zależności dotyczące potrzebnych artefaktów w pliku build.gradle
aplikacji lub modułu:
Odlotowe
dependencies { def media3_version = "1.6.1" // For media playback using ExoPlayer implementation "androidx.media3:media3-exoplayer:$media3_version" // For DASH playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-dash:$media3_version" // For HLS playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-hls:$media3_version" // For SmoothStreaming playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version" // For RTSP playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version" // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation "androidx.media3:media3-exoplayer-midi:$media3_version" // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation "androidx.media3:media3-exoplayer-ima:$media3_version" // For loading data using the Cronet network stack implementation "androidx.media3:media3-datasource-cronet:$media3_version" // For loading data using the OkHttp network stack implementation "androidx.media3:media3-datasource-okhttp:$media3_version" // For loading data using librtmp implementation "androidx.media3:media3-datasource-rtmp:$media3_version" // For building media playback UIs using Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs using Views implementation "androidx.media3:media3-ui:$media3_version" // For building media playback UIs using Jetpack Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs for Android TV using the Jetpack Leanback library implementation "androidx.media3:media3-ui-leanback:$media3_version" // For exposing and controlling media sessions implementation "androidx.media3:media3-session:$media3_version" // For extracting data from media containers implementation "androidx.media3:media3-extractor:$media3_version" // For 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.6.1" // For media playback using ExoPlayer implementation("androidx.media3:media3-exoplayer:$media3_version") // For DASH playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-dash:$media3_version") // For HLS playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-hls:$media3_version") // For SmoothStreaming playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version") // For RTSP playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version") // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation("androidx.media3:media3-exoplayer-midi:$media3_version") // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation("androidx.media3:media3-exoplayer-ima:$media3_version") // For loading data using the Cronet network stack implementation("androidx.media3:media3-datasource-cronet:$media3_version") // For loading data using the OkHttp network stack implementation("androidx.media3:media3-datasource-okhttp:$media3_version") // For loading data using librtmp implementation("androidx.media3:media3-datasource-rtmp:$media3_version") // For building media playback UIs using Compose implementation("androidx.media3:media3-ui-compose:$media3_version") // For building media playback UIs using Views implementation("androidx.media3:media3-ui:$media3_version") // For building media playback UIs using Jetpack Compose implementation("androidx.media3:media3-ui-compose:$media3_version") // For building media playback UIs for Android TV using the Jetpack Leanback library implementation("androidx.media3:media3-ui-leanback:$media3_version") // For exposing and controlling media sessions implementation("androidx.media3:media3-session:$media3_version") // For extracting data from media containers implementation("androidx.media3:media3-extractor:$media3_version") // For 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. Aby znaleźć odpowiedzi na pytania, poznać znane problemy i prośby o dodanie funkcji oraz zgłaszać nowe problemy, możesz skorzystać z narzędzia do śledzenia problemów w Media3.
Wersja 1.8.0
Wersja 1.8.0-beta01
2 lipca 2025 r.
Zostanie wycofaneandroidx.media3:media3-*:1.8.0-beta01
Wersja 1.8.0-beta01 zawiera te zmiany.
- Biblioteka wspólna:
- Dodaliśmy obsługę zastępowania odtwarzacza w elemencie
ForwardingSimpleBasePlayer
.
- Dodaliśmy obsługę zastępowania odtwarzacza w elemencie
- ExoPlayer:
- Dodano obsługę używania identyfikatora urządzenia wirtualnego z parametru
Context
przekazywanego doExoPlayer.Builder
. - Domyślnie włącz dynamiczne planowanie w trybie przewijania.
- Unikaj niepotrzebnego ponownego wczytywania źródła podczas przewijania do końca elementu.
- Domyślnie używaj
MediaCodec.BUFFER_FLAG_DECODE_ONLY
w trybie przewijania. - Wywołaj wyjątek
IllegalStateException
, gdyPreloadMediaSource
jest odtwarzany przezExoPlayer
z wątkiem odtwarzania innym niż wątek wstępnego wczytywania (#2495). - Dodaj
cloneAndMove
doShuffleMode
z domyślnym wdrożeniem (#2226). - Zmień domyślne działanie funkcji
Renderer.getMinDurationToProgressUs
, aby zwracała większą wartość, jeśli nie jest wymagane wywołanie funkcjirender
. - Usunięto błąd polegający na tym, że wewnętrzne planowanie opóźniało ostatnią klatkę podczas przewijania do końca w trybie wstrzymania. Obecnie poprawka błędu działa tylko wtedy, gdy włączona jest funkcja
ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled
.
- Dodano obsługę używania identyfikatora urządzenia wirtualnego z parametru
- Transformer:
- Dodaj
CodecDbLite
, które umożliwia optymalizację ustawień kodowania wideo pod kątem konkretnego chipsetu. - Dodaj flagę
setEnableCodecDbLite
doDefaultEncoderFactory
, aby włączyć optymalizację ustawień CodecDB Lite. Domyślnie ta flaga jest ustawiona na false.
- Dodaj
- Ekstraktory:
- Dodano obsługę przewijania w przypadku podzielonych plików MP4 z wieloma atomami
sidx
. Możesz włączyć to zachowanie za pomocą flagiFLAG_MERGE_FRAGMENTED_SIDX
wFragmentedMp4Extractor
(#9373). - Ignoruj puste tabele wyszukiwania w plikach FLAC (w tym te, które zawierają tylko zastępcze punkty wyszukiwania) i w razie potrzeby przełączaj się na wyszukiwanie binarne, jeśli znany jest czas trwania pliku (#2327).
- Poprawiono analizowanie jednostek SEI H.265, aby w pełni pomijać nierozpoznane typy SEI (#2456).
- Zaktualizuj
WavExtractor
, aby podczas analizowania pliku typuWAVE_FORMAT_EXTENSIBLE
używać danych SubFormat z rozszerzenia nagłówka w przypadku formatu audio. - MP4: dodano obsługę pól
ipcm
ifpcm
definiujących ścieżki audio PCM w formacie surowym (64-bitowy PCM zmiennoprzecinkowy nie jest obsługiwany). - MP4: obsługa części związanej z rotacją w
tkhd
macierzach przekształceń, które obracają i odbijają film. Dzięki temu odbite filmy nagrane przednim aparatem iPhone’a są wyświetlane w prawidłowej orientacji, ale nieprawidłowo odbite w osi Y (#2012).
- Dodano obsługę przewijania w przypadku podzielonych plików MP4 z wieloma atomami
- Dźwięk:
- Dodanie obsługi wszystkich formatów próbek linear PCM w
ChannelMappingAudioProcessor
iTrimmingAudioProcessor
. - Dodaliśmy obsługę przerw w dźwięku w elemencie
CompositionPlayer
. - Usuń fałszywe połączenie do:
BaseAudioProcessor#flush()
od:BaseAudioProcessor#reset()
.
- Dodanie obsługi wszystkich formatów próbek linear PCM w
- Film:
- Poprawiono płynne zwalnianie klatek wideo podczas uruchamiania, gdy próbki dźwięku nie zaczynają się dokładnie w żądanej pozycji.
- Rozszerzenie obejścia problemu z odłączoną powierzchnią na urządzenia „realme” (#2059).
- Tekst:
- Naprawiono problem z zacinaniem się odtwarzania, gdy segment napisów początkowo nie wczytuje się, a później wczytuje się prawidłowo, po czym następuje kilka pustych segmentów napisów (#2517).
- Metadane:
- Dodano obsługę pobierania czasu trwania multimediów i
Timeline
doMetadataRetriever
oraz przeniesiono ją do interfejsu API opartego na instancjachAutoCloseable
. Użyj nowego znakuBuilder
, aby utworzyć instancję dlaMediaItem
, a następnie wywołajretrieveTrackGroups()
,retrieveTimeline()
iretrieveDurationUs()
, aby uzyskaćListenableFuture
dla metadanych. Poprzednie metody statyczne zostały wycofane (#2462).
- Dodano obsługę pobierania czasu trwania multimediów i
- Obraz:
- Ogranicz dekodowane mapy bitowe do rozmiaru wyświetlacza w
BitmapFactoryImageDecoder
, aby uniknąć awarii aplikacji zCanvas: trying to draw too large bitmap.
zPlayerView
podczas próby wyświetlenia bardzo dużych obrazów (np. 50 MP). - Zmień sygnaturę funkcji
DefaultRenderersFactory.getImageDecoderFactory()
, aby przyjmowała parametrContext
. - Dopasuj maksymalny rozmiar wyjściowy mapy bitowej używany w
CompositionPlayer
do rozmiaru używanego wTransformer
(co oznacza, żeCompositionPlayer
nie uwzględnia rozmiaru wyświetlacza podczas dekodowania map bitowych, w przeciwieństwie doExoPlayer
).
- Ogranicz dekodowane mapy bitowe do rozmiaru wyświetlacza w
- Muxers:
- Usunęliśmy błąd, który powodował, że w przypadku próbek audio w sfragmentowanym formacie MP4 nie były ustawiane prawidłowe flagi próbek.
- Sesja:
- Naprawiliśmy błąd, który powodował, że wywołanie funkcji
setSessionExtras
z wątku głównego podczas uruchamiania odtwarzacza z innego wątku aplikacji niż wątek główny powodowało błądIllegalStateException
(#2265). - Nie wyświetlaj automatycznie powiadomienia, jeśli odtwarzacz jest skonfigurowany z elementami multimedialnymi bez ich przygotowywania lub odtwarzania (#2423 https://github.com/androidx/media/issues/2423). To zachowanie można skonfigurować za pomocą
MediaSessionService.setShowNotificationForIdlePlayer
. - Dodaj niestandardowe
PlaybackException
do wszystkich lub wybranych kontrolerów. - Naprawiono błąd, w którym przewijanie transmisji na żywo na urządzeniu
MediaController
mogło powodowaćIllegalArgumentException
. - W przypadku transmisji na żywo przestań publikować pozycję odtwarzania i możliwość przewijania bieżącego elementu w kontrolerach multimediów platformy, aby uniknąć artefaktów pozycji w interfejsie Androida Auto (i innych kontrolerach korzystających z tych informacji z sesji multimediów platformy) (#1758).
- Naprawiliśmy błąd, który powodował, że wywołanie funkcji
- Rozszerzenie Cronet:
- Dodanie automatycznej obsługi plików cookie (#5975).
- Rozszerzenie HLS:
- Poprawiono analizowanie playlisty, aby akceptować znak
\f
(form feed) w wartościach atrybutów w cudzysłowie (#2420). - Obsługa aktualizowania reklam pełnoekranowych o tym samym identyfikatorze (#2427).
- Naprawiono błąd, który powodował, że błędy ładowania playlisty nie były czasami propagowane, gdy transmisja na żywo wyczerpała segmenty do załadowania (#2401https://github.com/androidx/media/issues/2401).
- Grupuj wersje napisów według tagu NAME, podobnie jak wersje audio (#1666).
- Poprawiono analizowanie playlisty, aby akceptować znak
- Rozszerzenie DASH:
- Naprawiono błąd, który powodował, że skracanie czasu trwania okresu DASH mogło wywoływać wyjątek, gdy próbki wykraczające poza nowy czas trwania zostały już odczytane przez potok renderowania (#2440).
- Rozwiązaliśmy błąd, który powodował, że przekierowanie nie było śledzone podczas używania parametrów zapytania CMCD (#2475).
- Rozszerzenie RTSP:
- Poprawiono
RtspClient
, aby podczas przetwarzania odpowiedzi HTTP 302 używać identyfikatora URI lokalizacji podanego w odpowiedzi (#2398).
- Poprawiono
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Naprawiono błąd, w wyniku którego
DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange
nie działało w przypadku rozszerzeń dekodera audio (#2258).
- Naprawiono błąd, w wyniku którego
- Rozszerzenie Przesyłaj:
- Dodano obsługę
setVolume()
igetVolume()
(#2279). - Zapobiegaj przechodzeniu CastPlayer w stan STATE_BUFFERING, gdy oś czasu jest pusta.
- Dodano obsługę
- Narzędzia testowe:
- Dodaj
advance(player).untilPositionAtLeast
iuntilMediaItemIndex
doTestPlayerRunHelper
, aby przesunąć gracza do określonej pozycji. W większości przypadków te metody są bardziej niezawodne niż dotychczasowe metodyuntilPosition
iuntilStartOfMediaItem
. - Przenieś moduł
FakeDownloader
do modułutest-utils-robolectric
, aby można go było ponownie wykorzystać w innych testach.
- Dodaj
Wersja 1.8.0-alpha01
19 maja 2025 r.
Zostanie wycofaneandroidx.media3:media3-*:1.8.0-alpha01
Wersja 1.8.0-alpha01 zawiera te zmiany.
- ExoPlayer:
- Dodaj metodę
ExoPlayer.setScrubbingModeEnabled(boolean)
. Optymalizuje to odtwarzacz pod kątem wielu częstych przewijań (np. gdy użytkownik przeciąga suwak). Działanie trybu przewijania można dostosować za pomocąsetScrubbingModeParameters(..)
naExoPlayer
iExoPlayer.Builder
. - Zezwalaj na dostosowywanie tolerancji ułamkowej w trybie przewijania.
- Zwiększ szybkość działania kodeka w trybie przewijania.
- Naprawiono błąd, w którym błędy przygotowania w treści elementu
AdsMediaSource
mogły nigdy nie być zgłaszane (#2337). - Naprawiono wyciek pamięci w
MergingMediaSource
, np. podczas wczytywania napisów z pliku zewnętrznego (#2338). - Zezwalaj na zwracanie przez
CmcdConfiguration.Factory
wartościnull
, aby wyłączyć rejestrowanie CMCD w przypadku określonych elementów multimedialnych (#2386). - Zwiększ domyślny rozmiar bufora obrazu ze 128 KB (błąd kopiowania i wklejania ze ścieżek tekstowych) do 26 MB, co wystarczy na obrazy Ultra HDR o rozdzielczości 50 MP (#2417).
- Dodaj
PreCacheHelper
, który umożliwia aplikacjom wstępne buforowanie pojedynczego pliku multimedialnego z określonym położeniem początkowym i czasem trwania.
- Dodaj metodę
- Transformer:
- Wypełnienie początkowej luki (dodanej za pomocą
addGap()
) cichym dźwiękiem wymaga teraz wyraźnego ustawieniaexperimentalSetForceAudioTrack(true)
wEditedMediaItemSequence.Builder
. Jeśli przerwa występuje w środku sekwencji, ten flag nie jest wymagany. - Przenieś interfejs
Muxer
zmedia3-transformer
domedia3-muxer
. - Ustawienie
MediaItem.Builder().setImageDuration(long)
jako obowiązkowe, aby zaimportować element multimedialny jako obraz. - Dodaj
Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean)
listę edycji MP4 podczas przycinania, aby poinstruować odtwarzacze, aby ignorowały próbki między klatką kluczową przed punktem rozpoczęcia przycinania a punktem rozpoczęcia przycinania. - Zaktualizuj aplikację demonstracyjną Composition, aby używała języka Kotlin i biblioteki Jetpack Compose, oraz dodaj niestandardowy element
VideoCompositorSettings
do rozmieszczania sekwencji w układzie 2x2 lub PiP.
- Wypełnienie początkowej luki (dodanej za pomocą
- Ekstraktory:
- MP3: używaj czasu trwania i rozmiaru danych z nieprzeszukiwalnych metadanych Xing, VBRI i podobnych metadanych o zmiennej szybkości transmisji, gdy wracasz do wyszukiwania o stałej szybkości transmisji z powodu
FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS)
(#2194).
- MP3: używaj czasu trwania i rozmiaru danych z nieprzeszukiwalnych metadanych Xing, VBRI i podobnych metadanych o zmiennej szybkości transmisji, gdy wracasz do wyszukiwania o stałej szybkości transmisji z powodu
- Dźwięk:
- Zezwalaj na miksowanie w górę i w dół ze stałą mocą w DefaultAudioMixer.
- Udostępnianie
ChannelMappingAudioProcessor
,TrimmingAudioProcessor
iToFloatPcmAudioProcessor
jako publicznych (#2339). - Użyj
AudioTrack#getUnderrunCount()
wAudioTrackPositionTracker
, aby wykrywać niedobory wDefaultAudioSink
zamiast szacowania opartego na najlepszych dostępnych danych. - Poprawia wygładzanie sygnatur czasowych dźwięku w przypadku nieoczekiwanego dryfu pozycji z urządzenia wyjściowego audio.
- Naprawiono błąd, w wyniku którego synchronizacja audio-wideo była przerywana przez pierwsze 10 sekund po wznowieniu odtwarzania po wstrzymaniu, gdy słuchawki były połączone z urządzeniami Bluetooth.
- Naprawiono błąd, który powodował, że
AnalyticsListener.onAudioPositionAdvancing
nie raportował czasu rozpoczęcia odtwarzania dźwięku, ale czas pierwszego pomiaru.
- Film:
- Dodano eksperymentalny interfejs API
ExoPlayer
, aby uwzględnić flagęMediaCodec.BUFFER_FLAG_DECODE_ONLY
podczas kolejkowania buforów wejściowych tylko do dekodowania. Ten sygnał informuje dekoder, aby pominął bufory tylko do dekodowania, co przyspiesza wyszukiwanie. Włącz ją, klikającDefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag
. - Ulepszanie sprawdzania wydajności kodeków wideo w przypadku kodeków wideo w oprogramowaniu. Może to spowodować oznaczenie niektórych dodatkowych ścieżek jako
EXCEEDS_CAPABILITIES
. - Rozwiązano problem z błędami odtwarzania VP9 Widevine na niektórych urządzeniach (#2408).
- Dodano eksperymentalny interfejs API
- Tekst:
- Poprawiono SSA i SubRip, aby wyświetlać wskazówkę o postępie podczas włączania napisów (#2309).
- Naprawiono problem z zawieszaniem się odtwarzania podczas przełączania się ze strumienia z błędem napisów na transmisję na żywo z pustą ścieżką napisów (#2328).
- Rozwiązanie problemu z zniekształconymi napisami CEA-608 podczas odtwarzania strumieni H.262 zawierających ramki B (#2372).
- Dodaliśmy obsługę napisów SSA z
CodecId = S_TEXT/SSA
w plikach Matroska. WcześniejMatroskaExtractor
obsługiwał tylkoCodecId = S_TEXT/ASS
, który reprezentuje „zaawansowaną” (v4+) wersję napisów SubStation Alpha (ale logika parsowania ExoPlayera jest taka sama w przypadku obu wersji) (#2384). - Dodano obsługę właściwości
layer
w plikach napisów SubStation Alpha (SSA), która służy do określania kolejności wyświetlania wskazówek, gdy na ekranie wyświetla się więcej niż jedna jednocześnie (#2124).
- Skutek:
- Dodaj
Presentation.createForShortSide(int)
, który tworzyPresentation
, aby krótszy bok zawsze pasował do podanej wartości, niezależnie od orientacji danych wejściowych.
- Dodaj
- Muxers:
writeSampleData()
Interfejs API używa teraz klasyBufferInfo
specyficznej dla multipleksera zamiastMediaCodec.BufferInfo
.- Dodaj atrybut
Muxer.Factory#supportsWritingNegativeTimestampsInEditList
, który domyślnie ma wartość „false”.
- Rozszerzenie IMA:
- Naprawiliśmy błąd, który powodował, że błąd ładowania w jednej reklamie mógł przypadkowo unieważnić inną grupę reklam.
- Naprawiliśmy błąd, który powodował, że grupy reklam po zakończeniu okna VOD zatrzymywały odtwarzanie.
Grupy reklam z czasem rozpoczęcia po upływie okresu nie są już umieszczane w kolejce
MediaPeriodQueue
(#2215).
- Sesja:
- Naprawiliśmy błąd, który powodował, że przekazanie wartości null do parametru
getLibraryRoot
w przypadku elementuMediaBrowser
połączonego ze starszym elementemMediaBrowserServiceCompat
powodowało zwrócenie wartościNullPointerException
. - Naprawiono błąd, który powodował, że wysyłanie działań niestandardowych, wyniku wyszukiwania lub żądania getItem powodowało awarię starszej aplikacji sesji z błędem
ClassNotFoundException
. - Naprawiliśmy błąd, który powodował, że
MediaItem.LocalConfiguration.uri
było udostępniane wMediaMetadata
sesji platformy. Aby celowo udostępnić identyfikator URI, aby kontrolery mogły ponownie zażądać multimediów, ustaw wartośćMediaItem.RequestMetadata.mediaUri
.
- Naprawiliśmy błąd, który powodował, że przekazanie wartości null do parametru
- UI:
- Naprawiono błąd w Compose, który powodował lukę między ustawieniem początkowych stanów przycisków a obserwowaniem zmiany stanu (np. kształtów ikon lub włączenia). Wszystkie zmiany wprowadzone w odtwarzaczu poza okresem obserwacji są teraz uwzględniane (#2313).
- Dodaj do modułu
media3-ui-compose
elementy przechowujące stan i funkcje kompozycyjne dlaSeekBackButtonState
iSeekForwardButtonState
. - Dodaj do elementu
PlayerControlView
obsługę trybu przewijania ExoPlayera. Gdy ta opcja jest włączona, odtwarzacz przechodzi w tryb przewijania, gdy użytkownik zaczyna przeciągać pasek przewijania. W przypadku każdego ruchu wysyła wywołanieplayer.seekTo
, a następnie wychodzi z trybu przewijania, gdy użytkownik odsunie palec od ekranu. Tę integrację można włączyć za pomocą elementutime_bar_scrubbing_enabled = true
w XML lub metodysetTimeBarScrubbingEnabled(boolean)
w kodzie Java/Kotlin. - Spraw, aby funkcja
PlayerSurface
akceptowała argumentPlayer
dopuszczający wartość null.
- Pobrane:
- Dodaliśmy obsługę częściowego pobierania w przypadku strumieni progresywnych. Aplikacje mogą przygotować strumień progresywny za pomocą
DownloadHelper
i poprosić oDownloadRequest
z pomocniczego interfejsu API, określając czasowe pozycje początkowe i końcowe multimediów, które mają być objęte pobieraniem. Zwrócony obiektDownloadRequest
zawiera rozwiązany zakres bajtów, za pomocą którego można utworzyć obiektProgressiveDownloader
i pobrać odpowiednie treści. - Dodaj
DownloadHelper.Factory
, którym zastąpione zostaną metody statyczneDownloadHelper.forMediaItem()
. - Dodaj
Factory
w przypadku implementacjiSegmentDownloader
. - Dodaliśmy obsługę częściowego pobierania w przypadku strumieni adaptacyjnych. Aplikacje mogą przygotować strumień adaptacyjny z
DownloadHelper
i poprosić oDownloadRequest
z pomocnika, określając czasowe pozycje początkowe i końcowe multimediów, które mają być objęte pobieraniem. Zwrócony elementDownloadRequest
zawiera rozwiązany zakres czasu, na podstawie którego można utworzyć konkretny elementSegmentDownloader
i pobrać odpowiednie treści.
- Dodaliśmy obsługę częściowego pobierania w przypadku strumieni progresywnych. Aplikacje mogą przygotować strumień progresywny za pomocą
- Rozszerzenie HLS:
- Obsługa listy X-ASSET-LIST i transmisji na żywo z parametrem
HlsInterstitialsAdsLoader
.
- Obsługa listy X-ASSET-LIST i transmisji na żywo z parametrem
- Rozszerzenie RTSP:
- Dodano obsługę analizowania opisów sesji zawierających wiersze z białymi znakami na końcu (#2357).
- Rozszerzenie Przesyłaj:
- Dodano obsługę
getDeviceVolume()
,setDeviceVolume()
,getDeviceMuted()
isetDeviceMuted()
(#2089).
- Dodano obsługę
- Narzędzia testowe:
- Usunięto:
transformer.TestUtil.addAudioDecoders(String...)
,transformer.TestUtil.addAudioEncoders(String...)
itransformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...)
. Zamiast tego skonfiguruj enkodery i dekodery cieni za pomocąShadowMediaCodecConfig
. - W nazwach kodeków zgłaszanych przez
ShadowMediaCodecConfig
prefiks „exotest” został zastąpiony prefiksem „media3”.
- Usunięto:
- Usuń symbole, które nie są już używane:
- Usunięto wycofany konstruktor
SegmentDownloader
SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor)
i odpowiednie konstruktory w jego podklasach:DashDownloader
,HlsDownloader
iSsDownloader
. - Usunięto wycofane elementy
Player.hasNext()
,Player.hasNextWindow()
. Zamiast niej używaj właściwościPlayer.hasNextMediaItem()
. - Usunięto wycofaną funkcję
Player.next()
. Zamiast niej używaj zasadyPlayer.seekToNextMediaItem()
. - Usunięto wycofaną funkcję
Player.seekToPreviousWindow()
. Zamiast niej używaj właściwościPlayer.seekToPreviousMediaItem()
. - Usunięto wycofaną funkcję
Player.seekToNextWindow()
. Zamiast niej używaj właściwościPlayer.seekToNextMediaItem()
. - Usunięto wycofany element
BaseAudioProcessor
w moduleexoplayer
. Użyj opcjiBaseAudioProcessor
w modulecommon
. - Usuń wycofany konstruktor
MediaCodecVideoRenderer
MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider)
.
- Usunięto wycofany konstruktor
Wersja 1.7.0
Wersja 1.7.1
16 maja 2025 r.
Ta wersja ma ten sam kod co wersja 1.6.1 i została opublikowana, aby była traktowana jako „nowsza” niż wersja 1.7.0, która była wersją alfa przypadkowo oznaczoną jako stabilna (patrz poniżej).
Wersja 1.7.0
16 maja 2025 r.
Ta wersja powinna mieć oznaczenie 1.7.0-alpha01
, ale na maven.google.com została omyłkowo oznaczona jako 1.7.0
(czyli stabilna). Nie używaj jej. Pozostań przy wersji 1.6.1 lub uaktualnij ją do wersji 1.7.1 (która ma ten sam kod co wersja 1.6.1).
Wersja 1.6.0
1.6.1
14 kwietnia 2025 r.
Zostanie wycofaneandroidx.media3:media3-*:1.6.1
Wersja 1.6.1 zawiera te zmiany.
- Biblioteka wspólna:
- Dodano metodę
PlaybackParameters.withPitch(float)
, która umożliwia łatwe kopiowanie elementu aPlaybackParameters
z nową wartościąpitch
(#2257).
- Dodano metodę
- ExoPlayer:
- Rozwiązanie problemu polegającego na tym, że przejście do elementu multimedialnego kończyło się niepowodzeniem z powodu błędu odtwarzacza, który można było naprawić, podczas inicjowania następnego elementu multimedialnego (#2229).
- Rozwiązanie problemu polegającego na tym, że funkcja
ProgressiveMediaPeriod
zgłaszała błądIllegalStateException
, gdy funkcjaPreloadMediaSource
próbowała wywołać funkcjęgetBufferedDurationUs()
przed jej przygotowaniem (#2315). - Naprawiono wysyłanie
CmcdData
w żądaniach manifestu w przypadku DASH, HLS i SmoothStreaming (#2253). - Upewnij się, że po usunięciu grup reklam możesz nadal używać
AdPlaybackState.withAdDurationsUs(long[][])
. Użytkownik nadal musi przekazywać tablicę czasów trwania usuniętych grup reklam, która może być pusta lub mieć wartość null (#2267).
- Ekstraktory:
- MP4: przeanalizuj
alternate_group
z polatkhd
i udostępnij go jako wpisMp4AlternateGroupData
wFormat.metadata
każdego ścieżki (#2242).
- MP4: przeanalizuj
- Dźwięk:
- Naprawiono problem z przekazywaniem, w którym pozycja mogła się zablokować podczas odtwarzania playlisty z krótkimi treściami (#1920).
- Sesja:
- Zmniejsz limit czasu oczekiwania na wywołania zwrotne platformy
MediaSession
z 500 ms do 100 ms i dodaj eksperymentalny setter, aby umożliwić aplikacjom konfigurowanie tej wartości. - Rozwiązaliśmy problem, który powodował, że powiadomienia pojawiały się ponownie po ich zamknięciu przez użytkownika (#2302).
- Naprawiliśmy błąd polegający na tym, że sesja zwracała oś czasu z 1 elementem, gdy opakowany odtwarzacz był pusty. Dzieje się tak, gdy odtwarzacz opakowany nie ma dostępnej funkcji
COMMAND_GET_TIMELINE
, a funkcjaCOMMAND_GET_CURRENT_MEDIA_ITEM
jest dostępna i odtwarzacz opakowany jest pusty (#2320). - Rozwiązanie problemu polegającego na tym, że wywołanie funkcji
MediaSessionService.setMediaNotificationProvider
jest cicho ignorowane po innych interakcjach z usługą, takich jaksetForegroundServiceTimeoutMs
(#2305).
- Zmniejsz limit czasu oczekiwania na wywołania zwrotne platformy
- UI:
- Włącz
PlayerSurface
, aby korzystać z funkcjiExoPlayer.setVideoEffects
iCompositionPlayer
. - Naprawiono błąd, który uniemożliwiał ponowne skomponowanie
PlayerSurface
z nowymPlayer
.
- Włącz
- Rozszerzenie HLS:
- Rozwiązaliśmy problem polegający na tym, że czas trwania fragmentu nie był ustawiony w
CmcdData
w przypadku multimediów HLS, co powodowało błąd asercji podczas przetwarzania zaszyfrowanych segmentów multimediów (#2312).
- Rozwiązaliśmy problem polegający na tym, że czas trwania fragmentu nie był ustawiony w
- Rozszerzenie RTSP:
- Dodano obsługę identyfikatora URI ze schematem RTSPT jako sposobu konfigurowania sesji RTSP do korzystania z TCP (#1484).
- Rozszerzenie Przesyłaj:
- Dodanie obsługi metadanych playlisty (#2235).
1.6.0
26 marca 2025 r.
Zostanie wycofaneandroidx.media3:media3-*:1.6.0
Wersja 1.6.0 zawiera te zmiany.
- Biblioteka wspólna:
- Dodaj
AudioManagerCompat
iAudioFocusRequestCompat
, aby zastąpić równoważne klasy wandroidx.media
. - Zaktualizuj Kotlin z wersji 1.9.20 do 2.0.20 i użyj wtyczki Gradle kompilatora Compose. Uaktualniono bibliotekę KotlinX Coroutines z wersji 1.8.1 do 1.9.0.
- Usuń metodę
Format.toBundle(boolean excludeMetadata)
i użyj metodyFormat.toBundle()
. - Usunęliśmy błąd w
SimpleBasePlayer
, który powodował, że ustawienie nowegocurrentMediaItemIndex
wState
posetPlaylist
znull
MediaMetadata
nie powodowało ponownej oceny metadanych (#1940). - Zmiana dostępu do
SimpleBasePlayer.State
z chronionego na publiczny, aby ułatwić obsługę aktualizacji w innych klasach (#2128).
- Dodaj
- ExoPlayer:
- Dodaj
MediaExtractorCompat
, nową klasę, która zapewnia funkcje równoważne z platformąMediaExtractor
. - Dodano eksperymentalną obsługę wstępnego rozgrzewania „ExoPlayera” do odtwarzania za pomocą
MediaCodecVideoRenderer
. Możesz skonfigurowaćDefaultRenderersFactory
za pomocąexperimentalSetEnableMediaCodecVideoRendererPrewarming
, aby zapewnić dodatkowyMediaCodecVideoRenderer
dlaExoPlayer
. Jeśli ta opcja jest włączona,ExoPlayer
wstępnie przetwarza film z kolejnych elementów multimedialnych podczas odtwarzania, aby zmniejszyć opóźnienie przejścia między elementami multimedialnymi. - Zmniejsz wartości domyślne parametrów
bufferForPlaybackMs
ibufferForPlaybackAfterRebufferMs
wDefaultLoadControl
do odpowiednio 1000 ms i 2000 ms. - Inicjuj
DeviceInfo
i głośność urządzenia asynchronicznie (jeśli jest włączona za pomocąsetDeviceVolumeControlEnabled
). Te wartości nie są dostępne od razu po wywołaniuExoPlayer.Builder.build()
, aPlayer.Listener
powiadamia o zmianach za pomocąonDeviceInfoChanged
ionDeviceVolumeChanged
. - Początkowy identyfikator sesji audio nie jest już dostępny od razu po utworzeniu odtwarzacza. W razie potrzeby możesz odsłuchać początkową aktualizację, klikając
AnalyticsListener.onAudioSessionIdChanged
. - Podczas wybierania ścieżki wideo weź pod uwagę język. Domyślnie wybieramy „główną” ścieżkę wideo, która pasuje do języka wybranej ścieżki audio, jeśli jest dostępna. Wyraźne preferencje dotyczące języka filmu można określić za pomocą parametru
TrackSelectionParameters.Builder.setPreferredVideoLanguage(s)
. - Dodaj parametr
selectedAudioLanguage
do metodyDefaultTrackSelector.selectVideoTrack()
. - Dodaj parametr
retryCount
do metodMediaSourceEventListener.onLoadStarted
i odpowiednich metodMediaSourceEventListener.EventDispatcher
. - Rozwiązaliśmy problem polegający na tym, że elementy playlisty lub okresy w strumieniach DASH z wieloma okresami, których czas trwania nie odpowiadał rzeczywistej treści, mogły powodować zamrożenie klatek na końcu elementu (#1698).
- Przenieś
BasePreloadManager.Listener
na najwyższy poziomPreloadManagerListener
. RenderersFactory.createSecondaryRenderer
można wdrożyć, aby zapewnić dodatkowe mechanizmy renderowania do wstępnego rozgrzewania. Wstępne wczytywanie umożliwia szybsze przełączanie między elementami multimedialnymi podczas odtwarzania.- Włącz wysyłanie
CmcdData
w przypadku żądań pliku manifestu w adaptacyjnym strumieniowym przesyłaniu danych w formatach DASH, HLS i SmoothStreaming (#1951). - Podaj
MediaCodecInfo
kodeka, który zostanie zainicjowany wMediaCodecRenderer.onReadyToInitializeCodec
(#1963). - Zmień
AdsMediaSource
, aby umożliwićAdPlaybackStates
powiększanie się przez dodawanie grup reklam. Wykryte nieprawidłowe modyfikacje powodują zgłoszenie wyjątku. - Rozwiązaliśmy problem polegający na tym, że po reklamie w trakcie filmu podczas przechodzenia do treści multimedialnych w szybkiej sekwencji mogą być wyświetlane dodatkowe ramki tylko do dekodowania.
- Ustaw wartość
DefaultRenderersFactory
, aby dodać 2 instancjeMetadataRenderer
i umożliwić aplikacjom domyślne otrzymywanie 2 różnych schematów metadanych. - Ponownie oceń, czy trwające ładowanie fragmentu powinno zostać anulowane, gdy odtwarzanie jest wstrzymane (#1785).
- Dodaj opcję
ClippingMediaSource
, aby umożliwić wycinanie fragmentów w przypadku multimediów, których nie można przewijać. - Naprawiliśmy błąd, który powodował, że przewijanie z wstępnym buforowaniem mogło blokować przejście do następnego elementu multimedialnego.
- Usunęliśmy błąd, w którym stan
ExoPlayer.isLoading()
pozostawałtrue
, mimo że zmienił się naSTATE_IDLE
lubSTATE_ENDED
(#2133). - Dodaj
lastRebufferRealtimeMs
doLoadControl.Parameter
(#2113).
- Dodaj
- Transformer:
- Dodanie obsługi transkodowania do alternatywnych formatów zgodnych wstecznie.
- Dodano obsługę transkodowania i transmuksowania formatu Dolby Vision (profil 8).
- Zaktualizuj parametry
VideoFrameProcessor.registerInputStream
iVideoFrameProcessor.Listener.onInputStreamRegistered
, aby korzystały zFormat
. - Generuj statyczne metadane HDR podczas korzystania z funkcji
DefaultEncoderFactory
. - Włącz obsługę diagnostyki platformy Android za pomocą
MediaMetricsManager
. Moduł Transformer przekazuje do platformy zdarzenia edycji i dane o wydajności, co pomaga dostarczać na urządzeniu informacje o wydajności systemu i debugowaniu. Dane te 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 przesyłania danych na potrzeby diagnostyki platformy Transformer za pomocą parametruTransformer.Builder.setUsePlatformDiagnostics(false)
. - Podziel
InAppMuxer
naInAppMp4Muxer
iInAppFragmentedMp4Muxer
.InAppMp4Muxer
służy do tworzenia niesfragmentowanego pliku MP4, aInAppFragmentedMp4Muxer
do tworzenia sfragmentowanego pliku MP4. - Przenieś interfejs
Muxer
zmedia3-muxer
domedia3-transformer
. - Dodaj
MediaProjectionAssetLoader
, który udostępnia multimedia zMediaProjection
do nagrywania ekranu, i dodaj obsługę nagrywania ekranu do aplikacji demonstracyjnej Transformer. - Dodaj
#getInputFormat()
do interfejsuCodec
. - Przekaż odpowiedzialność za zwolnienie
GlObjectsProvider
na dzwoniącego wDefaultVideoFrameProcessor
iDefaultVideoCompositor
, gdy jest to możliwe.
- Ekstraktory:
- AVI: poprawiono obsługę plików z audio skompresowanym ze stałą szybkością transmisji, w których nagłówek strumienia przechowuje liczbę bajtów zamiast liczby fragmentów.
- Poprawiono obsługę jednostek NAL o długości wyrażonej w 1 lub 2 bajtach (zamiast 4).
- Naprawiono błąd
ArrayIndexOutOfBoundsException
na listach edycji MP4, gdy lista edycji zaczyna się od klatki niesynchronizowanej bez poprzedzającej klatki synchronizowanej (#2062). - Rozwiązanie problemu polegającego na tym, że strumienie TS mogą się zawieszać na niektórych urządzeniach (#2069).
- FLAC: dodaliśmy obsługę 32-bitowych plików FLAC. Wcześniej nie można było ich odtworzyć w
IllegalStateException: Playback stuck buffering and not loading
(#2197).
- Dźwięk:
- Poprawiono wywoływanie funkcji
onAudioPositionAdvancing
po wznowieniu odtwarzania (wcześniej była wywoływana po wstrzymaniu odtwarzania). - Nie pomijaj
SonicAudioProcessor
, gdySpeedChangingAudioProcessor
jest skonfigurowany z parametrami domyślnymi. - Naprawiono niedobór w
Sonic#getOutputSize()
, który mógł powodować zatrzymanieDefaultAudioSink
. - Popraw
MediaCodecAudioRenderer.getDurationToProgressUs()
iDecoderAudioRenderer.getDurationToProgressUs()
, aby prawidłowo resetowały podane czasy trwania. - Ustawić numer
androidx.media3.common.audio.SonicAudioProcessor
jako stały? - Dodaliśmy obsługę formatu float PCM do elementów
ChannelMappingAudioProcessor
iTrimmingAudioProcessor
.
- Poprawiono wywoływanie funkcji
- Film:
- Zmień
MediaCodecVideoRenderer.shouldUsePlaceholderSurface
na protected, aby aplikacje mogły zastępować blokowanie użycia powierzchni zastępczych (#1905). - Dodano eksperymentalną analizę zależności próbki AV1
ExoPlayer
, aby przyspieszyć wyszukiwanie. Włącz go za pomocą nowego interfejsu APIDefaultRenderersFactory.experimentalSetParseAv1SampleDependencies
. - Dodaj eksperymentalny interfejs API
ExoPlayer
, aby usuwać późneMediaCodecVideoRenderer
bufory wejściowe dekodera, od których nie zależy działanie. Włącz ją, klikającDefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs
. - Rozwiązaliśmy problem polegający na tym, że odtwarzacz bez powierzchni był od razu gotowy i bardzo wolno dekodował oczekujące klatki (#1973).
- Wykluczanie urządzeń Xiaomi i OPPO z trybu odłączonej powierzchni, aby uniknąć migotania ekranu (#2059).
- Zmień
- Tekst:
- Dodano obsługę napisów VobSub (#8260).
- Zaprzestanie wczytywania z wyprzedzeniem wszystkich plików z napisami skonfigurowanych za pomocą
MediaItem.Builder.setSubtitleConfigurations
i zamiast tego wczytywanie tylko jednego, jeśli zostanie wybrany przez wybór ścieżki (#1721). - TTML: dodano obsługę odwołań do
tts:origin
itts:extent
za pomocąstyle
(#2953). - Ogranicz sygnatury czasowe WebVTT i SubRip do dokładnie 3 miejsc po przecinku. Wcześniej nieprawidłowo analizowaliśmy dowolną liczbę miejsc po przecinku, ale zawsze zakładaliśmy, że wartość jest podana w milisekundach, co prowadziło do nieprawidłowych sygnatur czasowych (#1997).
- Naprawiono zawieszanie się odtwarzania, gdy playlista zawierała przycięte elementy z napisami CEA-608 lub CEA-708.
- Naprawiono
IllegalStateException
, gdy plik SSA zawierał wskazówkę o zerowym czasie trwania (czas rozpoczęcia i zakończenia były takie same) (#2052). - Tłumienie (i rejestrowanie) błędów analizowania napisów, gdy są one multipleksowane w tym samym kontenerze co audio i wideo (#2052).
- Poprawiono obsługę wielobajtowych znaków UTF-8 w plikach WebVTT z zakończeniami wierszy CR (#2167).
- DRM:
- Naprawiono błąd
MediaCodec$CryptoException: Operation not supported in this configuration
podczas odtwarzania treści ClearKey na urządzeniach z interfejsem API w wersji starszej niż 27 (#1732).
- Naprawiono błąd
- Skutek:
- Przeniesiono funkcję
OverlaySettings
doStaticOverlaySettings
.OverlaySettings
można podzielić na klasy podrzędne, aby umożliwić dynamiczne ustawienia nakładki.
- Przeniesiono funkcję
- Muxers:
- Przeniesiono
MuxerException
z interfejsuMuxer
, aby uniknąć bardzo długiej w pełni kwalifikowanej nazwy. - Zmieniono nazwę metody
setSampleCopyEnabled()
nasetSampleCopyingEnabled()
w przypadkuMp4Muxer.Builder
iFragmentedMp4Muxer.Builder
. Mp4Muxer.addTrack()
iFragmentedMp4Muxer.addTrack()
zwracają teraz identyfikator ścieżkiint
zamiastTrackToken
.- Metody
Mp4Muxer
iFragmentedMp4Muxer
nie implementują już interfejsuMuxer
. - Domyślnie wyłącz próbkowanie i kopiowanie
Mp4Muxer
. - Napraw błąd w
FragmentedMp4Muxer
, który powoduje tworzenie wielu fragmentów, gdy zapisywana jest tylko ścieżka audio.
- Przeniesiono
- Sesja:
- Utrzymuj stan usługi na pierwszym planie przez dodatkowe 10 minut, gdy odtwarzanie zostanie wstrzymane, zatrzymane lub zakończy się niepowodzeniem. Dzięki temu użytkownicy mogą wznowić odtwarzanie w tym czasie bez ryzyka ograniczeń dotyczących usług na pierwszym planie na różnych urządzeniach. Pamiętaj, że wywołanie
player.pause()
nie może już służyć do zatrzymywania usługi na pierwszym planie przedstopSelf()
. Podczas zastępowaniaonTaskRemoved
używajMediaSessionService.pauseAllPlayersAndStopSelf()
. - Zachowaj widoczność powiadomienia, gdy odtwarzanie przejdzie w stan błędu lub zatrzymania. Powiadomienie zostanie usunięte tylko wtedy, gdy playlista zostanie wyczyszczona lub odtwarzacz zostanie zwolniony.
- Ulepszono obsługę działań ACTION_PLAY i ACTION_PAUSE w MediaSession na platformie Android, aby ustawiać tylko jedno z nich zgodnie z dostępnymi poleceniami, a także akceptować sytuację, w której ustawione jest tylko jedno z nich.
- Dodanie
Context
jako parametru doMediaButtonReceiver.shouldStartForegroundService
(#1887). - Naprawiliśmy błąd, który powodował, że wywołanie metody
Player
na połączonymMediaController
z sesją starszego typu powodowało utratę zmian z oczekującej aktualizacji. - Zezwól na wartość null w przypadku funkcji
MediaSession.setSessionActivity(PendingIntent)
accept null (#2109). - Usunęliśmy błąd, który powodował, że po wyczyszczeniu playlisty nadal było widoczne nieaktualne powiadomienie (#2211).
- Utrzymuj stan usługi na pierwszym planie przez dodatkowe 10 minut, gdy odtwarzanie zostanie wstrzymane, zatrzymane lub zakończy się niepowodzeniem. Dzięki temu użytkownicy mogą wznowić odtwarzanie w tym czasie bez ryzyka ograniczeń dotyczących usług na pierwszym planie na różnych urządzeniach. Pamiętaj, że wywołanie
- UI:
- Dodaj do modułu
media3-ui-compose
elementy przechowujące stan i funkcje kompozycyjne dlaPlayerSurface
,PresentationState
,PlayPauseButtonState
,NextButtonState
,PreviousButtonState
,RepeatButtonState
,ShuffleButtonState
iPlaybackSpeedState
.
- Dodaj do modułu
- Pobrane:
- Naprawiono błąd w
CacheWriter
, który powodował, że źródła danych pozostawały otwarte, a obszary pamięci podręcznej były zablokowane, jeśli źródło danych zgłaszało błądException
inny niżIOException
(#9760).
- Naprawiono błąd w
- Rozszerzenie HLS:
- Dodaj pierwszą wersję
HlsInterstitialsAdsLoader
. Moduł wczytywania reklam odczytuje reklamy pełnoekranowe HLS z playlisty multimediów HLS i mapuje je naAdPlaybackState
, które jest przekazywane doAdsMediaSource
. Ta początkowa wersja obsługuje tylko strumienie VOD HLS z atrybutamiX-ASSET-URI
. - Dodaj
HlsInterstitialsAdsLoader.AdsMediaSourceFactory
. Aplikacje mogą go używać do tworzenia instancjiAdsMediaSource
, które w wygodny i bezpieczny sposób korzystają zHlsInterstitialsAdsLoader
. - Analizowanie tagu
SUPPLEMENTAL-CODECS
z playlisty HLS w celu wykrywania formatów Dolby Vision (#1785). - Złagodzenie warunku wyszukiwania pozycji do synchronizacji w strumieniu HLS (#2209).
- Dodaj pierwszą wersję
- Rozszerzenie DASH:
- Dodanie obsługi formatu AC-4 Level-4 dla DASH (#1898).
- Rozwiązano problem z obliczaniem interwału aktualizacji wstawiania reklam w transmisjach na żywo z wieloma okresami (#1698).
- Analizowanie atrybutu
scte214:supplementalCodecs
z pliku manifestu DASH w celu wykrywania formatów Dolby Vision (#1785). - Poprawiono obsługę przejść między okresami w transmisjach na żywo, w których okres zawiera próbki multimedialne wykraczające poza zadeklarowany czas trwania okresu (#1698).
- Rozwiązanie problemu, w którym zestawy adaptacyjne oznaczone symbolem
adaptation-set-switching
, ale z różnymi językami lub flagami ról są łączone ze sobą (#2222).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Dodaj moduł dekodera MPEG-H, który używa wbudowanego dekodera MPEG-H do dekodowania dźwięku MPEG-H (#1826).
- Rozszerzenie MIDI:
- Przekieruj niestandardowe instancje
AudioSink
iAudioRendererEventListener
doMidiRenderer
.
- Przekieruj niestandardowe instancje
- Rozszerzenie Przesyłaj:
- Zaktualizowano zależność
play-services-cast-framework
do wersji 21.5.0, aby naprawić błądFLAG_MUTABLE
powodujący awarię aplikacji kierowanych na interfejs API 34 lub nowszy na urządzeniach z zainstalowanymi, ale wyłączonymi usługami Google Play (#2178).
- Zaktualizowano zależność
- Aplikacja demonstracyjna:
- Rozszerz możliwości
demo-compose
o dodatkowe przyciski i ulepsz integracjęPlayerSurface
dzięki obsłudze skalowania i migawki.
- Rozszerz możliwości
- Usuń symbole, które nie są już używane:
- Usuń wycofaną metodę
AudioMixer.create()
. Zamiast niej używaj właściwościDefaultAudioMixer.Factory().create()
. - Usuń te wycofane metody
Transformer.Builder
:setTransformationRequest()
używaj 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żyjEditedMediaItem.Builder.setFlattenForSlowMotion()
, aby spłaszczyćEditedMediaItem
przekazywane doTransformer.start()
.setListener()
, użyjaddListener()
,removeListener()
lubremoveAllListeners()
.
- Usuń te wycofane metody
Transformer.Listener
:onTransformationCompleted(MediaItem)
, użyjonCompleted(Composition, ExportResult)
.onTransformationCompleted(MediaItem, TransformationResult)
, użyjonCompleted(Composition, ExportResult)
.onTransformationError(MediaItem, Exception)
, użyjonError(Composition, ExportResult, ExportException)
.onTransformationError(MediaItem, TransformationException)
, użyjonError(Composition, ExportResult, ExportException)
.onTransformationError(MediaItem, TransformationResult, TransformationException)
, użyjonError(Composition, ExportResult, ExportException)
.onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest)
, użyjonFallbackApplied(Composition, TransformationRequest, TransformationRequest)
.
- Usuń wycofaną klasę
TransformationResult
. Zamiast niej używaj zasadyExportResult
. - Usuń wycofaną klasę
TransformationException
. Zamiast niej używaj zasadyExportException
. - Usuń wycofany element
Transformer.PROGRESS_STATE_NO_TRANSFORMATION
. Zamiast niej używaj właściwościTransformer.PROGRESS_STATE_NOT_STARTED
. - Usuń wycofany element
Transformer.setListener()
. Zamiast niej używaj kolumnTransformer.addListener()
,Transformer.removeListener()
lubTransformer.removeAllListeners()
. - Usuń wycofany element
Transformer.startTransformation()
. Zamiast niej używaj właściwościTransformer.start(MediaItem, String)
. - Usuń wycofany element
SingleFrameGlShaderProgram
. Zamiast niej używaj właściwościBaseGlShaderProgram
. - Usuń
Transformer.flattenForSlowMotion
. Zamiast niej używaj właściwościEditedMediaItem.flattenForSlowMotion
. - Usunięto:
ExoPlayer.VideoComponent
,ExoPlayer.AudioComponent
,ExoPlayer.TextComponent
iExoPlayer.DeviceComponent
. - Użytkownik
androidx.media3.exoplayer.audio.SonicAudioProcessor
został usunięty. - Usunęliśmy te wycofane metody
DownloadHelper
:- Konstruktor
DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[])
, użyjDownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList)
. getRendererCapabilities(RenderersFactory)
, równoważną funkcję można uzyskać, tworzącDefaultRendererCapabilitiesList
zRenderersFactory
i wywołującDefaultRendererCapabilitiesList.getRendererCapabilities()
.
- Konstruktor
- Usunięto metodę
PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat)
. UżyjPlayerNotificationManager.setMediaSessionToken(MediaSession.Token)
i przekaż(MediaSession.Token) compatToken.getToken()
.
- Usuń wycofaną metodę
1.6.0-rc02
19 marca 2025 r.
Użyj stabilnej wersji 1.6.0.
1.6.0-rc01
12 marca 2025 r.
Użyj stabilnej wersji 1.6.0.
1.6.0-beta01
26 lutego 2025 r.
Użyj stabilnej wersji 1.6.0.
Wersja 1.6.0-alpha03
6 lutego 2025 r.
Użyj stabilnej wersji 1.6.0.
Wersja 1.6.0-alpha02
30 stycznia 2025 r.
Użyj stabilnej wersji 1.6.0.
Wersja 1.6.0-alpha01
20 grudnia 2024 r.
Użyj stabilnej wersji 1.6.0.
Wersja 1.5
Wersja 1.5.1
19 grudnia 2024 r.
Zostanie wycofaneandroidx.media3:media3-*:1.5.1
Wersja 1.5.1 zawiera te zmiany.
- ExoPlayer:
- Wyłączyliśmy używanie asynchronicznego odszyfrowywania w MediaCodec, aby uniknąć zgłaszanych problemów z przekroczeniem limitu czasu kodeka w tym interfejsie API platformy (#1641).
- Ekstraktory:
- MP3: nie przerywaj odtwarzania przedwcześnie, gdy
VBRI
tabela treści ramki nie obejmuje wszystkich danych MP3 w pliku (#1904).
- MP3: nie przerywaj odtwarzania przedwcześnie, gdy
- Film:
- Cofnięcie używania podanych wartości współczynnika proporcji piksela
MediaCodecAdapter
podczas przetwarzaniaonOutputFormatChanged
(#1371).
- Cofnięcie używania podanych wartości współczynnika proporcji piksela
- Tekst:
- Naprawiliśmy błąd w
ReplacingCuesResolver.discardCuesBeforeTimeUs
, który powodował, że wskazówka aktywna wtimeUs
(rozpoczęta wcześniej, ale jeszcze nie zakończona) była nieprawidłowo odrzucana (#1939).
- Naprawiliśmy błąd w
- Metadane:
- Wyodrębnianie numeru płyty/ścieżki i gatunku z komentarzy Vorbis do
MediaMetadata
(#1958).
- Wyodrębnianie numeru płyty/ścieżki i gatunku z komentarzy Vorbis do
Wersja 1.5.0
27 listopada 2024 r.
Zostanie wycofaneandroidx.media3:media3-*:1.5.0
Wersja 1.5.0 zawiera te zmiany.
- Biblioteka wspólna:
- Dodaj
ForwardingSimpleBasePlayer
, który umożliwia przekazywanie do innego odtwarzacza z niewielkimi korektami, przy jednoczesnym zapewnieniu pełnej spójności i obsługi słuchaczy (#1183). - Zastąp
SimpleBasePlayer.State.playlist
metodągetPlaylist()
. - Dodaj zastąpienie dla
SimpleBasePlayer.State.Builder.setPlaylist()
, aby bezpośrednio określićTimeline
i bieżąceTracks
orazMetadata
zamiast tworzyć strukturę playlisty. - Zwiększ
minSdk
do 21 (Android Lollipop). Jest to zgodne ze wszystkimi innymi bibliotekami AndroidX. - Dodaj artefakt
androidx.media3:media3-common-ktx
, który zapewnia funkcje specyficzne dla języka Kotlin oparte na bibliotece Common. - Dodaj funkcję rozszerzenia zawieszania
Player.listen
, aby uruchomić korutynę do nasłuchiwaniaPlayer.Events
w bibliotecemedia3-common-ktx
. - Usuń adnotacje
@DoNotInline
z ręcznie wyodrębnionych klas wewnętrznych, które mają zapobiegać błędom weryfikacji klas w czasie działania. Najnowsze wersje R8 automatycznie przenoszą takie wywołania poza funkcję, aby uniknąć błędów w czasie działania (ręczne przenoszenie poza funkcję nie jest już wymagane). Wszyscy użytkownicy biblioteki Gradle muszą już używać wersji wtyczki Gradle do Androida, która korzysta z wersji R8, która to robi, z powoducompileSdk = 35
. Użytkownicy biblioteki z systemami kompilacji innymi niż Gradle będą musieli zadbać o to, aby ich odpowiednik R8 wykonujący krok zmniejszania/zaciemniania kodu przeprowadzał podobny automatyczny proces wyodrębniania, aby uniknąć błędów weryfikacji klas w czasie działania. Ta zmiana została już wprowadzona w innych bibliotekach AndroidX.
- Dodaj
- ExoPlayer:
MediaCodecRenderer.onProcessedStreamChange()
można teraz wywołać w przypadku każdego elementu multimedialnego. Wcześniej nie było to wymagane w przypadku pierwszego połączenia. Aby to włączyć, użyjMediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart()
.- Dodano element
PreloadMediaSource.PreloadControl.onPreloadError
, aby umożliwić implementacjomPreloadMediaSource.PreloadControl.onPreloadError
podejmowanie działań w przypadku wystąpienia błędu.PreloadMediaSource.PreloadControl
- Dodaj
BasePreloadManager.Listener
, aby przekazywać zdarzenia wstępnego wczytywania do aplikacji. - Zezwalaj na zmianę czasu oczekiwania klienta SNTP i ponawianie prób połączenia z alternatywnymi adresami po przekroczeniu czasu oczekiwania (#1540).
- Usuń pole
MediaCodecAdapter.Configuration.flags
, ponieważ zawsze miało wartość zero. - Zezwalaj użytkownikowi na wybieranie wbudowanego głośnika do odtwarzania na urządzeniach z Wear OS z API w wersji 35 lub nowszej (jeśli urządzenie deklaruje obsługę tej funkcji).
- Odłóż blokowanie połączenia do
Context.getSystemService(Context.AUDIO_SERVICE)
, aż zostanie włączona obsługaContext.getSystemService(Context.AUDIO_SERVICE)
. Dzięki temu połączenie blokujące nie zostanie wykonane, jeśli obsługa fokusu dźwięku nie jest włączona (#1616). - Zezwalaj na odtwarzanie niezależnie od czasu buforowania, gdy ładowanie się nie powiedzie (#1571).
- Dodaj
AnalyticsListener.onRendererReadyChanged()
, aby zasygnalizować, kiedy poszczególne renderery zezwalają na odtwarzanie. - Naprawiono błąd, który powodował, że
MediaCodec.CryptoException
był czasami zgłaszany jako „nieoczekiwany błąd podczas działania”, gdyMediaCodec
działał w trybie asynchronicznym (domyślne zachowanie w przypadku interfejsu API w wersji 31 lub nowszej). - Przekaż
bufferedDurationUs
zamiastbufferedPositionUs
za pomocąPreloadMediaSource.PreloadControl.onContinueLoadingRequested()
. Zmienia teżDefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS
naDefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS
. Aplikacje muszą wtedy przekazywać wartość reprezentującą określony czas od domyślnej pozycji początkowej, dla której odpowiednie źródło multimediów ma być wstępnie wczytane za pomocą tego IntDef, zamiast pozycji. - Dodaj implementację
ForwardingRenderer
, która przekazuje 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ępne wczytywanie, wywołując odpowiednio funkcję
ExoPlayer.setPreloadConfiguration(PreloadConfiguration)
. Wstępne wczytywanie jest domyślnie wyłączone. Jeśli użytkownik wyrazi na to zgodę, aby nie zakłócać odtwarzania,DefaultLoadControl
ogranicza wstępne wczytywanie do momentu, gdy odtwarzacz nie wczytuje treści do odtworzenia. Aplikacje mogą zmienić to zachowanie, implementując odpowiednio metodęLoadControl.shouldContinuePreloading()
(np. podczas zastępowania tej metody wDefaultLoadControl
). Domyślna implementacja metodyLoadControl
wyłącza wstępne wczytywanie w przypadku, gdy aplikacja używa niestandardowej implementacji metodyLoadControl
. - Dodano metodę
MediaSourceEventListener.EventDispatcher.dispatchEvent()
, która umożliwia wywoływanie zdarzeń detektorów podklas (1736). - Dodaj
DefaultPreloadManager.Builder
, który tworzy instancjeDefaultPreloadManager
iExoPlayer
ze spójnymi konfiguracjami udostępnianymi w jednakowy sposób. - Usuń parametr
Renderer[]
z funkcjiLoadControl.onTracksSelected()
, ponieważ implementacjaDefaultLoadControl
może pobierać typy transmisji z funkcjiExoTrackSelection[]
. - Wycofano
DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])
i oznaczono metodę jako ostateczną, aby zapobiec zastępowaniu. Zamiast niego należy używać nowego interfejsuDefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])
. - Raportuj zdarzenia
MediaSourceEventListener
z dodatkowych źródeł wMergingMediaSource
. Spowoduje to zgłaszanie zdarzeń loadstart/error/cancelled/completed w przypadku wczytywanych z boku napisów (dodanych za pomocąMediaItem.LocalConfiguration.subtitleConfigurations
), które mogą pojawiać się jako zduplikowane zdarzenia wczytywania emitowane zAnalyticsListener
. - Zapobiegaj całkowitemu zatrzymaniu odtwarzania z powodu błędów w napisach i metadanych.
Problemowy utwór jest wyłączany, a odtwarzanie pozostałych utworów jest kontynuowane (#1722).
- W przypadku nowego sposobu obsługi napisów (podczas wyodrębniania) powiązane błędy analizowania (np. nieprawidłowe dane napisów) i ładowania (np. HTTP 404) są emitowane za pomocą wywołań zwrotnych
onLoadError
. - W przypadku starszego sposobu obsługi napisów (podczas renderowania) za pomocą wywołań zwrotnych
onLoadError
są emitowane tylko powiązane błędy wczytywania, a błędy parsowania są cicho ignorowane (jest to dotychczasowe zachowanie).
- W przypadku nowego sposobu obsługi napisów (podczas wyodrębniania) powiązane błędy analizowania (np. nieprawidłowe dane napisów) i ładowania (np. HTTP 404) są emitowane za pomocą wywołań zwrotnych
- Rozwiązaliśmy problem polegający na tym, że elementy playlisty lub okresy w strumieniach DASH z wieloma okresami, których czas trwania nie odpowiadał rzeczywistej treści, mogły powodować zamrożenie klatek na końcu elementu (#1698).
- Dodano funkcję ustawiającą do interfejsu
SntpClient
, która umożliwia określenie maksymalnego czasu, jaki może upłynąć od ostatniej aktualizacji, po którym klient jest ponownie inicjowany (#1794).
- Transformer:
- Dodaj
SurfaceAssetLoader
, który obsługuje kolejkowanie danych wideo do Transformer za pomocąSurface
. ImageAssetLoader
zgłasza nieobsługiwane dane wejściowe za pomocąAssetLoader.onError
zamiast zgłaszaćIllegalStateException
.- Wymagaj ustawienia czasu trwania obrazu za pomocą parametru
MediaItem.Builder.setImageDurationMs
podczas eksportowania obrazu. - Dodano obsługę eksportowania przerw w sekwencjach obiektów EditedMediaItem.
- Dodaj
- Wybór ścieżki:
DefaultTrackSelector
: w przypadku podobnych warunków preferuj dźwięk oparty na obiektach zamiast dźwięku opartego na kanałach.
- Ekstraktory:
- Zezwalaj na identyfikowanie przez opcje
Mp4Extractor
iFragmentedMp4Extractor
próbek H264, które nie są używane jako odniesienie przez kolejne próbki. - Dodanie opcji włączania wyszukiwania opartego na indeksie w
AmrExtractor
. - Traktuj pliki MP3 z ponad 128 kB między prawidłowymi ramkami jako obcięte (zamiast nieprawidłowych). Oznacza to, że pliki z danymi innymi niż MP3 na końcu, bez innych metadanych wskazujących długość bajtów MP3, zatrzymują odtwarzanie na końcu danych MP3 zamiast kończyć się niepowodzeniem z błędem
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}
(#1563). - Poprawiono obsługę próbki przed reklamą w przypadku pozycji początkowych multimediów innych niż klatki kluczowe podczas przetwarzania list edycji w plikach MP4 (#1659).
- Ulepszono obliczanie liczby klatek na sekundę przez użycie czasu trwania multimediów z pola
mdhd
wMp4Extractor
iFragmentedMp4Extractor
(#1531). - Poprawiono nieprawidłowe skalowanie
media_time
na listach edycji MP4. Chociaż wartośćsegment_duration
była już prawidłowo skalowana przy użyciu skali czasu filmu, wartośćmedia_time
jest teraz prawidłowo skalowana przy użyciu skali czasu ścieżki, zgodnie ze standardem formatu MP4 (#1792). - Obsługa nieuporządkowanych klatek w obliczeniach
endIndices
w przypadku plików MP4 z listą edycji (#1797). - Poprawiono analizowanie czasu trwania multimediów w
mdhd
box w plikach MP4, aby obsługiwać wartości-1
(#1819). - Dodano obsługę identyfikowania pola
h263
w plikach MP4 dla wideo H.263 (#1821). - Dodano obsługę formatu pliku multimedialnego ISO Base Media File Format AC-4 Level-4 (#1265).
- Zezwalaj na identyfikowanie przez opcje
- DataSource:
- Aktualizacja
HttpEngineDataSource
, aby umożliwić korzystanie z niej od wersji S extension 7 zamiast od poziomu 34 interfejsu API (#1262). DataSourceContractTest
: Sprawdź, czy funkcjaDataSource.getUri()
zwraca rozwiązany identyfikator URI (zgodnie z dokumentacją). Jeśli różni się od żądanego adresu URI, testy mogą to wskazywać za pomocą nowej metodyDataSourceContractTest.TestResource.Builder.setResolvedUri()
.DataSourceContractTest
: sprawdź, czy funkcjeDataSource.getUri()
igetResponseHeaders()
zwracają wartość „open” po nieudanym wywołaniu funkcjiopen()
(z powodu zasobu „nie znaleziono”) i przed kolejnym wywołaniem funkcjiclose()
.- Zastąpienie
DataSourceContractTest.getNotFoundResources()
umożliwia podklasom testów dostarczanie wielu zasobów „nie znaleziono” oraz dostarczanie dowolnych oczekiwanych nagłówków. Pozwala to odróżnić błąd HTTP 404 (z nagłówkami) od błędu „nie znaleziono serwera” (bez nagłówków).
- Zastąpienie
- Aktualizacja
- Dźwięk:
- automatycznie konfigurować metadane głośności CTA-2075 w kodeku, jeśli są one obecne w multimediach;
- Zapewnij płynne zmniejszanie głośności podczas przewijania.
- Naprawiono trzaski, które mogą występować podczas przewijania.
- Naprawiono błąd kumulacji obcinania w algorytmie rozciągania czasu/zmiany wysokości dźwięku Sonic.
- Naprawiono błąd w
SpeedChangingAudioProcessor
, który powodował utratę klatek wyjściowych.
- Film:
MediaCodecVideoRenderer
nie dekoduje próbek, które nie są renderowane ani używane jako odniesienie przez inne próbki.- W przypadku interfejsu API w wersji 35 i nowszych
MediaCodecAdapter
może teraz otrzymywaćnull
Surface
wconfigure
i wywoływać nową metodędetachOutputSurface
w celu usunięcia wcześniej ustawionegoSurface
, jeśli kodek to obsługuje (MediaCodecInfo.detachedSurfaceSupported
). - Podczas przetwarzania
onOutputFormatChanged
używaj podanych wartości współczynnika proporcji piksela, jeśli są dostępneonOutputFormatChanged
(#1371).MediaCodecAdapter
- Dodano obejście problemu z urządzeniem Galaxy Tab S7 FE, który powoduje, że bezpieczne strumienie H264 o częstotliwości 60 kl./s są oznaczane jako nieobsługiwane (#1619).
- Dodano obejście problemu z kodekami, które po ostatniej próbce nie zwracają sygnału końca strumienia.
- Tekst:
- Dodaj niestandardowy tag
VoiceSpan
i wypełnij go dla zakresów głosu WebVTT (#1632). - Zadbaj o to, aby napisy WebVTT w HLS z bardzo dużymi sygnaturami czasowymi (które przekraczają 64-bitową wartość
long
, gdy są reprezentowane jako mikrosekundy i pomnożone przez90,000
podstawę czasu MPEG) były wyświetlane (#1763). - Obsługa napisów CEA-608 w treściach Dolby Vision (#1820).
- Naprawiono zawieszanie się odtwarzania w przypadku strumieni DASH z wieloma okresami, gdy włączone są napisy CEA-608 (#1863).
- Dodaj niestandardowy tag
- 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 zewnętrznymi bibliotekami wczytywania obrazów, takimi jak Glide czy Coil.
- Dodaj
- DataSource:
- Dodano
FileDescriptorDataSource
, nowyDataSource
, który może służyć do odczytywania danych zFileDescriptor
(#3757).
- Dodano
- Skutek:
- Dodano obejście
DefaultVideoFrameProcessor
w przypadku niewielkiego skalowaniaSurfaceTexture
.SurfaceTexture
może obejmować niewielkie skalowanie, które odcina 1-tekselową obwódkę wokół krawędzi przyciętego bufora. Zostało to poprawione, aby dane wyjściowe były bliższe oczekiwanym. - Przyspiesz
DefaultVideoFrameProcessor.queueInputBitmap()
Dzięki temu eksportowanie obrazów do filmów za pomocąTransformer
jest szybsze.
- Dodano obejście
- Rozszerzenie IMA:
- Naprawiono błąd, który powodował, że wyczyszczenie playlisty mogło spowodować wystąpienie znaku
ArrayIndexOutOfBoundsException
wImaServerSideAdInsertionMediaSource
. - Naprawiono błąd, w którym strumienie DAI wstawiane po stronie serwera bez reklamy przed filmem mogły powodować błąd
ArrayIndexOutOfBoundsException
podczas odtwarzania po ostatniej reklamie w trakcie filmu (#1741).
- Naprawiono błąd, który powodował, że wyczyszczenie playlisty mogło spowodować wystąpienie znaku
- Sesja:
- Dodaj
MediaButtonReceiver.shouldStartForegroundService(Intent)
, aby umożliwić aplikacjom pomijanie polecenia odtwarzania przychodzącego w celu wznowienia odtwarzania przez zastąpienie tej metody. Domyślnie usługa jest zawsze uruchomiona i nie można zatrzymać odtwarzania bez spowodowania awarii usługi z błędemForegroundServiceDidNotStartInTimeException
(#1528). - Naprawiliśmy błąd, który powodował, że niestandardowe polecenia wysyłane z
MediaBrowser
były przekazywane doMediaSessionCompat.Callback
zamiast do wariantuMediaBrowserServiceCompat
metody, gdy urządzenie było połączone z usługą starszego typu. Uniemożliwiało to otrzymanie przezMediaBrowser
rzeczywistej wartości zwrotnej wysłanej przez starszą usługę (#1474). - Obsługa wyjątku
IllegalArgumentException
zgłaszanego przez urządzenia niektórych producentów podczas ustawiania odbiornika transmisji dla intencji przycisku multimediów (#1730). - Dodaj przyciski poleceń do elementów multimedialnych. Spowoduje to dodanie interfejsu Media3 API dla tego, co było znane jako
Custom browse actions
, z biblioteką starszego typuMediaBrowserCompat
. Pamiętaj, że w przypadku elementów multimedialnych przyciski poleceń Media3 są dostępne zarówno w przypadkuMediaBrowser
, jak iMediaController
. Zobacz Niestandardowe działania przeglądania w AAOS. - Naprawiliśmy błąd, który powodował, że kontroler Media3 czasami nie mógł zezwolić aplikacji sesji na uruchomienie usługi działającej na pierwszym planie po wysłaniu żądania
play()
. - Ogranicz
CommandButton.Builder.setIconUri
tak, aby akceptował tylko identyfikatory URI treści. - Przekazywanie wskazówek dotyczących połączenia z przeglądarki Media3 do początkowego
MediaBrowserCompat
podczas łączenia się ze starszymMediaBrowserCompat
. Usługa może odbierać wskazówki dotyczące połączenia przekazywane jako wskazówki główne przy pierwszym wywołaniu funkcjionGetRoot()
. - Rozwiązanie problemu polegającego na tym, że serwer
MediaBrowser
połączony z usługą starszej przeglądarki nie otrzymywał błędu wysłanego przez usługę po zasubskrybowaniu przez przeglądarkę serweraparentid
. - Poprawiliśmy działanie interoperacyjności, aby przeglądarka Media3 połączona ze starszym interfejsem
MediaBrowserService
nie wysyłała 2 razy prośby o elementy podrzędne interfejsuparentId
podczas subskrybowania elementu nadrzędnego.
- Dodaj
- UI:
- Wprowadź obejście problemu z rozciągniętym lub przyciętym filmem w
PlayerView
-in-Compose-AndroidView
, ponieważ występują problemy z przejściami udostępnionymi opartymi na XML. Aplikacje korzystające zPlayerView
wewnątrzAndroidView
muszą wywoływaćPlayerView.setEnableComposeSurfaceSyncWorkaround
, aby wyrazić zgodę na udział w programie (#1237,#1594). - Dodaj
setFullscreenButtonState
doPlayerView
, aby umożliwić aktualizowanie ikony przycisku pełnego ekranu na żądanie, tj. poza pasmem i nie w reakcji na kliknięcie (#1590, #184). - Naprawiono błąd polegający na tym, że opcja „Brak” w wyborze tekstu nie działała, jeśli istniały zdefiniowane przez aplikację preferencje wyboru ścieżki tekstowej.
- Wprowadź obejście problemu z rozciągniętym lub przyciętym filmem w
- Rozszerzenie DASH:
- Dodano obsługę okresów rozpoczynających się w środku segmentu (#1440).
- Rozszerzenie Smooth Streaming:
- Naprawiono błąd
Bad magic number for Bundle
podczas odtwarzania strumieni SmoothStreaming ze ś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, a także w formacie 5.1 z przestrzennym dźwiękiem i opcjonalnym śledzeniem ruchów głowy, ale odtwarzanie binauralne nie jest obecnie dostępne.
- Dodano obsługę stron 16 KB w przypadku rozszerzeń dekodera na 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 CastSession, co umożliwia aplikacji wysyłającej wznowienie odtwarzania lokalnego po rozłączeniu.
- Wypełnij pole
DeviceInfo
w CastPlayer, gdy podano wartośćContext
. Umożliwia to połączenieMediaSession
zRoutingSession
, co jest niezbędne do zintegrowania przełącznika wyjścia (#1056).
- Narzędzia testowe:
DataSourceContractTest
obejmuje teraz testy weryfikujące:- Strumień wejściowy
read position
został zaktualizowany. - Bufor wyjściowy
offset
jest stosowany prawidłowo.
- Strumień wejściowy
- Aplikacja w wersji demonstracyjnej
- Rozwiązanie problemu z wyciekami pamięci w krótkiej aplikacji demonstracyjnej (#1839).
- Usuń symbole, które nie są już używane:
- Usuń wycofane
Player.hasPrevious
,Player.hasPreviousWindow()
. Zamiast niej używaj zasadyPlayer.hasPreviousMediaItem()
. - Usuń wycofaną metodę
Player.previous()
. Zamiast niej używaj właściwościPlayer.seekToPreviousMediaItem()
. - Usuń wycofaną metodę
DrmSessionEventListener.onDrmSessionAcquired
. - Usuń wycofane konstruktory
DefaultEncoderFactory
. Zamiast niej używaj właściwościDefaultEncoderFactory.Builder
.
- Usuń wycofane
Wersja 1.5.0-rc02
19 listopada 2024 r.
Używaj stabilnej wersji 1.5.0.
Wersja 1.5.0-rc01
13 listopada 2024 r.
Używaj stabilnej wersji 1.5.0.
Wersja 1.5.0-beta01
30 października 2024 r.
Używaj stabilnej wersji 1.5.0.
Wersja 1.5.0-alpha01
10 września 2024 r.
Używaj stabilnej wersji 1.5.0.
Wersja 1.4.0
Wersja 1.4.1
27 sierpnia 2024 r.
Zostanie wycofaneandroidx.media3:media3-*:1.4.1
Wersja 1.4.1 zawiera te zmiany.
- ExoPlayer:
- Ekstraktory:
- MP3: naprawiono błąd
Searched too many bytes
przez prawidłowe ignorowanie końcowych danych innych niż MP3 na podstawie pola długości w ramceInfo
(#1480).
- MP3: naprawiono błąd
- Tekst:
- TTML: poprawiono obsługę wartości procentowych
tts:fontSize
, aby zapewnić ich prawidłowe dziedziczenie z węzłów nadrzędnych z wartościami procentowymitts:fontSize
. - Naprawiono błąd
IndexOutOfBoundsException
wLegacySubtitleUtil
spowodowany nieprawidłową obsługą przypadku, w którym żądana godzina rozpoczęcia danych wyjściowych jest większa lub równa końcowej godzinie zdarzenia wSubtitle
(#1516).
- TTML: poprawiono 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 API 31 i nowszymi, które odtwarzają treści Widevine L1. Ten błąd jest spowodowany niepełną implementacją metodyMediaDrm.requiresSecureDecoder
(#1603) w ramach platformy.
- Naprawiono błąd
- Skutek:
- Dodaj metodę
release()
doGlObjectsProvider
.
- Dodaj metodę
- Sesja:
- Rozszerzenie RTSP:
- Pomiń nieprawidłowe opisy multimediów podczas analizowania SDP (#1087).
Wersja 1.4.0
25 lipca 2024 r.
Zostanie wycofaneandroidx.media3:media3-*:1.4.0
Wersja 1.4.0 zawiera te zmiany.
- Biblioteka wspólna:
- Przekazywanie domniemanych wywołań funkcji no-op seek do chronionych metod
BasePlayer.seekTo()
iSimpleBasePlayer.handleSeek()
zamiast ich ignorowania. Jeśli implementujesz te metody w odtwarzaczu niestandardowym, może być konieczne obsłużenie tych dodatkowych wywołań za pomocąmediaItemIndex == C.INDEX_UNSET
. - Usunięcie zależności kompilacji od ulepszonego odcukrzania kodu Java 8 (#1312).
- Upewnij się, że czas trwania przekazany do
MediaItem.Builder.setImageDurationMs()
jest ignorowany w przypadku elementuMediaItem
innego niż obraz (zgodnie z dokumentacją). - Dodaj
Format.customData
, aby przechowywać dostarczone przez aplikację niestandardowe informacje o instancjachFormat
.
- Przekazywanie domniemanych wywołań funkcji no-op seek do chronionych metod
- ExoPlayer:
- Dodaj
BasePreloadManager
, które koordynują wstępne wczytywanie wielu źródeł na podstawie priorytetów określonych przez ichrankingData
. Dostosowywanie jest możliwe przez rozszerzenie tej klasy. DodajDefaultPreloadManager
, który używaPreloadMediaSource
do wstępnego wczytywania do pamięci próbek multimediów ze źródeł i używa liczby całkowitejrankingData
, która wskazuje indeks elementu w interfejsie. - Dodaj
PlayerId
do większości metodLoadControl
, aby umożliwić implementacjomLoadControl
obsługę wielu graczy. - Usuń
Buffer.isDecodeOnly()
iC.BUFFER_FLAG_DECODE_ONLY
. Nie musisz ustawiać tej flagi, ponieważ renderery i dekodery będą pomijać bufory na podstawie sygnatury czasowej. Niestandardowe implementacjeRenderer
powinny sprawdzać, czy czas buforowania wynosi co najmniejBaseRenderer.getLastResetPositionUs()
, aby zdecydować, czy wyświetlić próbkę. Niestandardowe implementacjeSimpleDecoder
mogą w razie potrzeby sprawdzaćisAtLeastOutputStartTimeUs()
inne bufory lub oznaczać je symbolemDecoderOutputBuffer.shouldBeSkipped
, aby je pominąć. - Zezwól na zwracanie wartości null przez
TargetPreloadStatusControl.getTargetPreloadStatus(T)
, 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 wstrzymania, zachowując instancję menedżera wstępnego wczytywania. - Dodaj
ExoPlayer.setPriority()
(iBuilder.setPriority()
), aby zdefiniować wartość priorytetu używaną wPriorityTaskManager
i w przypadku ważności MediaCodec od interfejsu API w wersji 35. - Rozwiązaliśmy problem z aktualizacją czasu ostatniego ponownego buforowania, który powodował nieprawidłowy klucz
bs
(brak bufora) w CMCD (#1124). - Dodaj znak
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
, aby wskazać, że źródło zostało wczytane do końca. Umożliwia to implementacjomDefaultPreloadManager
i niestandardowymPreloadMediaSource.PreloadControl
wstępne wczytanie następnego źródła lub podjęcie innych działań. - Naprawiono błąd, który powodował, że pomijanie ciszy na końcu elementów mogło wywoływać wyjątek odtwarzania.
- Dodaj
clear
doPreloadMediaSource
, aby odrzucić okres wstępnego wczytywania. - 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. - Zezwól na wczytywanie reklam przed filmem przed zakończeniem przygotowywania początkowych treści multimedialnych (#1358).
AdsMediaSource
- Naprawiliśmy błąd polegający na tym, że odtwarzanie przenosiło się do
STATE_ENDED
podczas ponownego przygotowywania transmisji na żywo DASH z wieloma okresami po usunięciu z pliku manifestu pierwotnego okresu. - Zmień nazwę
onTimelineRefreshed()
naonSourcePrepared()
ionPrepared()
naonTracksSelected()
wPreloadMediaSource.PreloadControl
. Zmień też odpowiednio nazwy IntDefs wDefaultPreloadManager.Stage
. - Dodano eksperymentalną obsługę dynamicznego planowania, aby lepiej dopasowywać pracę do cykli wybudzania procesora i opóźniać wybudzanie do momentu, w którym renderery mogą kontynuować działanie.
Możesz włączyć tę funkcję za pomocą parametru
experimentalSetDynamicSchedulingEnabled()
podczas konfigurowania instancji ExoPlayera. - Dodaj
Renderer.getDurationToProgressUs()
.Renderer
może zaimplementować tę metodę, aby zwrócić do ExoPlayera czas, o który odtwarzanie musi się przesunąć, aby renderowanie mogło się dalej odbywać. JeśliExoPlayer
jest ustawiony naexperimentalSetDynamicSchedulingEnabled()
,ExoPlayer
wywoła tę metodę podczas obliczania czasu potrzebnego na zaplanowanie zadania. - Dodaj
MediaCodecAdapter#OnBufferAvailableListener
, aby otrzymywać alerty, gdy bufory wejściowe i wyjściowe są dostępne do użycia przezMediaCodecRenderer
.MediaCodecRenderer
będzie sygnalizowaćExoPlayer
podczas odbierania tych wywołań zwrotnych, a jeśliExoPlayer
jest ustawiony zexperimentalSetDynamicSchedulingEnabled()
,ExoPlayer
zaplanuje pętlę roboczą, ponieważ renderery mogą robić postępy. - Zamiast poszczególnych parametrów używaj klasy danych dla metod
LoadControl
. - Dodaj
ExoPlayer.isReleased()
, aby sprawdzić, czy wywołano funkcjęExoplayer.release()
. - Dodaj
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()
, aby skonfigurować maksymalną pozycję, do którejseekToPrevious()
szuka poprzedniego elementu (#1425). - Naprawiono niektóre niespójności związane z ustawianiem ostrości dźwięku, np. brak zgłaszania pełnej lub tymczasowej utraty ostrości, gdy odtwarzacz jest wstrzymany (#1436).
- Naprawiono potencjalne
IndexOutOfBoundsException
spowodowane przez ekstraktory zgłaszające dodatkowe ścieżki po początkowym etapie przygotowania (#1476). Effects
wExoPlayer.setVideoEffect()
otrzyma sygnatury czasowe z usuniętym przesunięciem renderowania (#1098).- Naprawiliśmy potencjalny problem z
IllegalArgumentException
podczas obsługi błędu odtwarzacza, który wystąpił podczas odczytywania kolejnego elementu na playliście (#1483).
- Dodaj
- Transformer:
- Dodaj znaki
audioConversionProcess
ivideoConversionProcess
doExportResult
, aby wskazać, jak powstała odpowiednia ścieżka w pliku wyjściowym. - Zrelaksuj sprawdzanie poziomu optymalizacji przycinania H.264.
- Dodano obsługę przełączania między nośnikami wejściowymi SDR i HDR w sekwencji.
- Dodanie obsługi efektów audio na poziomie kompozycji.
- Dodaliśmy obsługę transkodowania obrazów ultra HDR na filmy HDR.
- Rozwiązaliśmy problem, który powodował, że po zresetowaniu i ponownym użyciu
DefaultAudioMixer
nie podawał prawidłowej liczby bajtów. - Obejście błędu dekodera, w którym liczba kanałów audio była ograniczona do stereo podczas obsługi danych wejściowych PCM.
- Podczas wybierania ścieżek w
ExoPlayerAssetLoader
zignoruj ograniczenia dotyczące liczby kanałów audio, ponieważ mają one zastosowanie tylko w przypadku 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).
- Dostosuj czas trwania ścieżki audio w
AudioGraphInput
, aby poprawić synchronizację AV. - Usuń pole
ExportResult.processedInputs
. Jeśli używasz tego pola do podawania szczegółów kodeka, użyj polaDefaultDecoderFactory.listener
. W przypadku wyjątku dotyczącego kodeka szczegóły kodeka będą dostępne wExportException.codecInfo
.
- Dodaj znaki
- Ekstraktory:
- MPEG-TS: wprowadź zmianę, upewniając się, że ostatnia klatka jest renderowana przez przekazanie ostatniej jednostki dostępu strumienia do kolejki próbek (#7909). Wprowadzono poprawki rozwiązujące problemy, które pojawiły się w strumieniach HLS zawierających tylko klatki I(#1150) i strumieniach HLS w formacie H.262 (#1126).
- MP3: preferuj rozmiar danych z ramki
Info
zamiast rozmiaru podanego przez strumień bazowy (np. rozmiar pliku lub nagłówek HTTPContent-Length
). Pomaga to wykluczyć dane z nieodtwarzalnych zwiastunów (np. okładki albumów) z obliczeń dotyczących wyszukiwania ze stałą szybkością transmisji, co zwiększa dokładność wyszukiwania (#1376). - MP3: używaj liczby klatek i innych danych w klatce
Info
(jeśli występuje) do obliczania średniej szybkości transmisji w przypadku wyszukiwania przy stałej szybkości transmisji, zamiast ekstrapolować z szybkości transmisji klatki po klatceInfo
, która może być sztucznie mała, np. klatkaPCUT
(#1376). - Poprawiono wyodrębnianie formatu audio PCM w kontenerach AVI.
- Dźwięk:
- Naprawiono atrybuty kodowania DTS:X Profile 2 w przypadku odtwarzania passthrough (#1299).
- W przypadku odtwarzania przeniesionego zresetuj pole śledzenia zakończenia strumienia w
DefaultAudioSink
przed wywołaniemAudioTrack.stop()
, abyAudioTrack.StreamEventCallback#onPresentationEnded
prawidłowo określał, kiedy wszystkie oczekujące dane zostały odtworzone. - Naprawiono błąd w
SilenceSkippingAudioProcessor
, w którym przejścia między różnymi formatami audio (np. stereo na mono) mogą powodować zgłaszanie wyjątku przez procesor (#1352). - Zaimplementuj
MediaCodecAudioRenderer.getDurationToProgressUs()
, aby odtwarzacz ExoPlayer dynamicznie planował główną pętlę roboczą na czas, w którym komponent MediaCodecAudioRenderer może kontynuować działanie.
- Film:
- Rozwiązanie problemu polegającego na tym, że
Listener.onRenderedFirstFrame()
pojawia się zbyt wcześnie podczas przełączania urządzeń w trakcie odtwarzania. - Poprawiono logikę rezerwową dekodera Dolby Vision, aby w razie potrzeby używać zgodnego dekodera AV1 (#1389).
- Rozwiązanie wyjątku kodeka, który może być spowodowany włączeniem renderowania wideo w trakcie odtwarzania.
- Rozwiązanie problemu polegającego na tym, że
- Tekst:
- Rozwiązaliśmy problem, który powodował pomijanie napisów rozpoczynających się przed pozycją wyszukiwania. Ten problem pojawił się dopiero w Media3 w wersji 1.4.0-alpha01.
- Zmień domyślne zachowanie analizowania napisów, aby odbywało się podczas wyodrębniania, a nie renderowania (różnicę między wyodrębnianiem a renderowaniem znajdziesz na diagramie architektury ExoPlayera).
- Tę zmianę można zastąpić, wywołując oba
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)
iTextRenderer.experimentalSetLegacyDecodingEnabled(true)
. Informacje o tym, jak połączyć te komponenty z instancjąExoPlayer
, znajdziesz w dokumentacji dotyczącej dostosowywania. Te metody (i cała obsługa starszego dekodowania napisów) zostaną usunięte w przyszłej wersji. - Aplikacje z niestandardowymi implementacjami
SubtitleDecoder
muszą je zaktualizować, aby zamiast nich implementowaćSubtitleParser
(aSubtitleParser.Factory
zamiastSubtitleDecoderFactory
).
- Tę zmianę można zastąpić, wywołując oba
- PGS: poprawiono dekodowanie długości serii, aby rozwiązać problem z
0
jako indeksem koloru zamiast dosłownej wartości koloru (#1367). - CEA-708: ignoruj wartość
rowLock
. Specyfikacja CEA-708-E S-2023 mówi, że zarównorowLock
, jak icolumnLock
powinny być traktowane jako prawdziwe, niezależnie od wartości w strumieniu (obsługacolumnLock
nie jest zaimplementowana, więc w praktyce zawsze przyjmuje się wartość false).- Ta informacja została pierwotnie uwzględniona w informacjach o wersji
1.3.0-alpha01
, ale zmiana została przypadkowo cofnięta przed wydaniem wersji1.3.0-rc01
. Problem został już rozwiązany, więc zmiana jest ponownie widoczna.
- Ta informacja została pierwotnie uwzględniona w informacjach o wersji
- CEA-708: unikaj dodawania zduplikowanych znaków nowego wiersza przez naiwną obsługę polecenia „ustaw lokalizację pióra” w ExoPlayerze (#1315).
- Naprawiono
IllegalArgumentException
zLegacySubtitleUtil
, gdy przykładowy plik napisów WebVTT nie zawierał wskazówek, np. w ramach strumienia DASH (#1516).
- Metadane:
- Popraw mapowanie tagów sortowania MP4 na tagi ID3. Wcześniej tagi MP4 „album sort” (
soal
), „artist sort” (soar
) i „album artist sort” (soaa
) były nieprawidłowo mapowane na tagi ID3TSO2
,TSOA
iTSOP
(#1302). - Naprawiono odczytywanie numerycznych tagów
gnre
(gatunek) itmpo
(tempo) w plikach MP4 (/iTunes), gdy wartość ma więcej niż 1 bajt. - Przekazywanie ramki ID3
TCON
doMediaMetadata.genre
(#1305).
- Popraw mapowanie tagów sortowania MP4 na tagi ID3. Wcześniej tagi MP4 „album sort” (
- Obraz:
- Dodano obsługę siatek miniatur DASH w formacie innym niż kwadratowy (#1300).
- Dodanie obsługi formatu AVIF w przypadku interfejsu API w wersji 34 lub nowszej.
- Zezwól na
null
jako parametr dlaExoPlayer.setImageOutput()
, aby wyczyścić wcześniej ustawiony parametrImageOutput
.
- DataSource:
- Zaimplementuj obsługę identyfikatorów URI zasobów pierwotnych
android.resource://package/id
, gdziepackage
jest inny niż pakiet bieżącej aplikacji. Nie było to wcześniej udokumentowane, ale jest to bardziej wydajny sposób uzyskiwania dostępu do zasobów w innym pakiecie niż za pomocą nazwy. - Sprawdzaj, czy
url
nie ma wartości null w konstruktorachDataSpec
. Ten parametr został już oznaczony jako niepusty. - Umożliwia
ByteArrayDataSource
przekształcanie identyfikatora URI w tablicę bajtów podczasopen()
zamiast zakodowania na stałe w czasie tworzenia (#1405).
- Zaimplementuj obsługę identyfikatorów URI zasobów pierwotnych
- DRM:
- Zezwalaj na ustawianie
LoadErrorHandlingPolicy
w przypadkuDefaultDrmSessionManagerProvider
(#1271).
- Zezwalaj na ustawianie
- Skutek:
- Obsługa wielu zmian szybkości w ramach tego samego
EditedMediaItem
lubComposition
wSpeedChangeEffect
. - Obsługa danych wyjściowych HLG i PQ z danych wejściowych bitmapy ultra HDR.
- Dodaliśmy obsługę EGL_GL_COLORSPACE_BT2020_HLG_EXT, co poprawia dane wyjściowe HLG w przypadku powierzchni w funkcjach ExoPlayer.setVideoEffect i Transformer.Debug SurfaceView.
- Zaktualizuj implementację macierzy nakładki, aby była zgodna z dokumentacją, zamieniając wartości x i y zastosowane w
setOverlayFrameAnchor()
. Jeśli używaszOverlaySettings.Builder.setOverlayFrameAnchor()
, zamień wartości x i y, mnożąc je przez-1
. - Naprawiono błąd, w którym
TimestampWrapper
ulegał awarii podczas używania zExoPlayer#setVideoEffects
(#821). - Zmień domyślną przestrzeń roboczą kolorów SDR z kolorów liniowych na elektryczne wideo SDR BT.709. Udostępnij też trzecią opcję, która pozwoli zachować oryginalną przestrzeń kolorów.
- Zezwól na definiowanie nieokreślonej kolejności osi Z w przypadku EditedMediaItemSequences (#1055).
- Zachowaj spójny zakres luminancji w różnych treściach HDR (korzysta z zakresu HLG).
- Dodanie obsługi nakładek Ultra HDR (bitmapowych) na treści HDR.
- Zezwalaj na używanie efektów
SeparableConvolution
przed API 26. - Usuń nieużywane
OverlaySettings.useHdr
, ponieważ zakres dynamiczny nakładki i ramki musi być taki sam. - Dodaliśmy obsługę HDR w przypadku
TextOverlay
. Jasność nakładki tekstowej można dostosować za pomocą parametruOverlaySettings.Builder.setHdrLuminanceMultiplier()
.
- Obsługa wielu zmian szybkości w ramach tego samego
- Rozszerzenie IMA:
- Promowanie interfejsu API wymaganego do odtwarzania w aplikacjach strumieni reklam DAI do wersji stabilnej.
- Dodaj
replaceAdTagParameters(Map <String, String>)
doImaServerSideAdInsertionMediaSource.AdLoader
, co umożliwi zastępowanie parametrów tagu reklamy w czasie działania. - Naprawiono błąd polegający na tym, że funkcja
VideoAdPlayer.VideoAdPlayerCallback.onError()
nie była wywoływana, gdy podczas odtwarzania reklamy wystąpił błąd odtwarzacza (#1334). - Zaktualizowano pakiet IMA SDK do wersji 3.33.0, aby naprawić błąd
NullPointerException
podczas korzystania zdata://
adresów URI tagów reklam (#700).
- Sesja:
- Zmień domyślną wartość
CommandButton.enabled
natrue
i upewnij się, że wartość może pozostać fałszywa w przypadku kontrolerów, nawet jeśli powiązane polecenie jest dostępne. - Dodaj stałe ikony dla elementu
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 wygodnie umożliwia wstrzymanie odtwarzania wszystkich sesji i wywołaniestopSelf()
, aby zakończyć cykl życiaMediaSessionService
. - Zastąp
MediaSessionService.onTaskRemoved(Intent)
, aby zapewnić bezpieczną implementację domyślną, która utrzymuje usługę działającą na pierwszym planie, jeśli odtwarzanie jest w toku, lub zatrzymuje usługę w innych przypadkach. - Ukrywanie paska przewijania w powiadomieniu o multimediach w przypadku transmisji na żywo przez nieustawianie czasu trwania w metadanych sesji platformy (#1256).
- Dopasuj konwersję
MediaMetadata
doMediaDescriptionCompat
, aby używać tej samej preferowanej kolejności i logiki podczas wybierania właściwości metadanych co w przypadku media1. - Dodaj
MediaSession.sendError()
, który umożliwia wysyłanie błędów niekrytycznych do kontrolera Media3. Gdy używasz kontrolera powiadomień (patrzMediaSession.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ć sesje, gdy zakończy się seria interakcji gracza z określonym kontrolerem. - Dodaj
SessionError
i użyj go wSessionResult
iLibraryResult
zamiast kodu błędu, aby podać więcej informacji o błędzie i sposobie jego rozwiązania (jeśli to możliwe). - Opublikuj kod aplikacji testowej kontrolera Media3, której można używać do testowania interakcji z aplikacjami publikującymi sesję multimedialną.
- Przekazywanie dodatkowych informacji przekazanych do
MediaSession[Builder].setSessionExtras()
w Media3 doMediaSession[Builder].setSessionExtras()
w kontrolerze Media1.PlaybackStateCompat.getExtras()
- Mapuj błędy krytyczne i niekrytyczne na sesję platformy i z niej. A
PlaybackException
jest mapowany na stan błędu krytycznegoPlaybackStateCompat
. WiadomośćSessionError
wysłana do kontrolera powiadomień o mediach z parametremMediaSession.sendError(ControllerInfo, SessionError)
jest mapowana na niekrytyczny błąd wPlaybackStateCompat
, co oznacza, że kod i komunikat błędu są ustawione, ale stan sesji platformy pozostaje inny niżSTATE_ERROR
. - Zezwól na ustawianie aktywności sesji dla każdego kontrolera, aby zastąpić globalną aktywność sesji. 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 aktualizować za pomocąMediaSession.setSessionActivity(ControllerInfo, PendingIntent)
. - Poprawiliśmy replikację błędów wywołań funkcji
MediaLibrarySession.Callback
. Replikację błędów można teraz skonfigurować za pomocą parametruMediaLibrarySession.Builder.setLibraryErrorReplicationMode()
, który umożliwia wybór typu błędu lub wyłączenie replikacji błędów (domyślnie jest ona włączona).
- Zmień domyślną wartość
- UI:
- Dodanie obsługi wyświetlania obrazów w
PlayerView
po podłączeniu doExoPlayer
(#1144). - Dodanie możliwości dostosowywania różnych ikon w
PlayerControlView
za pomocą atrybutów XML, aby umożliwić stosowanie różnych elementów rysowalnych w poszczególnych instancjachPlayerControlView
, a nie globalne zastępowanie (#1200).PlayerView
- Obejście błędu platformy powodującego rozciągnięcie lub przycięcie filmu podczas używania elementu
SurfaceView
w komponencieAndroidView
w API 34 (#1237).
- Dodanie obsługi wyświetlania obrazów w
- Pobrane:
- Upewnij się, że
DownloadHelper
nie powoduje wycieku nieopublikowanych instancjiRenderer
, co może ostatecznie doprowadzić do awarii aplikacji z błędemIllegalStateException: Too many receivers, total of 1000, registered for pid
(#1224).
- Upewnij się, że
- Rozszerzenie Cronet:
- Rozwiąż problem
SocketTimeoutException
w sekcjiCronetDataSource
. W niektórych wersjach Croneta żądanie przekazywane przez wywołanie zwrotne nie zawsze jest takie samo. Powoduje to, że wywołanie zwrotne nie jest wykonywane, a żądanie przekracza limit czasu (https://issuetracker.google.com/328442628).
- Rozwiąż problem
- Rozszerzenie HLS:
- Naprawiliśmy błąd, który powodował, że oczekujące próbki EMSG czekające na przerwę były delegowane w
HlsSampleStreamWrapper
z nieprawidłowym przesunięciem, co powodowało błądIndexOutOfBoundsException
lubIllegalArgumentException
(#1002). - Usunięto błąd, który powodował, że playlisty inne niż główne były ciągle przeładowywane w przypadku strumieni LL-HLS (#1240).
- Naprawiono błąd, który powodował, że włączenie CMCD w przypadku HLS z segmentami inicjującymi powodowało wystąpienie wartości
Source Error
iIllegalArgumentException
. - Usunięto błąd, który powodował, że playlisty odtwarzane w tle nie były odświeżane podczas odtwarzania na żywo (#1240).
- Naprawiono błąd, w którym włączenie CMCD w przypadku transmisji na żywo HLS powodowało
ArrayIndexOutOfBoundsException
(#1395).
- Naprawiliśmy błąd, który powodował, że oczekujące próbki EMSG czekające na przerwę były delegowane w
- Rozszerzenie DASH:
- Rozszerzenie Cast:
- Naprawiono błąd, który powodował, że tytuł albumu
MediaQueueItem
był konwertowany na nazwę wykonawcy w elemencie multimedialnym Media3 (#1255).
- Naprawiono błąd, który powodował, że tytuł albumu
- Narzędzia testowe:
- Zaimplementuj funkcje
onInit()
ionRelease()
wFakeRenderer
. - Zmień metody
TestPlayerRunHelper.runUntil()/playUntil()
, aby w przypadku błędów niekrytycznych (np. zgłaszanych doAnalyticsListener.onVideoCodecError()
) zwracały błąd. Aby wyłączyć to działanie, użyj nowego łańcucha metodTestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()
.
- Zaimplementuj funkcje
- Aplikacja demonstracyjna:
- Użyj
DefaultPreloadManager
w wersji demonstracyjnej aplikacji w formie krótkiej. - Umożliwia ustawianie trybu powtarzania za pomocą argumentów
Intent
z wiersza poleceń (#1266). - Używać
HttpEngineDataSource
jakoHttpDataSource
, jeśli jest to obsługiwane przez urządzenie.
- Użyj
- Usuń symbole, które nie są już używane:
- Usuń
CronetDataSourceFactory
. Zamiast niej używaj zasadyCronetDataSource.Factory
. - Usuń niektóre konstruktory
DataSpec
. Zamiast niej używaj zasadyDataSpec.Builder
. - Usuń formę płatności
setContentTypePredicate(Predicate)
z usługDefaultHttpDataSource
,OkHttpDataSource
iCronetDataSource
. Zamiast tego użyj odpowiedniej metody na każdej platformieXXXDataSource.Factory
. - Usuń konstruktory
OkHttpDataSource
iOkHttpDataSourceFactory
. Zamiast niej używaj zasadyOkHttpDataSource.Factory
. - Usuń
PlayerMessage.setHandler(Handler)
. Zamiast niej używaj zasadysetLooper(Looper)
. - Usuń pole
Timeline.Window.isLive
. Zamiast tego użyj metodyisLive()
. - Usuń konstruktory
DefaultHttpDataSource
. Zamiast niej używaj właściwościDefaultHttpDataSource.Factory
. - Usuń
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS
. Zamiast niej używaj właściwościDashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS
. - Usuń
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)
. Zamiast niej używaj zasadyMediaCodecInfo.canReuseCodec(Format, Format)
. - Usuń metodę
DrmSessionManager.DUMMY
igetDummyDrmSessionManager()
. Zamiast niej używaj zasadyDrmSessionManager.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ą wartośćDecoderReuseEvaluation
. - Usuń stałe
RendererSupport.FormatSupport
IntDef iFORMAT_HANDLED
,FORMAT_EXCEEDS_CAPABILITIES
,FORMAT_UNSUPPORTED_DRM
,FORMAT_UNSUPPORTED_SUBTYPE
,FORMAT_UNSUPPORTED_TYPE
. Zamiast tego używaj odpowiednich stałych i adnotacji IntDef wandroidx.media3.common.C
(np.C.FORMAT_HANDLED
). - Usuń interfejs
Bundleable
. Obejmuje to usunięcie wszystkich pól stałychBundleable.Creator<Foo> CREATOR
. Zamiast tego dzwoniący powinni używać metodBundle toBundle()
istatic Foo fromBundle(Bundle)
w przypadku każdego typu.
- Usuń
Wersja 1.4.0-rc01
10 lipca 2024 r.
Używaj stabilnej wersji 1.4.0.
Wersja 1.4.0-beta01
26 czerwca 2024 r.
Używaj stabilnej wersji 1.4.0.
Wersja 1.4.0-alpha02
7 czerwca 2024 r.
Używaj stabilnej wersji 1.4.0.
Wersja 1.4.0-alpha01
17 kwietnia 2024 r.
Używaj stabilnej wersji 1.4.0.
Wersja 1.3.0
Wersja 1.3.1
11 kwietnia 2024 r.
Zostanie wycofaneandroidx.media3:media3-*:1.3.1
Wersja 1.3.1 zawiera te zmiany.
- Biblioteka wspólna:
- Dodaj
Format.labels
, aby zezwolić na zlokalizowane lub inne alternatywne etykiety.
- Dodaj
- ExoPlayer:
- Rozwiązaliśmy problem polegający na tym, że
PreloadMediaPeriod
nie może zachować strumieni, gdy jest ponownie wstępnie wczytywany. - Zastosuj odpowiedni atrybut
TrackSelectionResult
do okresu odtwarzania podczas ponownego wyboru ścieżki. - Uruchamiaj renderery z włączonym wczesnym renderowaniem dopiero po przesunięciu okresu odtwarzania podczas przechodzenia między elementami multimedialnymi (#1017).
- Dodanie brakującego typu zwracanego do reguły ProGuard
-keepclasseswithmembers
dlaDefaultVideoFrameProcessor.Factory.Builder.build()
(#1187).
- Rozwiązaliśmy problem polegający na tym, że
- Transformer:
- Dodano obejście wyjątku zgłaszanego z powodu braku obsługi
MediaMuxer
ujemnych sygnatur czasowych prezentacji przed interfejsem API w wersji 30.
- Dodano obejście wyjątku zgłaszanego z powodu braku obsługi
- Wybór ścieżki:
DefaultTrackSelector
: preferuj ścieżki wideo z „rozsądną” liczbą klatek na sekundę (>=10 klatek na sekundę) od tych z niższą lub nieustawioną liczbą klatek na sekundę. Dzięki temu odtwarzacz wybierze „prawdziwą” ścieżkę wideo w plikach MP4 wyodrębnionych z ruchomych zdjęć, które mogą zawierać 2 ścieżki HEVC, z których jedna ma wyższą rozdzielczość, ale bardzo małą liczbę klatek (#1051).
- Ekstraktory:
- Rozwiązaliśmy problem polegający na tym, że podczas odczytywania nieparzystych fragmentów z plików WAV nie pomijano dopełnienia (#1117).
- MP3: wypełnij
Format.averageBitrate
na podstawie ramek metadanych, takich jakXING
iVBRI
. - MPEG-TS: wycofanie zmiany, która miała zapewnić renderowanie ostatniej klatki przez przekazanie ostatniej jednostki dostępu strumienia do kolejki próbek (#7909). Wynika to ze zmiany, która powoduje nowe problemy ze strumieniami HLS zawierającymi tylko klatki I (#1150) i strumieniami HLS w formacie H.262 (#1126).
- Dźwięk:
- Zezwól na przywrócenie renderowania przez wyłączenie odciążania, jeśli nie uda się zainicjować ścieżki audio w trybie odciążania.
- Film:
- Dodano obejście problemu z urządzeniami Galaxy Tab S7 FE, Chromecast z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie H265 o częstotliwości 60 klatek na sekundę są oznaczane jako nieobsługiwane.
- Dodano obejście, które zapewnia, że pierwsza klatka jest zawsze renderowana podczas tunelowania, nawet jeśli urządzenie nie robi tego automatycznie, jak wymaga tego interfejs API (#1169). (#966).
- Rozwiązanie problemu, w którym obsługa informacji o kolorach HDR powoduje nieprawidłowe działanie kodeka i uniemożliwia adaptacyjne przełączanie formatów w przypadku ścieżek wideo SDR (#1158).
- Tekst:
- WebVTT: zapobieganie tworzeniu przez bezpośrednio następujące po sobie wskazówki fałszywych dodatkowych instancji
CuesWithTiming
zWebvttParser.parse
(#1177).
- WebVTT: zapobieganie tworzeniu przez bezpośrednio następujące po sobie wskazówki fałszywych dodatkowych instancji
- DRM:
- Obejście problemu z błędem
NoSuchMethodError
, który może być zgłaszany przez platformęMediaDrm
zamiastResourceBusyException
lubNotProvisionedException
na niektórych urządzeniach z Androidem 14 (#1145).
- Obejście problemu z błędem
- Skutek:
- Ulepszone mapowanie tonów PQ na SDR dzięki konwersji przestrzeni kolorów.
- Sesja:
- UI:
- W przypadku, gdy
Locale
nie może zidentyfikować nazwy wyświetlanej, użyj nazwy języka ścieżki audio (#988).
- W przypadku, gdy
- 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 (i-tagów) podczas analizowania SDP (#1087).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Domyślnie wyłącz rozszerzenie MIDI jako zależność lokalną, ponieważ wymaga ono 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
Zostanie wycofaneandroidx.media3:media3-*:1.3.0
Wersja 1.3.0 zawiera te zmiany.
- Biblioteka wspólna:
- Wdrażanie obsługi identyfikatorów URI zasobów
android.resource://package/[type/]name
raw, w którychpackage
różni się od pakietu bieżącej aplikacji. Zawsze było to udokumentowane jako działające, ale do tej pory nie było prawidłowo zaimplementowane. - Normalizuj typy MIME ustawione przez kod aplikacji lub odczytane z multimediów, aby były w całości zapisane małymi literami.
- Określaj reklamy za pomocą pełnego pola
MediaItem
zamiast pojedynczego polaUri
w poluAdPlaybackState
. - Zwiększ wartość
minSdk
do 19 (Android KitKat). Jest to zgodne ze wszystkimi innymi bibliotekami AndroidX i jest wymagane, abyśmy mogli przejść na najnowsze wersje naszych zależności AndroidX. - Wypełnij oba pola
artworkUri
iartworkData
wMediaMetadata.Builder.populate(MediaMetadata)
, jeśli co najmniej jedno z nich nie ma wartości null (#964).
- Wdrażanie obsługi identyfikatorów URI zasobów
- ExoPlayer:
- Dodaj
PreloadMediaSource
iPreloadMediaPeriod
, które umożliwiają aplikacjom wstępne wczytywanie źródła treści multimedialnych w określonej pozycji początkowej przed odtwarzaniem.PreloadMediaSource
przygotowuje źródło multimediów do otrzymaniaTimeline
, przygotowuje i buforuje okres w podanej pozycji początkowej, wybiera ścieżki i wczytuje dane multimedialne dla tego okresu. Aplikacje kontrolują postęp wstępnego wczytywania, implementującPreloadMediaSource.PreloadControl
i ustawiając wstępnie wczytane źródło w odtwarzaczu do odtwarzania. - Dodaj
ExoPlayer.setImageOutput
, które umożliwia aplikacjom ustawianieImageRenderer.ImageOutput
. DefaultRenderersFactory
domyślnie udostępnia odtwarzaczowiImageRenderer
z wartościami nullImageOutput
iImageDecoder.Factory.DEFAULT
.- Emituj zdarzenie
Player.Listener.onPositionDiscontinuity
, gdy pominięto ciszę (#765). - Dodano eksperymentalną obsługę analizowania napisów podczas wyodrębniania. Możesz to zrobić za pomocą
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
. - Obsługuj adaptacyjne źródła multimediów za pomocą
PreloadMediaSource
. - Zaimplementuj
HttpEngineDataSource
, czyliHttpDataSource
za pomocą interfejsu HttpEngine API. - Zapobiegaj tworzeniu podklas
CompositeSequenceableLoader
. Ten komponent był wcześniej rozszerzalny, ale nigdy nie został w bibliotece podzielony na podklasy. Dostosowywanie można przeprowadzić, opakowując instancję za pomocą wzorca dekoratora i wdrażając niestandardowy elementCompositeSequenceableLoaderFactory
. - Rozwiązaliśmy problem polegający na tym, że powtórzenie tego samego czasu powodowało wyczyszczenie metadanych tego elementu (#1007).
- Zmień nazwy metod
experimentalSetSubtitleParserFactory
naBundledChunkExtractor.Factory
iDefaultHlsExtractorFactory
nasetSubtitleParserFactory
oraz zablokuj przekazywanienull
. Użyj nowych metodexperimentalParseSubtitlesDuringExtraction(boolean)
, aby kontrolować zachowanie analizowania. - Dodano możliwość dostosowywania znaku
SubtitleParser.Factory
używanego podczas wyodrębniania. Można to osiągnąć za pomocąMediaSource.Factory.setSubtitleParserFactory()
. - Dodaj prefiks źródła do wszystkich pól
Format.id
wygenerowanych zMergingMediaSource
. Pomaga to określić, które źródło wygenerowałoFormat
(#883). - Poprawiono wyrażenie regularne używane do weryfikacji niestandardowych nazw kluczy danych klienta Common Media Client Data (CMCD) poprzez zmodyfikowanie go tak, aby sprawdzało tylko łącznik (#1028).
- Zapobieganie podwójnemu kodowaniu parametrów zapytania CMCD (#1075).
- Dodaj
- Transformer:
- Dodano obsługę spłaszczania filmów w zwolnionym tempie w formacie H.265/HEVC SEF.
- Zwiększenie szybkości transmuksowania, zwłaszcza w przypadku zmian typu „usuń film”.
- Dodaj interfejs API, aby mieć pewność, że plik wyjściowy zaczyna się od klatki wideo. Może to zwiększyć zgodność wyników operacji przycinania z implementacjami odtwarzaczy, które nie wyświetlają pierwszej klatki filmu, dopóki nie zostanie osiągnięta sygnatura czasowa prezentacji (#829).
- Dodano obsługę optymalizacji operacji przycinania pojedynczych zasobów MP4.
- Dodaliśmy obsługę, która zapewnia, że klatka wideo ma pierwszą sygnaturę czasową w pliku wyjściowym. Naprawiono pliki wyjściowe zaczynające się od czarnej ramki na odtwarzaczach opartych na iOS (#829).
- Wybór ścieżki:
- Dodaj
DefaultTrackSelector.selectImageTrack
, aby włączyć wybieranie ś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
- Ekstraktory:
- Dodano do ekstraktora MP4 dodatkowe parsowanie AV1C, aby pobierać wartości
ColorInfo.colorSpace
,ColorInfo.colorTransfer
iColorInfo.colorRange
(#692). - MP3: używaj wyszukiwania ze stałą szybkością transmisji (CBR) w przypadku plików z nagłówkiem
Info
(odpowiednik nagłówkaXing
w przypadku CBR). Wcześniej używaliśmy tabeli seek z nagłówkaInfo
, ale powoduje to mniej precyzyjne wyszukiwanie niż w przypadku, gdy ją ignorujemy i zakładamy, że plik jest CBR. - MPEG2-TS: dodano obsługę DTS, DTS-LBR i DTS:X Profile2 (#275).
- Wyodrębnianie typów audio z deskryptorów TS i mapowanie ich na flagi ról, co pozwala użytkownikom podejmować bardziej świadome decyzje dotyczące wyboru ścieżki audio (#973).
- Dodano do ekstraktora MP4 dodatkowe parsowanie AV1C, aby pobierać 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ą wstawić niestandardowy elementVideoFrameProcessor.Factory
, mogą utworzyć instancję elementuCompositingVideoSinkProvider
, który używa niestandardowego elementuVideoFrameProcessor.Factory
, i przekazać dostawcę ujścia wideo do elementuMediaCodecVideoRenderer
.
- Zmień konstruktor
- Tekst:
- Naprawiono serializację wskazówek bitmapowych, aby rozwiązać błąd
Tried to marshall a Parcel that contained Binder objects
podczas korzystania zDefaultExtractorsFactory.setTextTrackTranscodingEnabled
(#836). - CEA-708: ignoruj wartość
rowLock
. Specyfikacja CEA-708-E S-2023 mówi, że zarównorowLock
, jak icolumnLock
powinny być traktowane jako prawdziwe, niezależnie od wartości w strumieniu (obsługacolumnLock
nie jest zaimplementowana, więc w praktyce zawsze przyjmuje się wartość false).
- Naprawiono serializację wskazówek bitmapowych, aby rozwiązać błąd
- Obraz:
- Dodano obsługę miniatur DASH. Obrazy w siatce są przycinane, a poszczególne miniatury są udostępniane
ImageOutput
w pobliżu czasu ich wyświetlania.
- Dodano obsługę miniatur DASH. Obrazy w siatce są przycinane, a poszczególne miniatury są udostępniane
- DRM:
- Odtwarzaj od razu niezaszyfrowane próbki „clear lead” w treściach z DRM, nawet jeśli klucze do późniejszych zaszyfrowanych próbek nie są jeszcze gotowe. Może to prowadzić do przerw w odtwarzaniu, jeśli klucze nadal nie będą gotowe, gdy pozycja odtwarzania osiągnie zaszyfrowane próbki (wcześniej odtwarzanie w tym momencie w ogóle by się nie rozpoczęło). To zachowanie można wyłączyć za pomocą polecenia
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey
lubDefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
.
- Odtwarzaj od razu niezaszyfrowane próbki „clear lead” w treściach z DRM, nawet jeśli klucze do późniejszych zaszyfrowanych próbek nie są jeszcze gotowe. Może to prowadzić do przerw w odtwarzaniu, jeśli klucze nadal nie będą gotowe, gdy pozycja odtwarzania osiągnie zaszyfrowane próbki (wcześniej odtwarzanie w tym momencie w ogóle by się nie rozpoczęło). To zachowanie można wyłączyć za pomocą polecenia
- Rozszerzenie IMA:
- Rozwiązanie problemu polegającego na tym, że nie można odtwarzać reklam DASH i HLS bez odpowiedniego rozszerzenia pliku.
- Sesja:
- Wyłącz wykrywanie dwukrotnego kliknięcia w aplikacjach na telewizory (#962).
- Rozwiązaliśmy problem polegający na tym, że
MediaItem.RequestMetadata
z niepustymi dodatkami nie jest przesyłany między kontrolerami multimediów a sesjami. - Dodaj konstruktor do klasy
MediaLibrarySession.Builder
, który przyjmuje tylko argumentContext
zamiast argumentuMediaLibraryService
.
- Rozszerzenie HLS:
- Zmniejsz widoczność
HlsMediaPeriod
do poziomu widoczności prywatnej w pakiecie. Ten typ nie powinien być bezpośrednio zależny od elementów spoza pakietu HLS. - Rozwiązanie problemu z efektywniejszym wyszukiwaniem początku segmentu (#1031).
- Zmniejsz widoczność
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Dekoder MIDI: ignoruj komunikaty zdarzeń SysEx (#710).
- Narzędzia testowe:
- Nie wstrzymuj odtwarzania w
TestPlayerRunHelper.playUntilPosition
. Test utrzymuje odtwarzanie w stanie odtwarzania, ale wstrzymuje postęp, dopóki nie będzie w stanie dodać asercji i dalszych działań.
- Nie wstrzymuj odtwarzania w
- Aplikacja demonstracyjna:
- Dodaj moduł demonstracyjny krótkich filmów, aby zademonstrować użycie atrybutu
PreloadMediaSource
w przypadku krótkich filmów.
- Dodaj moduł demonstracyjny krótkich filmów, aby zademonstrować użycie atrybutu
Wersja 1.3.0-rc01
22 lutego 2024 r.
Używaj stabilnej wersji 1.3.0.
Wersja 1.3.0-beta01
7 lutego 2024 r.
Używaj stabilnej wersji 1.3.0.
Wersja 1.3.0-alpha01
15 stycznia 2024 r.
Używaj stabilnej wersji 1.3.0.
Wersja 1.2.0
Wersja 1.2.1
9 stycznia 2024 r.
- ExoPlayer:
- Rozwiązaliśmy problem, który powodował, że ręczne przewijanie poza zakresem
LiveConfiguration.min/maxOffset
stale dostosowywało przesunięcie z powrotem domin/maxOffset
. - Naprawiono problem z nieprawidłowym układem kanałów OPUS i VORBIS w przypadku 3, 5, 6, 7 i 8 kanałów (#8396).
- Rozwiązaliśmy problem polegający na tym, że po przewinięciu transmisji na żywo do początku wybór ścieżki powodował nieprawidłowe rozpoczęcie transmisji w domyślnej pozycji (#9347).
- Rozwiązaliśmy problem, w którym nowe instancje
CmcdData.Factory
otrzymywały ujemne wartościbufferedDurationUs
ze źródeł fragmentów, co powodowało błądIllegalArgumentException
(#888).
- Rozwiązaliśmy problem, który powodował, że ręczne przewijanie poza zakresem
- Transformer:
- Rozwiązaliśmy problem, który powodował, że koder zgłaszał błąd podczas konfiguracji z powodu ustawienia wysokiej szybkości działania.
- Ekstraktory:
- Oznacz dodatkowe (nieodtwarzalne) ścieżki HEVC w ruchomych zdjęciach JPEG jako
ROLE_FLAG_ALTERNATE
, aby zapobiec ich automatycznemu wybieraniu do odtwarzania ze względu na wyższą rozdzielczość. - Poprawiono nieprawidłowe wykrywanie klatek kluczowych w strumieniach TS H264 (#864).
- Poprawiono szacowanie czasu trwania strumieni TS dłuższych niż 47721 sekund (#855).
- Oznacz dodatkowe (nieodtwarzalne) ścieżki HEVC w ruchomych zdjęciach JPEG jako
- Dźwięk:
- Poprawiono obsługę EOS w przypadku elementu
SilenceSkippingAudioProcessor
, gdy jest on wywoływany wielokrotnie (#712).
- Poprawiono obsługę EOS w przypadku elementu
- Film:
- Dodano obejście problemu z urządzeniami Galaxy Tab S7 FE, Chromecast z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie AVC o częstotliwości 60 kl./s są oznaczane jako nieobsługiwane (#693).
- Metadane:
- Naprawiono błąd, w którym pole
MediaMetadata
było wypełniane tylko na podstawie komentarzy Vorbis z kluczami pisanymi wielkimi literami (#876). - Poprawka
OutOfMemoryError
podczas analizowania bardzo dużych ramek ID3, co oznacza, że odtwarzanie może być kontynuowane bez informacji o tagu, zamiast całkowicie się nie powieść.
- Naprawiono błąd, w którym pole
- DRM:
- Rozszerzyliśmy obejście problemu z fałszywym adresem URL licencji ClearKey
https://default.url
na interfejs API w wersji 33 lub nowszej (wcześniej obejście dotyczyło tylko interfejsu API w wersji 33) (#837). - Naprawiono problem z
ERROR_DRM_SESSION_NOT_OPENED
podczas przełączania z zaszyfrowanych na niezabezpieczone treści bez powierzchni dołączonej do odtwarzacza. Błąd wystąpił z powodu nieprawidłowego użycia bezpiecznego dekodera do odtwarzania treści w formie niezaszyfrowanej.
- Rozszerzyliśmy obejście problemu z fałszywym adresem URL licencji ClearKey
- Sesja:
- Umieść klucze i wartości niestandardowe w
MediaMetadataCompat
toMediaMetadata.extras
iMediaMetadata.extras
toMediaMetadataCompat
(#756, #802). - Poprawiono rozgłaszanie
notifyChildrenChanged
w przypadku starszych kontrolerów (#644). - Naprawiliśmy błąd, który powodował awarię na niektórych urządzeniach, gdy dla wyłączonego timera
setWhen
powiadomienia ustawiono ujemny czas (#903). - Naprawiono błąd
IllegalStateException
, który występował, gdy kontroler powiadomień o multimediach nie zakończył połączenia w momencie, gdy zażądano pierwszej aktualizacji powiadomienia (#917).
- Umieść klucze i wartości niestandardowe w
- UI:
- Rozszerzenie DASH:
- Parsowanie „f800” jako liczby kanałów 5 w przypadku Dolby w pliku manifestu DASH (#688).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Rozszerzenie Cast:
- Poprawiono tworzenie obiektu
Timeline
, aby aplikacja nie ulegała awarii, gdy ładowanie multimediów na urządzeniu docelowym się nie powiedzie (#708).
- Poprawiono tworzenie obiektu
Wersja 1.2.0
15 listopada 2023 r.
- Biblioteka wspólna:
- Dodaj parametr
@Nullable Throwable
do metod w interfejsieLog.Logger
. Parametrmessage
w tych metodach nie zawiera już żadnych informacji o parametrzeThrowable
przekazywanym do metodLog.{d,i,w,e}()
, więc w razie potrzeby implementacje będą musiały ręcznie dołączać te informacje (być może za pomocą parametruLogger.appendThrowableString(String, Throwable)
). - Rozwiązanie problemu ze zgodnością z Kotlinem, który powodował, że parametry typu ogólnego dopuszczające wartość null i typy elementów tablicy dopuszczające wartość null nie były wykrywane jako dopuszczające wartość null. Przykładami są parametry metod
TrackSelectorResult
iSimpleDecoder
(#6792). - Zmień domyślne zachowanie interfejsu i powiadomień w
Util.shouldShowPlayButton
, aby wyświetlać przycisk „Odtwórz”, gdy odtwarzanie jest tymczasowo wstrzymane (np. z powodu chwilowej utraty fokusu dźwięku). Poprzednie działanie można zachować, używającPlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)
lubMediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)
(#11213). - Uaktualnij
androidx.annotation:annotation-experimental
do1.3.1
, aby rozwiązać problem opisany na stronie https://issuetracker.google.com/251172715. - Przenieś
ExoPlayer.setAudioAttributes
do interfejsuPlayer
.
- Dodaj parametr
- ExoPlayer:
- Rozwiązaliśmy problem z przewijaniem strumieni AC4 spowodowany nieprawidłowym identyfikowaniem próbek przeznaczonych tylko do dekodowania (#11000).
- Dodano blokowanie odtwarzania na nieodpowiednich urządzeniach wyjściowych audio (np. wbudowanym głośniku na urządzeniach z Wear OS), gdy ta funkcja jest włączona w
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput
. Przyczyna wstrzymania odtwarzania zostanie zaktualizowana do wartościPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
, jeśli odtwarzanie zostanie podjęte, gdy nie są dostępne odpowiednie wyjścia audio, lub jeśli wszystkie odpowiednie wyjścia zostaną odłączone podczas odtwarzania. Gdy podłączysz odpowiednie wyjście, przyczyna wyciszenia zostanie usunięta. - Dodaj znaki
MediaSource.canUpdateMediaItem
iMediaSource.updateMediaItem
, aby zaakceptować aktualizacjeMediaItem
po utworzeniu za pomocąPlayer.replaceMediaItem(s)
. - Zezwalaj na aktualizacje
MediaItem
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óre wysyła i odczytuje cały plik PNG doTrackOutput
jako jedną próbkę. - Ulepsz metodę
SequenceableLoader.continueLoading(long)
w interfejsieSequenceableLoader
, abySequenceableLoader.continueLoading(LoadingInfo loadingInfo)
.LoadingInfo
zawiera dodatkowe parametry, w tymplaybackSpeed
ilastRebufferRealtimeMs
, a także dotychczasowy parametrplaybackPositionUs
. - Ulepsz metodę
ChunkSource.getNextChunk(long, long, List, ChunkHolder)
w interfejsieChunkSource
, abyChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
. - Dodaliśmy do rejestrowania danych klienta Common Media Client Data (CMCD) dodatkowe pola: buffer starvation (
bs
), deadline (dl
), playback rate (pr
) i startup (su
) (#8699). - Dodaj głębię bitową luminancji i chrominancji do
ColorInfo
(#491). - Dodano dodatkowe pola do rejestrowania danych klienta Common Media Client Data (CMCD): następne żądanie obiektu (
nor
) i następne żądanie zakresu (nrr
) (#8699). - Dodanie funkcji przesyłania danych Common Media Client Data (CMCD) za pomocą parametrów zapytania (#553).
- Rozwiąż problem
ConcurrentModificationException
w sekcjiExperimentalBandwidthMeter
(#612). - Dodaj parametr
MediaPeriodId
doCompositeMediaSource.getMediaTimeForChildMediaTime
. - Obsługa
ClippingMediaSource
(i innych źródeł z okresem/okresem czasu przesunięcia) wConcatenatingMediaSource2
(#11226). - Zmień
BaseRenderer.onStreamChanged()
, aby otrzymywać też argumentMediaPeriodId
.
- Transformer:
- Analizowanie danych o rotacji EXIF w przypadku danych wejściowych w postaci obrazów.
- Usuń typ adnotacji
TransformationRequest.HdrMode
i powiązane z nim stałe. Zamiast tego użyj zasadyComposition.HdrMode
i powiązanych z nią stałych. - Uprość
OverlaySettings
, aby rozwiązać problemy z rotacją. - Zmieniono parametry
frameRate
idurationUs
elementuSampleConsumer.queueInputBitmap
naTimestampIterator
.
- Wybór ścieżki:
- Dodaj
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness
, aby wyraźnie zezwolić na adaptację niepełną lub jej zabronić. Domyślne działanie pozostaje bez zmian i wynositrue
.
- Dodaj
- Ekstraktory:
- MPEG-TS: upewnij się, że ostatnia klatka jest renderowana przez przekazanie ostatniej jednostki dostępu strumienia do kolejki próbek (#7909).
- Popraw literówkę podczas określania
rotationDegrees
. ZmienionoprojectionPosePitch
naprojectionPoseRoll
(#461). - Usuń założenie, że instancje
Extractor
można bezpośrednio sprawdzać za pomocąinstanceof
. Jeśli chcesz uzyskać dostęp w czasie działania do szczegółów implementacjiExtractor
, musisz najpierw wywołaćExtractor.getUnderlyingInstance
. - Dodaj
BmpExtractor
. - Dodaj
WebpExtractor
. - Dodaj
HeifExtractor
. - Dodaj obsługę QuickTime Classic do
Mp4Extractor
.
- Dźwięk:
- Dodaliśmy obsługę 24/32-bitowego formatu PCM w formacie MP4 i Matroska oraz analizowanie kodowania PCM dla
lpcm
w formacie MP4. - Dodano obsługę wyodrębniania dźwięku Vorbis z pliku MP4.
- Dodaj
AudioSink.getFormatOffloadSupport(Format)
, który pobiera poziom obsługi odciążania, jaki odbiornik może zapewnić w przypadku formatu, za pomocąDefaultAudioOffloadSupportProvider
. Zwraca nowyAudioOffloadSupport
, który zawieraisFormatSupported
,isGaplessSupported
iisSpeedChangeSupported
. - Dodaj
AudioSink.setOffloadMode()
, za pomocą którego konfiguracja odciążania na wyjściu audio jest konfigurowana. Wartość domyślna toAudioSink.OFFLOAD_MODE_DISABLED
. - Przenoszenie można włączyć w
setAudioOffloadPreference
wTrackSelectionParameters
. Jeśli ustawiona preferencja to włączenie, urządzenie obsługuje odciążanie w przypadku danego formatu, a wybór ścieżki to pojedyncza ścieżka audio, odciążanie dźwięku zostanie włączone. - Jeśli wartość
audioOffloadModePreference
toAUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED
,DefaultTrackSelector
wybierze tylko ścieżkę audio i tylko wtedy, gdy jej format jest obsługiwany w przypadku przeniesienia przetwarzania. Jeśli żadna ścieżka audio nie jest obsługiwana w przypadku odciążania, nie zostanie wybrana żadna ścieżka. - Wyłączanie obsługi bez przerw w przypadku odciążania przed poziomem API 33 z powodu problemu z pozycją odtwarzania po przejściu utworu.
- Usuń parametr
enableOffload
z sygnatury metodyDefaultRenderersFactory.buildAudioSink
. - Usuń metodę
DefaultAudioSink.Builder.setOffloadMode
. - Usuń wartość intdef:
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
- Dodano obsługę metadanych bez przerw w przypadku formatu Opus podczas odtwarzania z przeniesieniem obliczeń.
- Zezwól na przywrócenie renderowania przez wyłączenie przenoszenia, jeśli pierwsza próba zapisu się nie powiodła (#627).
- Domyślnie włącz harmonogram odciążania w przypadku odtwarzania odciążonego tylko dźwięku.
- Usuń
ExoPlayer.experimentalSetOffloadSchedulingEnabled
iAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
. - Zmieniono nazwę
onExperimentalSleepingForOffloadChanged
naonSleepingForOffloadChanged
ionExperimentalOffloadedPlayback
naonOffloadedPlayback
. - Przenieś interfejsy i definicje związane z trybem odciążania dźwięku
TrackSelectionParameters
do wewnętrznej klasyAudioOffloadPreferences
. - Dodaj wywołania zwrotne
onAudioTrackInitialized
ionAudioTrackReleased
doAnalyticsListener
,AudioRendererEventListener
iAudioSink.Listener
. - Rozwiązanie problemu z niedomiarem bufora audio DTS Express (#650).
- Naprawiono błąd, który powodował, że sprawdzanie możliwości w przypadku E-AC3-JOC zwracało błąd
IllegalArgumentException
(#677).
- Dodaliśmy obsługę 24/32-bitowego formatu PCM w formacie MP4 i Matroska oraz analizowanie kodowania PCM dla
- Film:
- Zezwalaj wtyczce
MediaCodecVideoRenderer
na korzystanie z niestandardowegoVideoFrameProcessor.Factory
. - Usunęliśmy błąd, który powodował, że nie można było wyrenderować pierwszej klatki, jeśli strumień audio zaczynał się od ujemnych sygnatur czasowych (#291).
- Zezwalaj wtyczce
- Tekst:
- Usuń
ExoplayerCuesDecoder
. Ścieżki tekstowe zsampleMimeType = application/x-media3-cues
są teraz obsługiwane bezpośrednio przezTextRenderer
bez konieczności używania instancjiSubtitleDecoder
.
- Usuń
- Metadane:
MetadataDecoder.decode
nie będzie już wywoływana w przypadku próbek „tylko do dekodowania”, ponieważ implementacja i tak musi zwracać wartość null.
- Skutek:
- Dodaj
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)
wejście mapy bitowej kolejki według sygnatury czasowej. - Zmień
VideoFrameProcessor.registerInputStream()
na nieblokujące. Aplikacje muszą implementować funkcjęVideoFrameProcessor.Listener#onInputStreamRegistered()
. - Zmieniono parametry
frameRate
idurationUs
elementuVideoFrameProcessor.queueInputBitmap
naTimestampIterator
.
- Dodaj
- Rozszerzenie IMA:
- Rozwiązaliśmy problem, który powodował, że transmisja na żywo DASH z wieloma okresami, która nie jest pierwszym elementem na playliście, może zgłaszać wyjątek (#571).
- Zwolnij StreamManager przed wywołaniem
AdsLoader.destroy()
- Zaktualizuj pakiet IMA SDK do wersji 3.31.0.
- Sesja:
- Ustaw zachowanie usługi pierwszego planu powiadomień na
FOREGROUND_SERVICE_IMMEDIATE
wDefaultMediaNotificationProvider
(#167). - Używaj tylko
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()
interfejsu API w wersji powyżej 31, aby uniknąć problemów z przestarzałym interfejsem API na urządzeniach Samsung (#167). - Użyj kontrolera powiadomień o multimediach jako serwera proxy, aby ustawić dostępne polecenia i niestandardowy układ używany do wypełniania powiadomienia i sesji platformy.
- Konwertuj zdarzenia przycisków multimedialnych odbierane przez
MediaSessionService.onStartCommand()
w Media3 zamiast kierować je do sesji platformy i z powrotem do Media3. Dzięki temu kontroler połączeń jest zawsze kontrolerem powiadomień o multimediach, a aplikacje mogą łatwo rozpoznawać połączenia przychodzące z powiadomienia w taki sam sposób na wszystkich obsługiwanych poziomach interfejsu API. - Usunięto błąd, który powodował, że
MediaController.getCurrentPosition()
nie przechodziło dalej, gdy było połączone ze starszymMediaSessionCompat
. - Dodaj
MediaLibrarySession.getSubscribedControllers(mediaId)
dla wygody. - Zastąp
MediaLibrarySession.Callback.onSubscribe()
, aby potwierdzić dostępność identyfikatora elementu nadrzędnego, do którego subskrybuje kontroler. Jeśli się to uda, subskrypcja zostanie zaakceptowana inotifyChildrenChanged()
zostanie natychmiast wywołana, aby poinformować przeglądarkę (#561). - Dodanie modułu demonstracyjnego sesji dla systemu operacyjnego Automotive i włączenie demonstracji sesji w Androidzie Auto.
- Nie ustawiaj kolejki sesji platformy, gdy
COMMAND_GET_TIMELINE
nie jest dostępny w przypadku kontrolera powiadomień o multimediach. Gdy Android Auto jest kontrolerem klienta odczytującym dane z sesji platformy, przyciskqueue
w interfejsie Androida Auto nie jest wyświetlany (#339). - Domyślnie używaj znaku
DataSourceBitmapLoader
zamiastSimpleBitmapLoader
(#271, #327). - Dodaj
MediaSession.Callback.onMediaButtonEvent(Intent)
, które umożliwia aplikacjom zastępowanie domyślnej obsługi zdarzeń przycisków multimediów.
- Ustaw zachowanie usługi pierwszego planu powiadomień na
- UI:
- Dodaj implementację
Player.Listener
na urządzenia z Wear OS, która obsługuje wyciszanie odtwarzania z powoduPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
przez wyświetlanie okna systemowego umożliwiającego 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 konfigurowalnym czasie oczekiwania (domyślnie 5 minut).
- Dodaj implementację
- Pobrane:
- Zadeklaruj typ usługi na pierwszym planie „synchronizacja danych” w przypadku
DownloadService
, aby zapewnić zgodność z Androidem 14. Podczas korzystania z tej usługi aplikacja musi też dodaćdataSync
jakoforegroundServiceType
w pliku manifestu oraz dodać uprawnienieFOREGROUND_SERVICE_DATA_SYNC
(#11239).
- Zadeklaruj typ usługi na pierwszym planie „synchronizacja danych” w przypadku
- Rozszerzenie HLS:
- Odświeżanie playlisty transmisji na żywo HLS w interwale obliczanym na podstawie czasu rozpoczęcia ostatniego wczytywania, a nie czasu zakończenia ostatniego wczytywania (#663).
- Rozszerzenie DASH:
- Zezwalaj na wiele identyfikatorów DASH w adresie URL szablonu segmentu.
- Dodano eksperymentalną obsługę analizowania napisów podczas wyodrębniania. Ta funkcja lepiej obsługuje scalanie nakładających się napisów, w tym rozwiązuje problem migotania podczas przechodzenia między segmentami napisów. Możesz włączyć tę funkcję za pomocą
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
(#288).
- Rozszerzenie RTSP:
- Usunięto błąd wyścigu, który w pewnych sytuacjach mógł powodować
IndexOutOfBoundsException
podczas powrotu do TCP lub zawieszanie się odtwarzania. - Sprawdzanie stanu podczas konfiguracji RTSP przy zwracaniu stanu ładowania
RtspMediaPeriod
(#577). - Ignorowanie niestandardowych metod żądań RTSP w nagłówku publicznym odpowiedzi na żądanie OPTIONS (#613).
- Użyj wartości czasu oczekiwania na odpowiedź na żądanie konfiguracji RTSP w interwale czasu wysyłania żądań opcji RTSP keep-alive (#662).
- Usunięto błąd wyścigu, który w pewnych sytuacjach mógł powodować
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Wydanie modułu dekodera MIDI, który zapewnia obsługę odtwarzania standardowych plików MIDI przy użyciu 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 porównaniu zC.BUFFER_FLAG_DECODE_ONLY
, które zostanie wycofane. - Dodaj
Decoder.setOutputStartTimeUs
iSimpleDecoder.isAtLeastOutputStartTimeUs
, aby umożliwić dekoderom odrzucanie próbek przeznaczonych tylko do dekodowania przed czasem rozpoczęcia. Jest to preferowane rozwiązanie w porównaniu z zasadąBuffer.isDecodeOnly
, która zostanie wycofana. - Naprawiono błąd publikowania artefaktu dekodera MIDI w repozytorium Maven. Artefakt został zmieniony na
media3-exoplayer-midi
(#734).
- Rozszerzenie Leanback:
- Naprawiono błąd, w którym wyłączenie powierzchni może powodować błąd
ArithmeticException
w kodzie Leanback (#617).
- Naprawiono błąd, w którym wyłączenie powierzchni może powodować błąd
- Narzędzia testowe:
- Zapewnij zgodność
TestExoPlayerBuilder
iFakeClock
z testami interfejsu Espresso i testami interfejsu Compose. Rozwiązaliśmy problem, w którym odtwarzanie postępowało w sposób nieokreślony podczas interakcji z widokami Espresso lub Compose.
- Zapewnij zgodność
- Usuń symbole, które nie są już używane:
- Usuń
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)
iTransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)
. Użyj funkcjiComposition.Builder.setHdrMode(int)
i przekaż do niej wartośćComposition
zamiast funkcjiTransformer.start(Composition, String)
. - Usuń wycofaną metodę
DownloadNotificationHelper.buildProgressNotification
i użyj metody, która nie została wycofana i przyjmuje parametrnotMetRequirements
.
- Usuń
Wersja 1.2.0-rc01
1 listopada 2023 roku
Używaj stabilnej wersji 1.2.0.
Wersja 1.2.0-beta01
19 października 2023 r.
Używaj stabilnej wersji 1.2.0.
Wersja 1.2.0-alpha02
29 września 2023 r.
Używaj stabilnej wersji 1.2.0.
Wersja 1.2.0-alpha01
17 sierpnia 2023 r.
Używaj stabilnej wersji 1.2.0.
Wersja 1.1.0
Wersja 1.1.1
16 sierpnia 2023 r.
- Biblioteka wspólna:
- Usuń przypadkowo dodaną zależność
multidex
ze wszystkich modułów (#499).
- Usuń przypadkowo dodaną zależność
- ExoPlayer:
- Rozwiązaliśmy problem w
PlaybackStatsListener
, który powodował, że po wyczyszczeniu playlisty tworzone były nieprawidłowePlaybackStats
. - Dodawanie dodatkowych pól do rejestrowania danych klienta Common Media Client Data (CMCD): format strumieniowania (sf), typ strumienia (st), wersja (v), najwyższa szybkość transmisji (tb), czas trwania obiektu (d), zmierzona przepustowość (mtp) i typ obiektu (ot) (#8699).
- Rozwiązaliśmy problem w
- Dźwięk:
- Usunęliśmy błąd, w którym podczas odtwarzania bardzo krótkich plików stan
Player.getState()
nigdy nie przechodził w stanSTATE_ENDED
(#538).
- Usunęliśmy błąd, w którym podczas odtwarzania bardzo krótkich plików stan
- Przekierowanie dźwięku:
- Dodaj na początku strumienia bitów strony nagłówka identyfikatora Ogg i nagłówka komentarza, aby umożliwić odtwarzanie Opus w trybie offload zgodnie z dokumentem RFC 7845.
- Film:
- H.265/HEVC: poprawiono analizowanie informacji o krótkoterminowych i długoterminowych obrazach referencyjnych w SPS.
- Tekst:
- CEA-608: zmiana logiki obcinania wskazówek, aby uwzględniać tylko widoczny tekst. Wcześniej wcięcia i przesunięcia tabulacji były uwzględniane przy ograniczaniu długości napisu do 32 znaków (co było technicznie poprawne zgodnie ze specyfikacją) (#11019).
- Rozszerzenie IMA:
- Zaktualizuj pakiet IMA SDK do wersji 3.30.3.
- Sesja:
- Dodaj niestandardowy układ do stanu kontrolera i udostępnij funkcję pobierania, aby uzyskać do niego dostęp. Gdy zmieni się układ niestandardowy, wywoływana jest funkcja
MediaController.Listener.onCustomLayoutChanged
. Aplikacje, które chcą wysyłać różne niestandardowe układy do różnych kontrolerów Media3, mogą to zrobić wMediaSession.Callback.onConnect
, używającAcceptedResultBuilder
, aby mieć pewność, że niestandardowy układ jest dostępny dla kontrolera po zakończeniu połączenia. - Rozwiązaliśmy problem, w którym usługa
MediaLibraryServiceLegacyStub
wysyłała błąd do usługiResult
, która nie obsługiwała tej funkcji, co powodowało błądUnsupportedOperationException
(#78). - Popraw sposób, w jaki
PlayerWrapper
tworzyVolumeProviderCompat
, określającvolumeControlType
za pomocą starszych poleceń (COMMAND_ADJUST_DEVICE_VOLUME
iCOMMAND_SET_DEVICE_VOLUME
) oraz nowych poleceń (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
iCOMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
) (#554).
- Dodaj niestandardowy układ do stanu kontrolera i udostępnij funkcję pobierania, aby uzyskać do niego dostęp. Gdy zmieni się układ niestandardowy, wywoływana jest funkcja
Wersja 1.1.0
5 lipca 2023 r.
- Biblioteka wspólna:
- Dodaj powód wyłączenia nieodpowiedniej ścieżki audio i odtwarzaj, gdy będzie gotowa. Zmień powód wyłączenia zbyt długiego. (#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 klasy Player 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)
- Dodano
Builder
dlaDeviceInfo
i wycofano dotychczasowy konstruktor. - Dodaj
DeviceInfo.routingControllerId
, aby określić identyfikator kontrolera routingu w przypadku odtwarzania zdalnego. - Dodaj
Player.replaceMediaItem(s)
jako skrót do dodawania i usuwania elementów w tym samym miejscu (#8046).
- ExoPlayer:
- Zezwalaj ExoPlayerowi na sterowanie metodami głośności urządzenia tylko wtedy, gdy użytkownik wyraźnie się na to zgodzi. 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 zMediaSource
. - Dodanie obsługi danych klienta Common Media Client Data (CMCD) w wychodzących żądaniach formatów strumieniowania adaptacyjnego DASH, HLS i SmoothStreaming. Uwzględniliśmy te pola:
br
,bl
,cid
,rtp
isid
(#8699). Struktura interfejsu API i metody interfejsu API:- Rejestrowanie CMCD jest domyślnie wyłączone. Aby je włączyć, użyj
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory)
. - Domyślnie wszystkie klucze są włączone. Zastąp
CmcdConfiguration.RequestConfig.isKeyAllowed(String key)
, aby odfiltrować klucze, które mają być rejestrowane. - Zastąp
CmcdConfiguration.RequestConfig.getCustomData()
, aby włączyć logowanie kluczy niestandardowych.
- Rejestrowanie CMCD jest domyślnie wyłączone. Aby je włączyć, użyj
- Dodano dodatkowe działanie do pliku manifestu głównej wersji demonstracyjnej, aby ułatwić uruchamianie aplikacji w wersji demonstracyjnej za pomocą niestandardowego pliku
*.exolist.json
(#439). - Dodaj
ExoPlayer.setVideoEffects()
za korzystanie zEffect
podczas odtwarzania filmu. - Zaktualizuj
SampleQueue
, aby przechowywaćsourceId
jakolong
, a nieint
. Spowoduje to zmianę sygnatur metod publicznychSampleQueue.sourceId
iSampleQueue.peekSourceId
. - Dodaj do metod
LoadControl
ionTracksSelected
parametry, które umożliwiają powiązanie tych metod z odpowiednimiMediaPeriod
.shouldStartPlayback
- Zmień sygnaturę funkcji
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)
, dodając parametr osi czasu, który zawiera okresy z identyfikatorami UID używanymi jako klucze w mapie. Jest to wymagane, aby uniknąć problemów z jednoczesnym dostępem w przypadku transmisji na żywo z wieloma okresami. - Wycofaj:
EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)
iBaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)
. Zamiast tego można wywołać warianty metod bez symbolumediaTimeOffsetUs
. Pamiętaj, że nawet w przypadku wycofanych wariantów przesunięcie nie jest już dodawane do wartościstartTimeUs
iendTimeUs
obiektówMediaLoadData
wysyłanych przez moduł wysyłający. - Zmień nazwę
ExoTrackSelection.blacklist
naexcludeTrack
iisBlacklisted
naisTrackExcluded
. - Naprawiono niespójne działanie funkcji
ExoPlayer.setMediaItem(s)
iaddMediaItem(s)
w przypadku wywołania ich na pustej playliście.
- Zezwalaj ExoPlayerowi na sterowanie metodami głośności urządzenia tylko wtedy, gdy użytkownik wyraźnie się na to zgodzi. Użyj
- Transformer:
- Usuń
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)
. Zamiast niej używaj kolumnExoPlayerAssetLoader.Factory(MediaSource.Factory)
iTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)
. - Usuń
Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
. - Usunęliśmy błąd polegający na tym, że transformacja mogła się zawiesić (co prowadziło do przekroczenia limitu czasu multipleksera), jeśli koniec strumienia wideo został zasygnalizowany w momencie, gdy ramka wejściowa oczekiwała na przetworzenie.
- Aby rozszerzyć obsługę, wysyłaj zapytania o kodeki za pomocą narzędzia
MediaCodecList
zamiast narzędzifindDecoder/EncoderForFormat
. - Usuń konfigurację klatek B w
DefaultEncoderFactory
, ponieważ nie działa ona na niektórych urządzeniach.
- Usuń
- Wybór ścieżki:
- Dodaj
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange
, która jest domyślnie wyłączona. Gdy ta opcja jest włączona,DefaultTrackSelector
spowoduje wybranie nowej ścieżki, gdy zmienią się możliwości renderowania.
- Dodaj
- Ekstraktory:
- Dźwięk:
- Naprawiono błąd, który powodował, że niektóre odtwarzania kończyły się niepowodzeniem, gdy włączone było tunelowanie i aktywne były np. funkcje przycinania bez przerw (#10847).
AudioProcessors
- Enkapsulacja ramek Opus w pakietach Ogg w przypadku bezpośredniego odtwarzania (odciążanie).
- Ekstrapolacja bieżącej pozycji podczas snu z planowaniem odciążenia.
- Dodaj
Renderer.release()
iAudioSink.release()
, aby zwolnić zasoby po zakończeniu cyklu życia odtwarzacza. - Nasłuchiwanie zmian w funkcjach audio w
DefaultAudioSink
. Dodaj wymagany parametrcontext
do konstruktoraDefaultAudioSink
, za pomocą któregoDefaultAudioSink
zarejestruje się jako odbiorca zdarzeńAudioCapabilitiesReceiver
i zaktualizuje właściwośćaudioCapabilities
po otrzymaniu informacji o zmianie możliwości. - Przekazywanie zmian w funkcjach audio za pomocą nowego zdarzenia
onAudioCapabilitiesChanged
w interfejsieAudioSink.Listener
i nowego interfejsuRendererCapabilities.Listener
, który wywołuje 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 po zmianie możliwości audio możliwy jest tryb obejścia. - Dodano obsługę bezpośredniego odtwarzania DTS Express i DTS:X (#335).
- Naprawiono błąd, który powodował, że niektóre odtwarzania kończyły się niepowodzeniem, gdy włączone było tunelowanie i aktywne były np. funkcje przycinania bez przerw (#10847).
- Film:
- Spraw, aby
MediaCodecVideoRenderer
zgłaszałVideoSize
o szerokości i wysokości 0, gdy moduł renderujący jest wyłączony.Player.Listener.onVideoSizeChanged
jest wywoływana odpowiednio, gdy zmieni się wartość zmiennejPlayer.getVideoSize()
. W wyniku tej zmiany rozmiar wideo ExoPlayera z parametremMediaCodecVideoRenderer
ma szerokość i wysokość 0, gdyPlayer.getCurrentTracks
nie obsługuje wideo lub rozmiar obsługiwanej ścieżki wideo nie został jeszcze określony.
- Spraw, aby
- DRM:
- Zmniejsz widoczność kilku metod wewnętrznych na platformie
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 wewnętrznych na platformie
- Muxer:
- Dodano nową bibliotekę multipleksera, której można używać do tworzenia pliku kontenera MP4.
- Rozszerzenie IMA:
- Włączanie transmisji na żywo DASH z wieloma przedziałami czasu na potrzeby dynamicznego wstawiania reklam. Pamiętaj, że obecna implementacja nie obsługuje jeszcze przewijania transmisji na żywo (#10912).
- Naprawiono błąd, który powodował wstawianie nowej grupy reklam w transmisjach na żywo, ponieważ obliczona pozycja treści w kolejnych osiach czasu nieznacznie się różniła.
- Sesja:
- Dodaj metodę pomocniczą
MediaSession.getControllerForCurrentRequest
, aby uzyskać informacje o kontrolerze, który obecnie wywołuje metodęPlayer
. - Dodanie
androidx.media3.session.MediaButtonReceiver
, aby umożliwić aplikacjom wznawianie odtwarzania za pomocą zdarzeń przycisków multimedialnych wysyłanych np. przez słuchawki Bluetooth (#167). - Dodaj domyślną implementację do
MediaSession.Callback.onAddMediaItems
, aby umożliwić przekazywanie żądanychMediaItems
doPlayer
, jeśli mająLocalConfiguration
(np. URI) (#282). - Dodanie przycisków poleceń „przewiń do poprzedniego” i „przewiń do następnego” w kompaktowym widoku powiadomienia o multimediach domyślnie w przypadku Androida 12 i starszych wersji (#410).
- Dodaj domyślną implementację do
MediaSession.Callback.onAddMediaItems
, aby umożliwić przekazywanie żądanychMediaItems
doPlayer
, jeśli mająLocalConfiguration
(np. URI) (#282). - Dodanie przycisków poleceń „przewiń do poprzedniego” i „przewiń do następnego” w kompaktowym widoku powiadomienia o multimediach domyślnie w przypadku Androida 12 i starszych wersji (#410).
- Dodaj metodę pomocniczą
- UI:
- Dodaj metody narzędziowe
shouldShowPlayButton
ihandlePlayPauseButtonAction
, aby tworzyć niestandardowe elementy interfejsu z przyciskiem odtwarzania/wstrzymywania.
- Dodaj metody narzędziowe
- Rozszerzenie RTSP:
- Rozszerzenie DASH:
- Usuń przesunięcie czasu multimediów z
MediaLoadData.startTimeMs
iMediaLoadData.endTimeMs
w przypadku strumieni DASH z wieloma przedziałami czasu. - Usunęliśmy błąd, który powodował, że ponowne przygotowanie źródła multimediów DASH na żywo z wieloma okresami powodowało wystąpienie błędu
IndexOutOfBoundsException
(#10838).
- Usuń przesunięcie czasu multimediów z
- Rozszerzenie HLS:
- Dodaj
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)
, aby ustawić limit czasu, przez jaki wątek ładowania ma czekać na zainicjowanie elementuTimestampAdjuster
. Jeśli inicjowanie nie zakończy się przed upływem limitu czasu, zostanie zgłoszony wyjątekPlaybackException
, aby uniknąć niekończącego się wstrzymania odtwarzania. Domyślnie limit czasu jest ustawiony na zero (#323).
- Dodaj
- Narzędzia testowe:
- Sprawdź w
DataSourceContractTest
, czy w schemacie URI nie ma rozróżniania wielkości liter.
- Sprawdź w
- Usuń symbole, które nie są już używane:
- Usuń konstruktory
DefaultAudioSink
i zamiast nich użyjDefaultAudioSink.Builder
. - Usuń polecenie
HlsMasterPlaylist
i zamiast niego użyj poleceniaHlsMultivariantPlaylist
. - Usuń
Player.stop(boolean)
. Zamiast niej użyj zasadPlayer.stop()
iPlayer.clearMediaItems()
(jeślireset
ma wartośćtrue
). - Usuń 2 wycofane konstruktory
SimpleCache
. Zamiast nich użyj niewycofanego konstruktora, który przyjmujeDatabaseProvider
, aby uzyskać lepszą wydajność. - Usuń konstruktor
DefaultBandwidthMeter
i użyj zamiast niego konstruktoraDefaultBandwidthMeter.Builder
. - Usuń konstruktory
DefaultDrmSessionManager
i użyj zamiast nichDefaultDrmSessionManager.Builder
. - Usuń 2 wycofane konstruktory
HttpDataSource.InvalidResponseCodeException
. Użyj niewycofanego konstruktora, który akceptuje dodatkowe pola(cause
,responseBody
), aby ulepszyć rejestrowanie błędów. - Usuń zasady
DownloadHelper.forProgressive
,DownloadHelper.forHls
,DownloadHelper.forDash
iDownloadHelper.forSmoothStreaming
, a zamiast nich używaj zasadDownloadHelper.forMediaItem
. - Usuń wycofany konstruktor
DownloadService
i użyj konstruktora, który nie został wycofany i zawiera opcję podania parametruchannelDescriptionResourceId
. - Usuń wycofane stałe ciągi znaków dla zestawów znaków (
ASCII_NAME
,UTF8_NAME
,ISO88591_NAME
,UTF16_NAME
iUTF16LE_NAME
). Zamiast nich używaj zestawów znaków Kotlin z pakietukotlin.text
,java.nio.charset.StandardCharsets
lubcom.google.common.base.Charsets
. - Usuń wycofany konstruktor
WorkManagerScheduler
i użyj konstruktora, który nie został wycofany i zawiera opcję podania parametruContext
. - Usuń wycofane metody
createVideoSampleFormat
,createAudioSampleFormat
,createContainerFormat
icreateSampleFormat
, które były używane do tworzenia instancji klasyFormat
. Zamiast tego użyjFormat.Builder
do tworzenia instancjiFormat
. - Usuń wycofane metody
copyWithMaxInputSize
,copyWithSubsampleOffsetUs
,copyWithLabel
,copyWithManifestFormatInfo
,copyWithGaplessInfo
,copyWithFrameRate
,copyWithDrmInitData
,copyWithMetadata
,copyWithBitrate
icopyWithVideoSize
. Zamiast nich używaj metodFormat.buildUpon()
i metod ustawiających. - Usuń wycofany tag
ExoPlayer.retry()
i zamiast niego użyj taguprepare()
. - Usuń wycofany konstruktor
DefaultTrackSelector
bez argumentów i użyj zamiast niego konstruktoraDefaultTrackSelector(Context)
. - Usuń wycofany konstruktor
OfflineLicenseHelper
i użyj konstruktoraOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
. - Usuń wycofany konstruktor
DownloadManager
i użyj konstruktora, który przyjmuje argumentExecutor
. - Usuń wycofane konstruktory
Cue
i zamiast nich używaj konstruktorówCue.Builder
. - Usuń wycofany konstruktor
OfflineLicenseHelper
i użyj konstruktoraOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
. - Usuń 4 wycofane metody
AnalyticsListener
:onDecoderEnabled
, użyj zamiast niejonAudioEnabled
lubonVideoEnabled
.onDecoderInitialized
, użyjonAudioDecoderInitialized
lubonVideoDecoderInitialized
.onDecoderInputFormatChanged
, użyj zamiast niejonAudioInputFormatChanged
lubonVideoInputFormatChanged
.onDecoderDisabled
, użyj zamiast niejonAudioDisabled
lubonVideoDisabled
.
- Usuń wycofane polecenia
Player.Listener.onSeekProcessed
iAnalyticsListener.onSeekProcessed
, a zamiast nich użyj poleceniaonPositionDiscontinuity
z parametremDISCONTINUITY_REASON_SEEK
. - Usuń polecenie
ExoPlayer.setHandleWakeLock(boolean)
i zamiast niego użyj poleceniasetWakeMode(int)
. - Usuń wycofany element
DefaultLoadControl.Builder.createDefaultLoadControl()
i zamiast niego użyj elementubuild()
. - Usuń wycofany tag
MediaItem.PlaybackProperties
i zamiast niego użyj taguMediaItem.LocalConfiguration
. Wycofane poleMediaItem.playbackProperties
ma teraz typMediaItem.LocalConfiguration
.
- Usuń konstruktory
Wersja 1.1.0-rc01
21 czerwca 2023 r.
Używaj stabilnej wersji 1.1.0.
Wersja 1.1.0-beta01
7 czerwca 2023 r.
Używaj stabilnej wersji 1.1.0.
Wersja 1.1.0-alpha01
10 maja 2023 r.
Używaj stabilnej wersji 1.1.0.
Wersja 1.0.0
Wersja 1.0.2
18 maja 2023 r.
Zostanie wycofaneandroidx.media3:media3-*:1.0.2
Wersja 1.0.2 zawiera te zmiany.
Ta wersja odpowiada wersji ExoPlayera 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óre oznacza, czyBuffer
zawiera oznaczenieC.BUFFER_FLAG_LAST_SAMPLE
. - Rozwiązaliśmy problem, który powodował, że ostatnia klatka mogła nie być renderowana, jeśli ostatnia próbka z klatkami została usunięta z kolejki bez odczytania próbki „koniec strumienia”. (#11079).
- Dodaj
- Ekstraktory:
- Naprawiono analizowanie SPS w plikach MPEG-TS w standardzie H.265 przez ponowne użycie logiki analizowania, która jest już używana przez ekstraktory RTSP i MP4 (#303).
- Tekst:
- SSA: dodano obsługę plików UTF-16, jeśli zaczynają się od znacznika kolejności bajtów (#319).
- Sesja:
- Rozwiązano problem polegający na tym, że
MediaController
nie aktualizował dostępnych poleceń po połączeniu ze starszymMediaSessionCompat
, który aktualizował swoje działania. - Naprawiono błąd, który powodował, że metoda
MediaLibraryService
nie zwracała wartości null w przypadku wywołania z interfejsu systemu do metodyCallback.onGetLibraryRoot
z parametremparams.isRecent == true
w interfejsie API 30 (#355). - Naprawiono wyciek pamięci w przypadku
MediaSessionService
lubMediaLibraryService
(#346). - Naprawiliśmy błąd, w którym połączona aktualizacja
Timeline
i pozycji wMediaSession
może powodować zgłaszanie błęduMediaController
przezIllegalStateException
.
- Rozwiązano problem polegający na tym, że
Wersja 1.0.1
18 kwietnia 2023 r.
Zostanie wycofaneandroidx.media3:media3-*:1.0.1
Wersja 1.0.1 zawiera te zmiany.
Ta wersja odpowiada wersji ExoPlayera 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ł zawieszanie się odtwarzania w przypadku pustych strumieni próbek w multimediach.
- Sesja:
- Naprawiliśmy błąd polegający na tym, że wiele identycznych elementów kolejki opublikowanych przez starszą wersję
MediaSessionCompat
powodowało wyjątek wMediaController
(#290). - Dodano brakujące przekazywanie
MediaSession.broadcastCustomCommand
do starszegoMediaControllerCompat.Callback.onSessionEvent
(#293). - Naprawiliśmy błąd, który powodował, że wywołanie
MediaSession.setPlayer
nie aktualizowało dostępnych poleceń. - Rozwiązaliśmy problem polegający na tym, że instancje
TrackSelectionOverride
wysłane zMediaController
są ignorowane, jeśli odwołują się do grupy zFormat.metadata
(#296). - Rozwiązanie problemu, w którym dostęp do metadanych za pomocą starszego interfejsu
MediaSessionCompat
wymaga uprawnieńPlayer.COMMAND_GET_CURRENT_MEDIA_ITEM
. - Rozwiązaliśmy problem, który powodował, że instancje
MediaSession
w wątku w tle powodowały awarie podczas używania wMediaSessionService
(#318). - Rozwiązanie problemu polegającego na tym, że odbiornik przycisku multimediów był deklarowany przez bibliotekę bez intencji aplikacji (#314).
- Naprawiliśmy błąd polegający na tym, że wiele identycznych elementów kolejki opublikowanych przez starszą wersję
- DASH:
- Poprawiono obsługę pustych osi czasu segmentów (#11014).
- RTSP:
- Ponów próbę z protokołem TCP, jeśli konfiguracja RTSP z protokołem UDP nie powiedzie się i zostanie zwrócony błąd RTSP 461 UnsupportedTransport (#11069).
Wersja 1.0.0
22 marca 2023 r.
Zostanie wycofaneandroidx.media3:media3-*:1.0.0
Wersja 1.0.0 zawiera te zmiany.
Ta wersja odpowiada wersji ExoPlayera 2.18.5.
Od wersji 1.0.0-rc02 nie wprowadziliśmy żadnych zmian.
Wersja 1.0.0-rc02
2 marca 2023 r.
Zostanie wycofaneandroidx.media3:media3-*:1.0.0-rc02
Wersja 1.0.0-rc02 zawiera te zmiany.
Ta wersja odpowiada wersji ExoPlayera 2.18.4.
- Biblioteka podstawowa:
- Pobrane:
- Umożliwienie konfigurowania maksymalnej różnicy między czasem rozpoczęcia 2 segmentów do scalenia w
SegmentDownloader
i klasach podrzędnych (#248).
- Umożliwienie konfigurowania maksymalnej różnicy między czasem rozpoczęcia 2 segmentów do scalenia w
- Dźwięk:
- Film:
- Mapuj format HEVC HDR10 na
HEVCProfileMain10HDR10
zamiast naHEVCProfileMain10
. - Dodano obejście problemu z urządzeniem Chromecast z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie AVC o częstotliwości 60 kl./s są oznaczane jako nieobsługiwane (#10898).
- Rozwiązano problemy z wydajnością zwalniania klatek podczas odtwarzania multimediów z częstotliwością klatek znacznie wyższą niż częstotliwość odświeżania ekranu.
- Mapuj format HEVC HDR10 na
- Przesyłaj:
- Rozwiązaliśmy problem z przejściowym
STATE_IDLE
podczas przechodzenia między elementami multimedialnymi (#245).
- Rozwiązaliśmy problem z przejściowym
- RTSP:
- Wyłapywanie wyjątku IllegalArgumentException zgłaszanego podczas analizowania nieprawidłowych wiadomości odpowiedzi RTSP Describe (#10971).
- Sesja:
- Usunęliśmy błąd, który powodował, że przycisk odtwarzania/wstrzymywania 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 otrzymywano pierwszego (a w przypadku braku reklam jedynego) zdarzenia
LOADED
.
- Naprawiono błąd, który uniemożliwiał uruchamianie strumieni DAI bez reklam, ponieważ nie otrzymywano pierwszego (a w przypadku braku reklam jedynego) zdarzenia
Wersja 1.0.0-rc01
16 lutego 2023 r.
Zostanie wycofaneandroidx.media3:media3-*:1.0.0-rc01
Wersja 1.0.0-rc01 zawiera te zmiany.
Ta wersja odpowiada wersji ExoPlayera 2.18.3.
- Biblioteka podstawowa:
- Dostosuj logikę kolejności dekoderów renderera, aby zachować preferencje
MediaCodecSelector
, nawet jeśli dekoder zgłosi, że może nie być w stanie odtworzyć multimediów w sposób wydajny. Na przykład w przypadku domyślnego selektora dekoder sprzętowy z tylko funkcjonalną obsługą będzie preferowany od dekodera programowego, 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 czyszczenie pomocników menedżera pobierania (#10776).
- Dodaj parametr do
BasePlayer.seekTo
, aby wskazać polecenie użyte do przewijania. - Używanie motywu podczas wczytywania elementów rysowalnych w przypadku interfejsu API w wersji 21 lub nowszej (#220).
- Dodano
ConcatenatingMediaSource2
, które umożliwia łączenie wielu elementów multimedialnych w jednym oknie (#247).
- Dostosuj logikę kolejności dekoderów renderera, aby zachować preferencje
- Ekstraktory:
- Zgłaszaj wyjątek
ParserException
zamiastNullPointerException
, jeśli podczas analizowania atomów trak w tabeli próbek (stbl) brakuje wymaganego opisu próbki (stsd). - Prawidłowe pomijanie próbek podczas bezpośredniego przewijania do klatki synchronizacji w fMP4 (#10941).
- Zgłaszaj wyjątek
- Dźwięk:
- Użyj szybkości transmisji skompresowanego formatu audio, aby obliczyć minimalny rozmiar bufora
dla
AudioTrack
w przypadku bezpośredniego odtwarzania (passthrough).
- Użyj szybkości transmisji skompresowanego formatu audio, aby obliczyć minimalny rozmiar bufora
dla
- Tekst:
- Poprawiono
TextRenderer
przekazywanie nieprawidłowego (ujemnego) indeksu doSubtitle.getEventTime
, jeśli plik z napisami nie zawiera wskazówek. - SubRip: dodaliśmy obsługę plików UTF-16, jeśli zaczynają się od znacznika kolejności bajtów.
- Poprawiono
- Metadane:
- Analizuj wiele wartości rozdzielonych znakiem null z ramek ID3, zgodnie z ID3 v2.4.
- Dodaj znak
MediaMetadata.mediaType
, aby oznaczyć typ treści lub typ folderu opisywanego przez metadane. - Dodaj
MediaMetadata.isBrowsable
jako zamiennikMediaMetadata.folderType
. W kolejnej wersji wycofamy ten typ folderu.
- DASH:
- Dodano pełne parsowanie zestawów adaptacji obrazów, w tym liczbę kafelków (#3752).
- UI:
- Naprawiono wycofany element
PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener)
aby mieć pewność, że zmiany widoczności są przekazywane do zarejestrowanego odbiorcy (#229). - Poprawiono kolejność elementów sterujących odtwarzaczem w
PlayerView
podczas korzystania z układu od prawej do lewej (RTL) (#227).
- Naprawiono wycofany element
- Sesja:
- Dodaj klasę abstrakcyjną
SimpleBasePlayer
, aby zaimplementować interfejsPlayer
w przypadku odtwarzaczy niestandardowych. - Dodanie metody pomocniczej do konwertowania tokena sesji platformy na Media3 (#171).
SessionToken
- Użyj
onMediaMetadataChanged
, aby wywołać aktualizacje sesji multimediów na platformie (#219). - Dodaj sesję multimedialną jako argument funkcji
getMediaButtons()
of theDefaultMediaNotificationProvider
i użyj list niemutowalnych, aby zwiększyć przejrzystość (#216). - Dodaj
onSetMediaItems
funkcję nasłuchiwania wywołania zwrotnego, aby umożliwić modyfikowanie lub ustawianieMediaItem
listy, indeksu początkowego i pozycji według sesji przed ustawieniem w odtwarzaczu (#156). - Unikanie wykrywania dwukrotnego kliknięcia w przypadku zdarzeń przycisku multimediów innych niż Bluetooth (#233).
- Zwiększenie niezawodności funkcji
QueueTimeline
w przypadku podejrzanego stanu starszej sesji (#241).
- Dodaj klasę abstrakcyjną
- Metadane:
- Analizuj wiele wartości rozdzielonych znakiem null z ramek ID3, zgodnie z ID3 v2.4.
- Dodaj znak
MediaMetadata.mediaType
, aby oznaczyć typ treści lub typ folderu opisywanego przez metadane. - Dodaj
MediaMetadata.isBrowsable
jako zamiennikMediaMetadata.folderType
. W kolejnej wersji wycofamy ten typ folderu.
- Rozszerzenie Przesyłaj:
- Zaktualizowano wersję pakietu Cast SDK do 21.2.0.
- Rozszerzenie IMA:
- Usuń odbiornik odtwarzacza
ImaServerSideAdInsertionMediaSource
w wątku aplikacji, aby uniknąć problemów z wątkami. - Dodaj właściwość
focusSkipButtonWhenAvailable
do elementuImaServerSideAdInsertionMediaSource.AdsLoader.Builder
, aby poprosić o skupienie się na przycisku pominięcia na urządzeniach TV, i ustaw domyślnie wartość „true”. - Dodaj metodę
focusSkipButton()
do elementuImaServerSideAdInsertionMediaSource.AdsLoader
, aby programowo wysyłać żądanie ustawienia fokusu na przycisku pomijania. - Zaktualizowano pakiet IMA SDK do wersji 3.29.0.
- Usuń odbiornik odtwarzacza
- Aplikacja demonstracyjna:
- Prośba o uprawnienia do powiadomień o pobranych plikach w czasie działania aplikacji (#10884).
Wersja 1.0.0-beta03
22 listopada 2022 r.
Zostanie wycofaneandroidx.media3:media3-*:1.0.0-beta03
Wersja 1.0.0-beta03 zawiera te zmiany.
Ta wersja odpowiada wersji ExoPlayera 2.18.2.
- Biblioteka podstawowa:
- Dodano
ExoPlayer.isTunnelingEnabled
, aby sprawdzić, czy tunelowanie jest włączone w przypadku obecnie wybranych ścieżek (#2518). - Dodano
WrappingMediaSource
, aby uprościć zawijanie pojedynczego znakuMediaSource
(#7279). - Odrzucanie bufora wstecznego, zanim odtwarzanie się zatrzyma z powodu niewystarczającej ilości dostępnej pamięci.
- Zamknij blok śledzenia „doSomeWork”, gdy włączone jest przenoszenie obliczeń.
- Rozwiązano problem ze śledzeniem sesji w przypadku szybkiego przewijania w
PlaybackStatsListener
(#180). - Wysyłanie wywołania zwrotnego
onMediaItemTransition
missing podczas wywoływaniaseekToNext
lubseekToPrevious
na playliście z 1 elementem (#10667). - Dodaj
Player.getSurfaceSize
, które zwraca rozmiar powierzchni, na której jest renderowany film. - Naprawiono błąd, który powodował, że usunięcie słuchaczy podczas zwalniania odtwarzacza mogło powodować błąd
IllegalStateException
(#10758).
- Dodano
- Kompilacja:
- Wymuszanie minimalnej wartości
compileSdkVersion
, aby uniknąć błędów kompilacji (#10684). - Unikaj publikowania bloku, gdy jest on uwzględniony w innej kompilacji Gradle.
- Wymuszanie minimalnej wartości
- Wybór ścieżki:
- Jeśli wyświetlacz nie obsługuje Dolby Vision, preferuj inne ścieżki. (#8944).
- Pobrane:
- Rozwiązano problem z potencjalną nieskończoną pętlą w
ProgressiveDownloader
spowodowaną jednoczesnym pobieraniem i odtwarzaniem z tym samymPriorityTaskManager
(#10570). - Natychmiastowe wyświetlanie powiadomienia o pobraniu(#183).
- Ograniczono liczbę równoległych usunięć pobierania do 1, aby uniknąć nadmiernego tworzenia wątków (#10458).
- Rozwiązano problem z potencjalną nieskończoną pętlą w
- Film:
- Wypróbuj alternatywny dekoder Dolby Vision, jeśli wyświetlacz go nie obsługuje. (#9794).
- Dźwięk:
- Używaj
SingleThreadExecutor
do zwalniania instancjiAudioTrack
, aby uniknąć błędów OutOfMemory podczas zwalniania wielu odtwarzaczy jednocześnie (#10057). - Dodaje
AudioOffloadListener.onExperimentalOffloadedPlayback
dla stanu wyładowania AudioTrack. (#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).
- Używaj
- Metadane:
MetadataRenderer
można teraz skonfigurować tak, aby renderował metadane, gdy tylko staną się dostępne. Utwórz instancję z parametremMetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean)
, aby określić, czy moduł renderujący będzie generować metadane wcześniej czy synchronicznie z pozycją odtwarzacza.
- DRM:
- Obejście błędu w implementacji ClearKey w Androidzie 13, który zwraca niepusty, ale nieprawidłowy adres URL licencji.
- Naprawiliśmy błąd
setMediaDrmSession failed: session not opened
, który występował podczas przełączania między schematami DRM na liście odtwarzania (np. z Widevine na ClearKey).
- Tekst:
- CEA-608: sprawdź, czy pole 2 zawiera prawidłowe polecenia przełączania usługi (#10666).
- DASH:
- Analizowanie
EventStream.presentationTimeOffset
z plików manifestu (#10460).
- Analizowanie
- UI:
- Użyj bieżących zastąpień odtwarzacza jako ustawień wstępnych w
TrackSelectionDialogBuilder
(#10429).
- Użyj bieżących zastąpień odtwarzacza jako ustawień wstępnych w
- Sesja:
- Sprawdź, czy polecenia są zawsze wykonywane we właściwej kolejności, nawet jeśli niektóre z nich wymagają asynchronicznego rozwiązania (#85).
- Dodaj
DefaultMediaNotificationProvider.Builder
, aby utworzyć instancjeDefaultMediaNotificationProvider
. Twórca może skonfigurować identyfikator powiadomienia, identyfikator kanału powiadomień i nazwę kanału powiadomień 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 zostaną odrzucone (#99). SimpleBitmapLoader
może wczytywać mapy bitowe zfile://
identyfikatorów URI (#108).- Naprawiono asercję, która uniemożliwiała
MediaController
przewijanie reklamy w okresie (#122). - Po zakończeniu odtwarzania
MediaSessionService
jest zatrzymywany na pierwszym planie i wyświetlane jest powiadomienie o możliwości ponownego odtworzenia ostatniego odtwarzanego elementu multimedialnego (#112). - Nie uruchamiaj usługi działającej na pierwszym planie za pomocą oczekującego zamiaru wstrzymania (#167).
- Ręczne ukrywanie „odznaki” powiązanej z powiadomieniem utworzonym przez
DefaultNotificationProvider
w przypadku interfejsów API 26 i 27 (odznaka jest automatycznie ukrywana w przypadku interfejsów API 28 i nowszych) (#131). - Naprawiliśmy błąd, który powodował, że drugie połączenie bindera ze starszej wersji MediaSession z Media3 MediaController powodowało wyjątki IllegalStateException (#49).
- RTSP:
- IMA:
- Dodaj limit czasu wczytywania informacji o reklamie, aby obsługiwać przypadki, 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łowe obliczanie czasu trwania okna w przypadku transmisji na żywo z reklamami wstawianymi po stronie serwera, np. IMA DAI (#10764).
- Rozszerzenie FFmpeg:
- Dodano nowe wymagane flagi do łączenia bibliotek FFmpeg z NDK w wersji 23.1.7779620 i nowszej (#9933).
- Rozszerzenie AV1:
- Zaktualizowano wersję CMake, aby uniknąć niezgodności z najnowszymi wersjami Androida Studio (#9933).
- Rozszerzenie Przesyłaj:
- Wprowadź
getDeviceInfo()
, aby móc identyfikowaćCastPlayer
podczas sterowania odtwarzaniem za pomocąMediaController
(#142).
- Wprowadź
- Transformer:
- Dodanie timera nadzorującego multipleksera, który wykrywa, kiedy generowanie próbki wyjściowej trwa zbyt długo.
- Usuń symbole, które nie są już używane:
- Usuń
Transformer.Builder.setOutputMimeType(String)
. Ta funkcja została usunięta. Gdy używany jest domyślny multiplekser, typ MIME zawsze będzie MP4.
- Usuń
Wersja 1.0.0-beta02
21 lipca 2022 r.
Zostanie wycofaneandroidx.media3:media3-*:1.0.0-beta02
Wersja 1.0.0-beta02 zawiera te zmiany.
Ta wersja odpowiada wersji ExoPlayera 2.18.1.
- Biblioteka podstawowa:
- Sprawdź, czy zmiana
ShuffleOrder
naExoPlayer.setShuffleOrder
powoduje wywołanie funkcjiPlayer.Listener#onTimelineChanged
z parametremreason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED
(#9889). - W przypadku mediów progresywnych uwzględniaj tylko wybrane ścieżki w pozycji buforowanej (#10361).
- Zezwalanie na niestandardowy rejestrator dla wszystkich danych wyjściowych logów ExoPlayera (#9752).
- Poprawiono implementację
setDataSourceFactory
wDefaultMediaSourceFactory
, która w niektórych przypadkach nie działała (#116).
- Sprawdź, czy zmiana
- Ekstraktory:
- DASH:
- Parsowanie adresu URL licencji ClearKey z plików manifestu (#10246).
- UI:
- Upewnij się, że TalkBack odczytuje aktualnie aktywną opcję szybkości w menu elementów sterujących odtwarzaniem (#10298).
- RTSP:
- Dodano obsługę fragmentowanych pakietów VP8 (#110).
- Rozszerzenie Leanback:
- Posłuchaj zmian w
playWhenReady
wLeanbackAdapter
(10420).
- Posłuchaj zmian w
- Przesyłaj:
Wersja 1.0.0-beta01
16 czerwca 2022 r.
Zostanie wycofaneandroidx.media3:media3-*:1.0.0-beta01
Wersja 1.0.0-beta01 zawiera te zmiany.
Odpowiada to wersji ExoPlayera 2.18.0.
- Biblioteka podstawowa:
- Włącz obsługę diagnostyki platformy Android za pomocą
MediaMetricsManager
. ExoPlayer będzie przekazywać do platformy zdarzenia odtwarzania i dane o wydajności, co pomoże dostarczać informacje o wydajności systemu i debugowaniu na urządzeniu. Dane te 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 przesyłania danych diagnostycznych platformy na potrzeby ExoPlayera za pomocąExoPlayer.Builder.setUsePlatformDiagnostics(false)
. - Naprawiliśmy błąd, który powodował zbyt częste resetowanie ścieżek podczas korzystania z
MergingMediaSource
, np. podczas wczytywania napisów z pliku i zmiany wybranych napisów w trakcie odtwarzania (#10248). - Zaprzestanie wykrywania typu sieci 5G-NSA w przypadku interfejsów API w wersjach 29 i 30. Odtwarzanie będzie się odbywać w sieci 4G.
- Nie zezwalaj na przekazywanie parametru
null
do usługMediaSource.Factory.setDrmSessionManagerProvider
iMediaSource.Factory.setLoadErrorHandlingPolicy
. W razie potrzeby można jawnie przekazać instancjeDefaultDrmSessionManagerProvider
iDefaultLoadErrorHandlingPolicy
. - Dodaj
MediaItem.RequestMetadata
, aby oznaczyć metadane potrzebne do odtworzenia multimediów, gdy dokładnyLocalConfiguration
nie jest znany. Usuń teżMediaMetadata.mediaUrl
, ponieważ jest on teraz uwzględniony wRequestMetadata
. - Dodaj
Player.Command.COMMAND_SET_MEDIA_ITEM
, aby umożliwić graczom ustawienie pojedynczego elementu.
- Włącz obsługę diagnostyki platformy Android za pomocą
- Wybór ścieżki:
- Spłaszcz klasę
TrackSelectionOverrides
doTrackSelectionParameters
i przenieśTrackSelectionOverride
na najwyższy poziom. - Zmień nazwę
TracksInfo
naTracks
iTracksInfo.TrackGroupInfo
naTracks.Group
.Player.getCurrentTracksInfo
iPlayer.Listener.onTracksInfoChanged
zostały też zmienione naPlayer.getCurrentTracks
iPlayer.Listener.onTracksChanged
. Obejmuje to „przywrócenie” nazwy metodyPlayer.Listener.onTracksChanged
, ale z innymi typami parametrów. - Zmień
DefaultTrackSelector.buildUponParameters
iDefaultTrackSelector.Parameters.buildUpon
, aby zwracaćDefaultTrackSelector.Parameters.Builder
zamiast wycofanegoDefaultTrackSelector.ParametersBuilder
. - Dodaj
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities
, która jest domyślnie włączona. Gdy ta opcja jest włączona,DefaultTrackSelector
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
będzie preferować formaty stereo/mono zamiast formatów wielokanałowych, chyba że format wielokanałowy może być przestrzenny (Android 12L lub nowszy) lub jest formatem dźwięku przestrzennego Dolby. Dodatkowo na urządzeniach obsługujących przestrzenne odtwarzanie dźwiękuDefaultTrackSelector
będzie monitorować zmiany w właściwościach przestrzennego odtwarzania dźwięku i w razie potrzeby wybierać nowy utwór. Urządzenia ztelevision
trybem interfejsu 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 klasę
- Film:
- Zmień nazwę
DummySurface
naPlaceholderSurface
. - Dodanie obsługi formatu AV1 do elementu
MediaCodecVideoRenderer.getCodecMaxInputSize
.
- Zmień nazwę
- Dźwięk:
- Używanie dekodera audio LG AC3 do wyświetlania reklam z niestandardowym typem MIME.
- Zmień typ zwracany funkcji
AudioAttributes.getAudioAttributesV21()
zandroid.media.AudioAttributes
na nową klasę opakowującąAudioAttributesV21
, aby zapobiec powolnej weryfikacji ART w przypadku interfejsu API w wersji < 21. - Wysyłaj zapytania do platformy (API 29+) lub zakładaj liczbę kanałów kodowania dźwięku w przypadku przekazywania dźwięku, gdy liczba kanałów audio w formacie jest nieustawiona, co ma miejsce w przypadku przygotowania HLS bez segmentów (10204).
- Skonfiguruj
AudioTrack
z maską kanałuAudioFormat.CHANNEL_OUT_7POINT1POINT4
, jeśli dekoder generuje 12-kanałowy dźwięk PCM#10322.
- DRM
- Zadbaj o to, aby sesja DRM była zawsze prawidłowo aktualizowana podczas przewijania bezpośrednio po zmianie formatu (10274).
- Tekst:
- Zmień
Player.getCurrentCues()
, aby zwracaćCueGroup
zamiastList<Cue>
. - SSA: obsługa ustawienia stylu
OutlineColour
, gdyBorderStyle == 3
(np.OutlineColour
ustawia tło wskazówki) (#8435). - CEA-708: analizuje dane w wielu blokach usług i ignoruje bloki, które nie są powiązane z obecnie wybranym numerem usługi.
- Usuń
RawCcExtractor
, który był używany tylko do obsługi wewnętrznego formatu napisów Google.
- Zmień
- Ekstraktory:
- UI:
- Naprawiono dostarczanie zdarzeń do
OnClickListener
ustawionych naPlayerView
w przypadku, gdyuseController=false
(#9605). Naprawiono też dostarczanie zdarzeń doOnLongClickListener
we wszystkich konfiguracjach widoku. - Naprawiliśmy problem z nieprawidłowym traktowaniem sekwencji zdarzeń dotykowych, które wychodzą poza granice
PlayerView
przedACTION_UP
, jako kliknięcia (#9861). - Rozwiązaliśmy problem z ułatwieniami dostępu
PlayerView
, który powodował, że kliknięcie mogło przełączać odtwarzanie zamiast ukrywać elementy sterujące (#8627). - Zmień polecenia
TrackSelectionView
iTrackSelectionDialogBuilder
, aby działały w interfejsiePlayer
, a nieExoPlayer
. Dzięki temu widoki mogą być używane z innymi implementacjamiPlayer
, a zależność modułu interfejsu użytkownika od modułu ExoPlayer zostanie usunięta. Jest to zmiana powodująca niezgodność wsteczną. - Nie wyświetlaj wymuszonych ścieżek tekstowych w selektorze ścieżek
PlayerView
i zachowaj wybraną odpowiednią wymuszoną ścieżkę tekstową, jeśli wybrano „Brak” (#9432).
- Naprawiono dostarczanie zdarzeń do
- DASH:
- Analizowanie liczby kanałów z elementów DTS
AudioChannelConfiguration
. Przywraca to przekazywanie dźwięku w przypadku strumieni DTS (#10159). - Nie zezwalaj na przekazywanie wartości
null
do usługiDashMediaSource.Factory.setCompositeSequenceableLoaderFactory
. W razie potrzeby można jawnie przekazywać instancjeDefaultCompositeSequenceableLoaderFactory
.
- Analizowanie liczby kanałów z elementów DTS
- HLS:
- Wróć do przygotowania fragmentów, jeśli atrybut CODECS na playliście nie zawiera kodeka audio (#10065).
- Nie zezwalaj na przekazywanie wartości
null
do usługHlsMediaSource.Factory.setCompositeSequenceableLoaderFactory
,HlsMediaSource.Factory.setPlaylistParserFactory
iHlsMediaSource.Factory.setPlaylistTrackerFactory
. InstancjeDefaultCompositeSequenceableLoaderFactory
,DefaultHlsPlaylistParserFactory
lub odwołanie doDefaultHlsPlaylistTracker.FACTORY
można przekazać jawnie, jeśli jest to wymagane.
- Płynne przesyłanie strumieniowe:
- Nie zezwalaj na przekazywanie wartości
null
do usługiSsMediaSource.Factory.setCompositeSequenceableLoaderFactory
. W razie potrzeby można jawnie przekazywać instancjeDefaultCompositeSequenceableLoaderFactory
.
- Nie zezwalaj na przekazywanie wartości
- RTSP:
- Dodano czytnik RTP dla H263 (#63).
- Dodaj czytnik RTP dla MPEG4 (#35).
- Dodano czytnik RTP dla HEVC (#36).
- Dodaj czytnik RTP dla AMR. Obecnie obsługiwane są tylko strumienie AMR jednokanałowe, nieprzeplatane. Złożony ładunek AMR RTP nie jest obsługiwany. (#46)
- Dodano czytnik RTP dla VP8 (#47).
- Dodaj czytnik RTP dla formatu WAV (#56).
- Popraw nagłówek uwierzytelniania podstawowego RTSP. (#9544).
- Przestań sprawdzać obowiązkowe pola SDP, ponieważ ExoPlayer ich nie potrzebuje (#10049).
- Rzucanie sprawdzonym wyjątkiem podczas analizowania czasu RTSP (#10165).
- Dodano czytnik RTP dla VP9 (#47).
- Dodano czytnik RTP dla OPUS (#53).
- Źródła danych:
- Zmień nazwę
DummyDataSource
naPlaceholderDataSource
. - Obejście obsługi przerwań OkHttp.
- Zmień nazwę
- Sesja:
- Zastąp
MediaSession.MediaItemFiller
ciągiemMediaSession.Callback.onAddMediaItems
, aby zezwolić na asynchroniczne rozwiązywanie żądań. - Obsługa metod
setMediaItems(s)
, gdyMediaController
łączy się z sesją multimedialną starszego typu. - Usuń
MediaController.setMediaUri
iMediaSession.Callback.onSetMediaUri
. Tę samą funkcję można uzyskać za pomocą funkcjiMediaController.setMediaItem
iMediaSession.Callback.onAddMediaItems
. - Przekierowywanie połączeń z usługi starszego typu
MediaController
w celu odtwarzania multimediów na urządzeniuMediaSession.Callback.onAddMediaItems
zamiast na urządzeniuonSetMediaUri
. - Dodaj
MediaNotification.Provider
iDefaultMediaNotificationProvider
, aby dostosować powiadomienie. - Dodano
BitmapLoader
iSimpleBitmapLoader
do pobierania obrazów z grafiką. - Dodaj
MediaSession.setCustomLayout()
, aby zapewnić zgodność wsteczną ze starszą sesją. - Dodaj
MediaSession.setSessionExtras()
, aby zapewnić równoważność funkcji ze starszą sesją. - Zmień nazwę
MediaSession.MediaSessionCallback
naMediaSession.Callback
,MediaLibrarySession.MediaLibrarySessionCallback
naMediaLibrarySession.Callback
iMediaSession.Builder.setSessionCallback
nasetCallback
. - Naprawiono błąd NPE w
MediaControllerImplLegacy
(#59). - Aktualizowanie informacji o pozycji sesji na osi czasu change(#51).
- Naprawiono błąd NPE w
MediaControllerImplBase
po zwolnieniu kontrolera (#74).
- Zastąp
- Odtwarzanie reklam / IMA:
- Zmniejsz częstotliwość odpytywania reklam ze 100 ms do 200 ms, aby dostosować ją do zaleceń organizacji Media Rating Council (MRC).
- Rozszerzenie FFmpeg:
- Zaktualizuj wersję CMake do
3.21.0+
, aby uniknąć błędu CMake powodującego niepowodzenie synchronizacji Gradle w Android Studio (#9933).
- Zaktualizuj wersję CMake do
- Usuń symbole, które nie są już używane:
- Usuń
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
. Zamiast niej używaj zasadyPlayer.Listener.onTracksChanged(Tracks)
. - Usuń
Player.getCurrentTrackGroups
iPlayer.getCurrentTrackSelections
. Zamiast niej używaj zasadyPlayer.getCurrentTracks
. Możesz też nadal korzystać z metodExoPlayer.getCurrentTrackGroups
iExoPlayer.getCurrentTrackSelections
, ale są one przestarzałe. - Usuń stałe
DownloadHelper
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
iDEFAULT_TRACK_SELECTOR_PARAMETERS
. W miarę możliwości używajgetDefaultTrackSelectorParameters(Context)
, a w przeciwnym razieDEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT
. - Usuń konstruktora
DefaultTrackSelector(ExoTrackSelection.Factory)
. Zamiast niej używaj zasadyDefaultTrackSelector(Context, ExoTrackSelection.Factory)
. - Usuń
Transformer.Builder.setContext
. Zamiast tego należy przekazać wartośćContext
do konstruktoraTransformer.Builder
.
- Usuń
Wersja 1.0.0-alpha03
14 marca 2022 r.
Zostanie wycofaneandroidx.media3:media3-*:1.0.0-alpha03
Wersja 1.0.0-alpha03 zawiera te zmiany.
Odpowiada to wersji ExoPlayera 2.17.1.
- Dźwięk:
- Naprawiono błąd sprawdzania możliwości audio w przypadku Dolby Atmos (E-AC3-JOC) w HLS.
- Ekstraktory:
- FMP4: naprawiono problem polegający na tym, że metadane próbki emsg mogły być generowane w niewłaściwej kolejności w przypadku strumieni zawierających atomy emsg w wersjach 0 i 1 (#9996).
- Tekst:
- Poprawiono interakcję pól
SingleSampleMediaSource.Factory.setTrackId
iMediaItem.SubtitleConfiguration.Builder.setId
, aby priorytetowo traktować poleSubtitleConfiguration
i w przypadku jego braku używać wartościFactory
(#10016).
- Poprawiono interakcję pól
- Odtwarzanie reklam:
- Naprawianie niedoborów dźwięku między okresami reklamowymi w transmisjach na żywo HLS SSAI.
Wersja 1.0.0-alpha02
2 marca 2022 r.
Zostanie wycofaneandroidx.media3:media3-*:1.0.0-alpha02
Wersja 1.0.0-alpha02 zawiera te zmiany.
Odpowiada to wersji ExoPlayera 2.17.0.
- Podstawowa biblioteka:
- Dodaj chronioną metodę
DefaultRenderersFactory.getCodecAdapterFactory()
, aby podklasyDefaultRenderersFactory
, które zastępująbuildVideoRenderers()
lubbuildAudioRenderers()
, mogły uzyskać dostęp do fabryki adapterów kodeków i przekazywać ją do tworzonych przez siebie instancjiMediaCodecRenderer
. - Przekazywanie pól nagłówka ICY
name
igenre
doMediaMetadata.station
iMediaMetadata.genre
odpowiednio, aby docierały do aplikacji przezPlayer.Listener.onMediaMetadataChanged()
(#9677). - Usuń klucze o wartości null z kolekcji
DefaultHttpDataSource#getResponseHeaders
. - W przypadku niepowodzenia tworzenia instancji
MediaCodec
poczekaj i spróbuj ponownie. Rozwiązuje to problem, który występuje na niektórych urządzeniach podczas przełączania powierzchni z bezpiecznego kodeka na inny kodek (#8696). - Dodaj
MediaCodecAdapter.getMetrics()
, aby umożliwić użytkownikom uzyskiwanie danych o metrykach zMediaCodec
. (#9766). - Naprawiono rozwiązywanie zależności Maven (#8353).
- Wyłącz automatyczne dostosowywanie szybkości w przypadku transmisji na żywo, które nie mają funkcji niskiego opóźnienia ani ustawienia szybkości wybranego przez użytkownika (#9329).
- Zmień nazwę
DecoderCounters#inputBufferCount
naqueuedInputBufferCount
. - Ustaw
SimpleExoPlayer.renderers
jako prywatne. Do modułów renderujących można uzyskać dostęp za pomocą funkcjiExoPlayer.getRenderer
. - Zaktualizowano niektóre stałe wartości
AnalyticsListener.EventFlags
, aby były zgodne z wartościami wPlayer.EventFlags
. - Podziel
AnalyticsCollector
na interfejs i domyślną implementację, aby R8 mógł go usunąć, jeśli aplikacja go nie potrzebuje.
- Dodaj chronioną metodę
- Wybór ścieżki:
- Obsługa flag preferowanych ról wideo przy wyborze ścieżki (#9402).
- Zaktualizowano logikę wyboru ścieżki wideo, aby podczas wybierania wielu ścieżek wideo do adaptacji uwzględniała preferowane typy MIME i flagi ról (#9519).
- Zaktualizowano logikę wyboru ścieżek wideo i audio, aby wybierać tylko formaty do adaptacyjnego wyboru, które mają ten sam poziom dekodera i obsługi sprzętowej (#9565).
- Zaktualizowano logikę wyboru ścieżki wideo, aby preferować bardziej wydajne kodeki, jeśli dekodery podstawowe z akceleracją sprzętową obsługują wiele kodeków (#4835).
- Preferuj ustawienia treści audio (np. „domyślną” ścieżkę audio lub ścieżkę pasującą do języka ustawionego w systemie) od technicznych ograniczeń wyboru ścieżki (np. preferowany typ MIME lub maksymalna liczba kanałów).
- Rozwiązanie problemu z wyborem ścieżki, który powodował, że zastąpienie jednej grupy ścieżek nie wyłączało innych grup ścieżek tego samego typu (#9675).
- Rozwiązaliśmy problem z wybieraniem ścieżek, który powodował, że mieszanka niepustych i pustych zastąpień ścieżek nie była prawidłowo stosowana (#9649).
- Zabraniaj duplikowania
TrackGroup
wTrackGroupArray
.TrackGroup
s można zawsze odróżnić, ustawiającid
w konstruktorzeTrackGroup
. Rozwiązuje to problem z awarią podczas wznawiania odtwarzania po przejściu aplikacji do trybu tła z aktywnym zastąpieniem ścieżki (#9718). - Zmiana logiki w
AdaptiveTrackSelection
, aby umożliwić zwiększenie jakości przy wystarczającej przepustowości sieci, nawet jeśli odtwarzanie jest bardzo blisko krawędzi transmisji na żywo (#9784).
- Film:
- Poprawiono logikę powrotu dekodera w przypadku Dolby Vision, aby w razie potrzeby używać zgodnego dekodera H264/H265.
- Dźwięk:
- Poprawiono logikę powrotu dekodera w przypadku Dolby Atmos (E-AC3-JOC), aby w razie potrzeby używać zgodnego dekodera E-AC3.
- Zmień interfejsy API
AudioCapabilities
, aby wymagały jawnego przekazywania wartościAudioCapabilities.DEFAULT_AUDIO_CAPABILITIES
zamiastnull
. - Umożliwia dostosowanie obliczania rozmiaru bufora
AudioTrack
przez wstrzyknięcieAudioTrackBufferSizeProvider
doDefaultAudioSink
. (#8891). - Ponów próbę utworzenia
AudioTrack
, jeśli żądany rozmiar bufora był większy niż 1 MB. (#9712).
- Ekstraktory:
- Tekst:
- Dodaj pole
MediaItem.SubtitleConfiguration.id
, które jest propagowane do polaFormat.id
ścieżki napisów utworzonej na podstawie konfiguracji (#9673). - Dodano podstawową obsługę napisów WebVTT w kontenerach Matroska (#9886).
- Uniemożliwiać
Cea708Decoder
odczytywanie więcej danych niż zadeklarowany rozmiar bloku usługi.
- Dodaj pole
- DRM:
- Usuń urządzenie
playbackLooper
z kontaDrmSessionManager.(pre)acquireSession
. Gdy aplikacja używa elementuDrmSessionManager
w niestandardowym elemencieMediaSource
, zamiast tego należy przekazać elementplaybackLooper
do elementuDrmSessionManager.setPlayer
.
- Usuń urządzenie
- Odtwarzanie reklam / IMA:
- Dodano obsługę dynamicznego wstawiania reklam (DAI) w pakiecie IMA SDK (#8213).
- Dodaj metodę do
AdPlaybackState
, aby umożliwić resetowanie grupy reklam, tak aby można było ją ponownie odtworzyć (#9615). - Wymuszanie szybkości odtwarzania 1,0 podczas odtwarzania reklam (#9018).
- Rozwiązaliśmy problem polegający na tym, że grupa reklam, której nie udało się załadować, powodowała natychmiastowe zresetowanie odtwarzania (#9929).
- UI:
- DASH:
- Dodaj do elementu
Representation
(#9579) przeanalizowane właściwości podstawowe i dodatkowe. - Obsługa roli ścieżki
forced-subtitle
(#9727). - Przestań interpretować rolę ścieżki
main
jakoC.SELECTION_FLAG_DEFAULT
. - Poprawiono logikę wykluczania podstawowego adresu URL w przypadku plików manifestu, które nie deklarują przestrzeni nazw DVB (#9856).
- Obsługa względnych adresów URL
MPD.Location
(#9939).
- Dodaj do elementu
- HLS:
- Prawidłowo wypełnij pole
Format.label
w przypadku strumieni HLS zawierających tylko dźwięk (#9608). - Domyślnie używaj przygotowania bez podziału na części, aby skrócić czas uruchamiania. Jeśli Twoje wersje zawierają zmuksowane ścieżki napisów, które nie są zadeklarowane w playliście głównej, dodaj je do playlisty głównej, aby były dostępne do odtwarzania, lub wyłącz przygotowywanie bez podziału na części za pomocą parametru
HlsMediaSource.Factory.setAllowChunklessPreparation(false)
. - Obsługa precyzyjnego przewijania w HLS (#2882).
- Prawidłowo wypełnij pole
- RTSP:
- Udostępnij interfejs API klienta, aby zastąpić
SocketFactory
używany w przypadku dowolnego połączenia z serwerem (#9606). - Preferuj metodę uwierzytelniania DIGEST zamiast BASIC, jeśli obie są obecne (#9800).
- Obsługa sytuacji, w której czas ścieżki RTSP jest niedostępny (#9775).
- Ignoruj nieprawidłowe wartości nagłówka RTP-Info (#9619).
- Udostępnij interfejs API klienta, aby zastąpić
- Transformer:
- Zwiększ minimalną wymaganą wersję interfejsu API do 21.
TransformationException
jest teraz używane do opisywania błędów, które występują podczas przekształcenia.- Dodaj
TransformationRequest
, aby określić opcje przekształcania. - Zezwalaj na rejestrację wielu słuchaczy.
- Rozwiązaliśmy problem z zawieszaniem się transformatora, gdy dane wyjściowe kodeka są odczytywane częściowo.
- Naprawianie potencjalnego błędu NPE w
Transformer.getProgress
podczas zwalniania multipleksera throws. - Dodaj aplikację demonstracyjną do stosowania przekształceń.
- Rozszerzenie MediaSession:
- Domyślnie
MediaSessionConnector
czyści teraz playlistę po zatrzymaniu. Aplikacje, które chcą zachować playlistę, mogą wywołać funkcjęsetClearMediaItemsOnStop(false)
w przypadku oprogramowania sprzęgającego.
- Domyślnie
- Rozszerzenie Przesyłaj:
- Rozszerzenie FFmpeg:
- Ustawić
build_ffmpeg.sh
jako zależne od narzędzi binarnych LLVM zamiast GNU (#9933).
- Ustawić
- Zgodność z Androidem 12:
- Zaktualizuj rozszerzenie Cast, aby zależało od
com.google.android.gms:play-services-cast-framework:20.1.0
. Starsze wersjeplay-services-cast-framework
nie są zgodne z aplikacjami przeznaczonymi na Androida 12 i będą się zamykać z błędemIllegalArgumentException
podczas tworzeniaPendingIntent
(#9528).
- Zaktualizuj rozszerzenie Cast, aby zależało od
- Usuń symbole, które nie są już używane:
- Usuń
Player.EventListener
. Zamiast niej używaj zasadyPlayer.Listener
. - Usuń
MediaSourceFactory#setDrmSessionManager
,MediaSourceFactory#setDrmHttpDataSourceFactory
iMediaSourceFactory#setDrmUserAgent
. Zamiast niej używaj właściwościMediaSourceFactory#setDrmSessionManagerProvider
. - Usuń
MediaSourceFactory#setStreamKeys
. Zamiast niej używaj właściwościMediaItem.Builder#setStreamKeys
. - Usuń
MediaSourceFactory#createMediaSource(Uri)
. Zamiast niej używaj właściwościMediaSourceFactory#createMediaSource(MediaItem)
. - Usuń urządzenie
setTag
z kontaDashMediaSource
,HlsMediaSource
iSsMediaSource
. Zamiast niej używaj zasadyMediaItem.Builder#setTag
. - Usuń
DashMediaSource#setLivePresentationDelayMs(long, boolean)
. Użyj symboliMediaItem.Builder#setLiveConfiguration
iMediaItem.LiveConfiguration.Builder#setTargetOffsetMs
, aby zastąpić plik manifestu, lub symboluDashMediaSource#setFallbackTargetLiveOffsetMs
, aby podać wartość rezerwową. - Usuń
(Simple)ExoPlayer.setThrowsWhenUsingWrongThread
. Rezygnacja z egzekwowania zasad dotyczących wątków nie jest już możliwa. - Usuń
ActionFile
iActionFileUpgradeUtil
. Aby używać funkcjiActionFileUpgradeUtil
do scalania starszych plików działań wDefaultDownloadIndex
, używaj ExoPlayera w wersji 2.16.1 lub starszej. - Usuń
ProgressiveMediaSource#setExtractorsFactory
. Zamiast tego użyj konstruktoraProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)
. - Usuń
ProgressiveMediaSource.Factory#setTag
iProgressiveMediaSource.Factory#setCustomCacheKey
. Zamiast niej używaj 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)
,DefaultRenderersFactory#setExtensionRendererMode
iDefaultRenderersFactory#setAllowedVideoJoiningTimeMs
. - Usuń wszystkie publiczne konstruktory
CronetDataSource
. Zamiast niej używaj właściwościCronetDataSource.Factory
.
- Usuń
- Zmień
IntDefs
na@Target(TYPE_USE)
. Może to spowodować przerwanie kompilacji użyć w Kotlinie, co można naprawić, przenosząc adnotację do adnotowania typu (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
(wcom.google.android.exoplayer2.ext.flac
pakiecie)@FlacExtractor.Flags
(wcom.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
Zostanie wycofaneandroidx.media3:media3-*:1.0.0-alpha01
Wersja 1.0.0-alpha01 zawiera te zmiany.
Nowe funkcje
Media3 to nowe miejsce dla bibliotek obsługi multimediów, w tym ExoPlayera. Pierwsza wersja alfa zawiera wczesne, funkcjonalne implementacje bibliotek do wdrażania przypadków użycia multimediów, w tym:
- ExoPlayer, odtwarzacz multimediów na poziomie aplikacji na Androida, który można łatwo dostosowywać i rozszerzać.
- Funkcja sesji multimedialnej do udostępniania i sterowania odtwarzaniem. Ten nowy moduł sesji korzysta z tego samego
Player
interfejsu co ExoPlayer. - Komponenty interfejsu do tworzenia interfejsów odtwarzania multimediów.
- Moduły zawierające funkcje innych bibliotek do użytku z ExoPlayerem, np. wstawianie reklam za pomocą pakietu IMA SDK.
Więcej informacji znajdziesz w projekcie Media3 na GitHubie.
ExoPlayer był wcześniej hostowany w osobnym projekcie ExoPlayer w GitHubie. W Media3 nazwa pakietu to androidx.media3.exoplayer
. Planujemy jeszcze przez jakiś czas utrzymywać i udostępniać projekt ExoPlayer w GitHubie, aby dać aplikacjom czas na przejście na Media3. Media3 ma zamienniki wszystkich modułów ExoPlayera z wyjątkiem starszych rozszerzeń media2 i mediasession, które zostały zastąpione nowym modułem media3-session
. Zapewnia to bezpośrednią integrację między odtwarzaczami a sesjami multimedialnymi bez konieczności używania klasy adaptera lub łącznika.