Media3
Najnowsza aktualizacja | Wersja stabilna | Kandydat do publikacji | Wersja Beta | Wersja alfa |
---|---|---|---|---|
7 czerwca 2024 r. | 1.3.1 | - | - | 1.4.0-alfa02 |
Deklarowanie zależności
Aby dodać zależność od Media3, musisz dodać do projektu repozytorium Google Maven. Więcej informacji znajdziesz w repozytorium Google Maven.
W pliku build.gradle
aplikacji lub modułu dodaj zależności artefaktów, których potrzebujesz:
Odlotowy
dependencies { def media3_version = "1.3.1" // For media playback using ExoPlayer implementation "androidx.media3:media3-exoplayer:$media3_version" // For DASH playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-dash:$media3_version" // For HLS playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-hls:$media3_version" // For SmoothStreaming playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version" // For RTSP playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version" // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation "androidx.media3:media3-exoplayer-midi:$media3_version" // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation "androidx.media3:media3-exoplayer-ima:$media3_version" // For loading data using the Cronet network stack implementation "androidx.media3:media3-datasource-cronet:$media3_version" // For loading data using the OkHttp network stack implementation "androidx.media3:media3-datasource-okhttp:$media3_version" // For loading data using librtmp implementation "androidx.media3:media3-datasource-rtmp:$media3_version" // For building media playback UIs implementation "androidx.media3:media3-ui:$media3_version" // For building media playback UIs for Android TV using the Jetpack Leanback library implementation "androidx.media3:media3-ui-leanback:$media3_version" // For exposing and controlling media sessions implementation "androidx.media3:media3-session:$media3_version" // For extracting data from media containers implementation "androidx.media3:media3-extractor:$media3_version" // For integrating with Cast implementation "androidx.media3:media3-cast:$media3_version" // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version" // For transforming media files implementation "androidx.media3:media3-transformer:$media3_version" // For applying effects on video frames implementation "androidx.media3:media3-effect:$media3_version" // For muxing media files implementation "androidx.media3:media3-muxer:$media3_version" // Utilities for testing media components (including ExoPlayer components) implementation "androidx.media3:media3-test-utils:$media3_version" // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation "androidx.media3:media3-test-utils-robolectric:$media3_version" // Common functionality for reading and writing media containers implementation "androidx.media3:media3-container:$media3_version" // Common functionality for media database components implementation "androidx.media3:media3-database:$media3_version" // Common functionality for media decoders implementation "androidx.media3:media3-decoder:$media3_version" // Common functionality for loading data implementation "androidx.media3:media3-datasource:$media3_version" // Common functionality used across multiple media libraries implementation "androidx.media3:media3-common:$media3_version" }
Kotlin
dependencies { val media3_version = "1.3.1" // For media playback using ExoPlayer implementation("androidx.media3:media3-exoplayer:$media3_version") // For DASH playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-dash:$media3_version") // For HLS playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-hls:$media3_version") // For SmoothStreaming playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version") // For RTSP playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version") // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation("androidx.media3:media3-exoplayer-midi:$media3_version") // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation("androidx.media3:media3-exoplayer-ima:$media3_version") // For loading data using the Cronet network stack implementation("androidx.media3:media3-datasource-cronet:$media3_version") // For loading data using the OkHttp network stack implementation("androidx.media3:media3-datasource-okhttp:$media3_version") // For loading data using librtmp implementation("androidx.media3:media3-datasource-rtmp:$media3_version") // For building media playback UIs implementation("androidx.media3:media3-ui:$media3_version") // For building media playback UIs for Android TV using the Jetpack Leanback library implementation("androidx.media3:media3-ui-leanback:$media3_version") // For exposing and controlling media sessions implementation("androidx.media3:media3-session:$media3_version") // For extracting data from media containers implementation("androidx.media3:media3-extractor:$media3_version") // For integrating with Cast implementation("androidx.media3:media3-cast:$media3_version") // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version") // For transforming media files implementation("androidx.media3:media3-transformer:$media3_version") // For applying effects on video frames implementation("androidx.media3:media3-effect:$media3_version") // For muxing media files implementation("androidx.media3:media3-muxer:$media3_version") // Utilities for testing media components (including ExoPlayer components) implementation("androidx.media3:media3-test-utils:$media3_version") // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation("androidx.media3:media3-test-utils-robolectric:$media3_version") // Common functionality for reading and writing media containers implementation("androidx.media3:media3-container:$media3_version") // Common functionality for media database components implementation("androidx.media3:media3-database:$media3_version") // Common functionality for media decoders implementation("androidx.media3:media3-decoder:$media3_version") // Common functionality for loading data implementation("androidx.media3:media3-datasource:$media3_version") // Common functionality used across multiple media libraries implementation("androidx.media3:media3-common:$media3_version") }
Więcej informacji o zależnościach znajdziesz w artykule Dodawanie zależności kompilacji.
Opinia
Twoja opinia pomoże nam ulepszyć Jetpack. Możesz użyć narzędzia do śledzenia problemów z Media3, aby znaleźć odpowiedzi na pytania, znane problemy i prośby o dodanie funkcji, a także zgłosić nowe problemy.
Wersja 1.4.0
Wersja 1.4.0-alfa02
7 czerwca 2024 r.
Aplikacja androidx.media3:media3-*:1.4.0-alpha02
została zwolniona.
Wersja 1.4.0-alpha02 zawiera te zatwierdzenia.
- Wspólna biblioteka:
- W przypadku założenia, że funkcja przekierowywała wywołania do chronionych metod
BasePlayer.seekTo
iSimpleBasePlayer.handleSeek
, zamiast ich ignorować. Jeśli implementujesz te metody w odtwarzaczu niestandardowym, być może trzeba będzie obsługiwać te dodatkowe wywołania w funkcjimediaItemIndex == C.INDEX_UNSET
. - Usuń zależność kompilacji od udoskonalonego deugarowania środowiska Java 8 (#1312).
- Upewnij się, że czas trwania przekazany do
MediaItem.Builder.setImageDurationMs
jest ignorowany w przypadku elementuMediaItem
innego niż obraz (zgodnie z dokumentacją).
- W przypadku założenia, że funkcja przekierowywała wywołania do chronionych metod
- ExoPlayer:
- Dodaj
reset
doBasePreloadManager
, aby zwolnić wszystkie źródła blokady, zachowując instancję menedżera wstępnego wczytywania. - Dodaj
ExoPlayer.setPriority
(iBuilder.setPriority
), aby określić wartość priorytetu używaną wPriorityTaskManager
i ważność MediaCodec z interfejsu API 35. - Rozwiązanie problemu z aktualizacją czasu ostatniego ponownego buforowania, który spowodował nieprawidłowy klucz
bs
(brak buforowania) w CMCD (#1124). - Dodaj
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
, aby wskazać, że źródło zostało załadowane do końca. Dzięki temu implementacjeDefaultPreloadManager
i niestandardowePreloadMediaSource.PreloadControl
mogą wstępnie wczytywać następne źródło lub wykonywać inne działania. - Naprawiono błąd polegający na tym, że pomijanie ciszy na końcu elementów mogło powodować 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 będzie używany, gdy zasoby kodeka są odzyskiwane na potrzeby zadań o wyższym priorytecie. - Pozwól usłudze
AdsMediaSource
na wczytanie reklam przed filmem, zanim zakończy się wstępne przygotowanie multimediów (#1358). - Naprawa błędu, który powodował przenoszenie odtwarzania do
STATE_ENDED
podczas ponownego przygotowywania transmisji na żywo DASH trwającej wiele okresów po usunięciu pierwotnego okresu z pliku manifestu. - Zmień nazwę
onTimelineRefreshed
naonSourcePrepared
ionPrepared
naonTracksSelected
wPreloadMediaSource.PreloadControl
. WDefaultPreloadManager.Stage
możesz też odpowiednio zmienić nazwy wartości IntDefs. - Dodaj eksperymentalną obsługę dynamicznego harmonogramu, aby lepiej dostosować pracę do cykli wybudzania procesora i opóźnić wybudzanie, gdy mechanizmy renderowania mogą kontynuować działanie.
Możesz to włączyć przy użyciu polecenia
experimentalSetDynamicSchedulingEnabled
podczas konfigurowania instancji ExoPlayer. - Dodaj
Renderer.getDurationToProgressMs
. ZasóbRenderer
może zaimplementować tę metodę, by zwrócić do ExoPlayer czas trwania odtwarzania, który musi być rozpoczęty, aby mechanizm renderowania mógł przejść dalej. JeśliExoPlayer
ma wartośćexperimentalSetDynamicSchedulingEnabled
,ExoPlayer
wywoła tę metodę podczas obliczania czasu planowania zadania. - Dodaj
MediaCodecAdapter#OnBufferAvailableListener
, aby otrzymywać alerty, gdyMediaCodecRenderer
udostępnia bufory danych wejściowych i wyjściowych.MediaCodecRenderer
sygnalizujeExoPlayer
, że odbiera te wywołania zwrotne, a jeśliExoPlayer
ma wartośćexperimentalSetDynamicSchedulingEnabled
,ExoPlayer
zaplanuje pętlę pracy w miarę możliwości renderowania. - Do metod
LoadControl
używaj klasy danych zamiast poszczególnych parametrów.
- Dodaj
- Transformer:
- Obejście błędu dekodera, w wyniku którego podczas obsługi wejścia PCM liczba kanałów audio była ograniczona do stereo.
- Podczas wybierania ścieżek audio w
ExoPlayerAssetLoader
zignoruj ograniczenia liczby kanałów audio, ponieważ mają one zastosowanie tylko do odtwarzania. - Zastąp interfejs
androidx.media3.transformer.Muxer
elementemandroidx.media3.muxer.Muxer
i usuńandroidx.media3.transformer.Muxer
. - Naprawa ładowania obrazu HEIC ze schematów URI treści. (#1373).
- Skoryguj czas trwania ścieżki audio w aplikacji
AudioGraphInput
, aby poprawić synchronizację dźwięku z obrazem.
- Moduły wyodrębniania:
- MPEG-TS: wdrażaj zmianę tak, aby wyrenderować ostatnią klatkę, przekazując ostatnią jednostkę dostępu do strumienia do kolejki próbki (#7909). Wprowadzenie poprawek w celu rozwiązania problemów, które pojawiły się w strumieniach HLS tylko z I-frame(#1150) i strumieniach HLS H.262 (#1126).
- MP3: preferuj rozmiar danych z ramki
Info
zamiast rozmiaru zgłaszanego przez strumień bazowy (np. rozmiar pliku lub nagłówek HTTPContent-Length
). Pomaga to wykluczać dane z zwiastunów, których nie da się odtworzyć (np. okładki albumu), ze stałej szybkości transmisji bitów, co zwiększa dokładność wyszukiwania (#1376). - MP3: użyj liczby klatek i innych danych w ramce
Info
(jeśli występuje), aby obliczyć średnią szybkość transmisji bitów na potrzeby przewijania o stałej szybkości transmisji bitów, zamiast wydobywać ją z szybkości klatki po klatceInfo
, która może być sztucznie za mała, np. o klatkęPCUT
(nr 1376).
- Dźwięk:
- Poprawiliśmy atrybuty kodowania DTS:X Profile 2 na potrzeby odtwarzania bez dźwięku (#1299).
- W przypadku odtwarzania z przetwarzaniem zresetuj pole śledzenia zakończenia strumienia w
DefaultAudioSink
przed wywołaniem funkcjiAudioTrack.stop()
, aby usługaAudioTrack.StreamEventCallback#onPresentationEnded
poprawnie rozpoznawała, kiedy wszystkie oczekujące dane zostały odtworzone. - Poprawiono błąd w
SilenceSkippingAudioProcessor
, w którym przejścia między różnymi formatami dźwięku (np. stereo na mono) mogą powodować występowanie wyjątku przez procesor (#1352). - Zaimplementuj
MediaCodecAudioRenderer.getDurationToProgressUs
, aby ExoPlayer dynamicznie planował swoją główną pętlę roboczą na moment, gdy MediaCodecAudioRenderer może wykonać działanie.
- Film:
- Napraw logikę kreacji zastępczej dekodera Dolby Vision, aby w razie potrzeby używać zgodnego dekodera AV1 (#1389).
- Tekst:
- Rozwiązanie problemu polegającego na tym, że napisy rozpoczynające się przed pominięciem pozycji przewijania Ten problem został wprowadzony tylko w Media3 w wersji 1.4.0-alfa01.
- Zmień domyślne działanie analizy napisów, tak aby odbywało się to podczas wyodrębniania, a nie renderowania (różnice między wyodrębnianiem a renderowaniem znajdziesz na schemacie architektury ExoPlayer).
- Tę zmianę można zastąpić, wywołując zarówno
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)
, jak iTextRenderer.experimentalSetLegacyDecodingEnabled(true)
. Informacje o umieszczaniu tych komponentów w instancjiExoPlayer
znajdziesz w dokumentacji dotyczącej dostosowywania. Te metody (i cała obsługa starszych wersji dekodowania napisów) zostaną usunięte w kolejnej wersji. - W przypadku aplikacji z niestandardowymi implementacjami
SubtitleDecoder
trzeba je zaktualizować, aby zaimplementować interfejsSubtitleParser
(iSubtitleParser.Factory
zamiastSubtitleDecoderFactory
).
- Tę zmianę można zastąpić, wywołując zarówno
- Usługi gier Play: napraw dekodowanie długości działania, aby traktować
0
jako indeks kolorów zamiast dosłownej wartości koloru (#1367). - CEA-708: ignoruj wartość
rowLock
. Zgodnie ze specyfikacją CEA-708-E S-2023 obie funkcjerowLock
icolumnLock
powinny być traktowane jako prawdziwe niezależnie od wartości w strumieniu (obsługa parametrucolumnLock
nie jest zaimplementowana, więc w praktyce przyjmuje się, że zawsze ma wartość fałsz).- Te informacje pierwotnie znajdowały się w informacjach o wersji
1.3.0-alpha01
, ale ta zmiana została przypadkowo cofnięta przed wydaniem wersji1.3.0-rc01
. Problem został już rozwiązany, więc zmiana jest widoczna ponownie.
- Te informacje pierwotnie znajdowały się w informacjach o wersji
- CEA-708: unikaj dodawania duplikatów nowych wierszy przez nawialną obsługę polecenia „set pen location” (#1315) przez system ExoPlayer.
- Metadane:
- Naprawa mapowania tagów sortowania MP4 na ID3. Wcześniej tagi „sortowanie albumu” (
soal
), „ustawianie wykonawców” (soar
) i „sortowanie wykonawcy albumu” (soaa
) były niewłaściwie zmapowane na tagi ID3TSO2
,TSOA
iTSOP
(#1302). - Poprawiono odczyt numerycznych tagów MP4 (/iTunes)
gnre
(gatunek) itmpo
(tempo), gdy wartość ma więcej niż 1 bajt. - Propagacja ramki
TCON
identyfikatora 3 doMediaMetadata.genre
(#1305).
- Naprawa mapowania tagów sortowania MP4 na ID3. Wcześniej tagi „sortowanie albumu” (
- Obraz:
- Dodano obsługę niekwadratowych siatki miniatur DASH (#1300).
- Dodano obsługę formatu AVIF dla interfejsu API 34+.
- Źródło danych:
- Zezwól funkcji
ByteArrayDataSource
na rozstrzyganie identyfikatora URI do tablicy bajtów podczasopen()
, bez konieczności zakodowania na stałe w jej konstrukcji (#1405).
- Zezwól funkcji
- DRM:
- Zezwalaj na ustawienie
LoadErrorHandlingPolicy
w:DefaultDrmSessionManagerProvider
(#1271).
- Zezwalaj na ustawienie
- Efekt:
- Naprawiono błąd, który powodował awarię
TimestampWrapper
podczas używania razem z elementemExoPlayer#setVideoEffects
(#821). - Zmień domyślną przestrzeń roboczą SDR z kolorami liniowymi na wideo elektryczne BT 709 SDR. Trzeba też zastosować trzecią opcję, która pozwala zachować pierwotną przestrzeń kolorów.
- Zezwalaj na definiowanie nieokreślonej kolejności „z-order” elementu EditedMediaItemSequency (#1055).
- Utrzymuj spójny zakres luminancji dla różnych fragmentów treści HDR (korzysta z zakresu HLG).
- Dodano obsługę nakładek ultra HDR (bitmapy) w treściach HDR.
- Zezwalaj na używanie efektów
SeparableConvolution
przed wprowadzeniem interfejsu API 26.
- Naprawiono błąd, który powodował awarię
- Rozszerzenie IMA:
- Promuj interfejs API, który jest wymagany do odtwarzania strumieni reklam DAI, aby aplikacje stały się stabilne.
- Dodaj tag
replaceAdTagParameters(Map <String, String>)
doImaServerSideAdInsertionMediaSource.AdLoader
, który umożliwia zastępowanie parametrów tagu reklamy w czasie działania. - Naprawiono błąd, który powodował, że gdy podczas odtwarzania reklamy wystąpił błąd odtwarzacza, nie była wywoływana funkcja
VideoAdPlayer.VideoAdPlayerCallback.onError
(#1334). - Zmień wersję pakietu IMA SDK na 3.33.0, aby naprawić błąd
NullPointerException
w przypadku korzystania z identyfikatorów URI tagu reklamydata://
(#700).
- Sesja:
- Ukrywaj pasek przewijania w powiadomieniu o multimediach w przypadku transmisji na żywo, nie ustawiając czasu trwania w metadanych sesji na platformie (#1256).
- Dopasuj konwersję
MediaMetadata
doMediaDescriptionCompat
, aby używać tej samej preferowanej kolejności i tej samej logiki podczas wybierania właściwości metadanych co w elemencie media1. - Dodaj
MediaSession.sendError()
, który umożliwia wysyłanie błędów niekrytycznych do kontrolera Media3. Gdy korzystasz z kontrolera powiadomień (patrzMediaSession.getMediaNotificationControllerInfo()
), niestandardowy błąd jest używany do aktualizacji parametruPlaybackState
sesji platformy do stanu błędu z podanymi informacjami o błędzie (#543).
- Rozszerzenie Cronet:
- Popraw
SocketTimeoutException
w:CronetDataSource
. W niektórych wersjach aplikacji Cronet żądanie przekazywane przez wywołanie zwrotne nie zawsze jest takie samo. Prowadzi to do nieukończenia połączenia i przekroczenia limitu czasu żądania (https://issuetracker.google.com/328442628).
- Popraw
- Rozszerzenie HLS:
- Napraw błąd, który powodował, że oczekujące próbki EMSG oczekujące na nieciągłość zostały przekazane w
HlsSampleStreamWrapper
z nieprawidłowym przesunięciem, które spowodowało błądIndexOutOfBoundsException
lubIllegalArgumentException
(#1002). - Poprawiono błąd, który powodował, że playlisty inne niż podstawowe ciągle ponownie się ładują w przypadku strumieni LL-HLS (#1240).
- Poprawiono błąd polegający na tym, że włączenie CMCD dla HLS z segmentami inicjowania powodowało działanie
Source Error
iIllegalArgumentException
.
- Napraw błąd, który powodował, że oczekujące próbki EMSG oczekujące na nieciągłość zostały przekazane w
- Rozszerzenie DASH:
- Rozszerzenie Cast:
- Naprawiono błąd, który powodował konwersję tytułu albumu
MediaQueueItem
na wykonawcę w elemencie multimedialnym Media3 (#1255).
- Naprawiono błąd, który powodował konwersję tytułu albumu
- Aplikacja w wersji demonstracyjnej:
- Zezwalaj na ustawianie trybu powtarzania za pomocą argumentów
Intent
z wiersza poleceń (#1266).
- Zezwalaj na ustawianie trybu powtarzania za pomocą argumentów
- Usuń wycofane symbole:
- Usuń metodę
setContentTypePredicate(Predicate)
zDefaultHttpDataSource
,OkHttpDataSource
iCronetDataSource
. Użyj tej samej metody w każdym obiekcieXXXDataSource.Factory
. - Usuń konstruktory (
OkHttpDataSource
) i elementyOkHttpDataSourceFactory
. Użyj w zamian zasadyOkHttpDataSource.Factory
. - Usuń
PlayerMessage.setHandler(Handler)
. Użyj w zamian zasadysetLooper(Looper)
. - Usuń pole
Timeline.Window.isLive
. Użyj zamiast niej metodyisLive()
. - Usuń konstruktora
DefaultHttpDataSource
. Użyj w zamian zasadyDefaultHttpDataSource.Factory
. - Usuń
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS
. Użyj w zamian zasadyDashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS
. - Usuń
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)
. Użyj w zamian zasadyMediaCodecInfo.canReuseCodec(Format, Format)
. - Usuń metody
DrmSessionManager.DUMMY
igetDummyDrmSessionManager()
. Użyj w zamian zasadyDrmSessionManager.DRM_UNSUPPORTED
. - Usuń
AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)
,AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)
,AudioRendererEventListener.onAudioInputFormatChanged(Format)
,VideoRendererEventListener.onVideoInputFormatChanged(Format)
. Zamiast nich używaj przeciążeń, które wymagająDecoderReuseEvaluation
. - Usuń stałe
RendererSupport.FormatSupport
IntDef iFORMAT_HANDLED
,FORMAT_EXCEEDS_CAPABILITIES
,FORMAT_UNSUPPORTED_DRM
,FORMAT_UNSUPPORTED_SUBTYPE
,FORMAT_UNSUPPORTED_TYPE
. Użyj w zamian równoważnej wartości IntDef i stałych w funkcjiandroidx.media3.common.C
(np.C.FORMAT_HANDLED
).
- Usuń metodę
Wersja 1.4.0-alfa01
17 kwietnia 2024 r.
Aplikacja androidx.media3:media3-*:1.4.0-alpha01
została zwolniona.
Wersja 1.4.0-alpha01 zawiera te zatwierdzenia.
- ExoPlayer:
- Dodaj element
BasePreloadManager
, który koordynuje wstępne wczytywanie wielu źródeł na podstawie priorytetów określonych przez parametrrankingData
. Rozszerzanie tej klasy jest możliwe, aby można było je dostosowywać. Dodaj funkcjęDefaultPreloadManager
, która używa metodyPreloadMediaSource
do wstępnego wczytywania próbek multimediów ze źródeł do pamięci, oraz liczby całkowitejrankingData
, która wskazuje indeks elementu w interfejsie. - Dodaj
PlayerId
do większości metodLoadControl
, aby umożliwić implementacjeLoadControl
obsługujące wiele odtwarzaczy. - Usuń użytkowników
Buffer.isDecodeOnly()
iC.BUFFER_FLAG_DECODE_ONLY
. Nie trzeba ustawiać tej flagi, ponieważ mechanizmy renderowania i dekoderów będą decydować o pomijaniu buforów na podstawie sygnatury czasowej. Niestandardowe implementacjeRenderer
powinny sprawdzać, czy czas buforowania wynosi co najmniejBaseRenderer.getLastResetPositionUs()
, aby określić, czy należy wyświetlić próbkę. Niestandardowe implementacjeSimpleDecoder
mogą w razie potrzeby sprawdzać parametrisAtLeastOutputStartTimeUs
lub oznaczyć inne bufory za pomocą parametruDecoderOutputBuffer.shouldBeSkipped
, aby je pominąć. - Zezwalaj na zwracanie przez
TargetPreloadStatusControl.getTargetPreloadStatus(T)
wartości null, aby wskazać, że nie ma być wstępnie ładowaneMediaSource
z określonymrankingData
. - Dodaj
remove(MediaSource)
doBasePreloadManager
.
- Dodaj element
- Transformer:
- Dodaj
audioConversionProcess
ivideoConversionProcess
doExportResult
, by określić sposób utworzenia odpowiedniej ścieżki w pliku wyjściowym. - Rozluźnij się z kontrolą optymalizacji przycięcia H.264.
- Dodano obsługę przełączania między multimediami wejściowymi SDR i HDR w sekwencji.
- Dodano obsługę efektów dźwiękowych na poziomie kompozycji.
- Dodaj obsługę transkodowania obrazów ultra HDR do filmów HDR.
- Rozwiązaliśmy problem polegający na tym, że po zresetowaniu i ponownym użyciu
DefaultAudioMixer
nie zwraca prawidłowej liczby bajtów.
- Dodaj
- Film:
- Rozwiązanie problemu polegającego na tym, że
Listener.onRenderedFirstFrame()
pojawia się zbyt wcześnie podczas przełączania platform w trakcie odtwarzania.
- Rozwiązanie problemu polegającego na tym, że
- Źródło danych:
- Zaimplementuj obsługę identyfikatorów URI nieprzetworzonych zasobów
android.resource://package/id
, gdziepackage
różni się od pakietu bieżącej aplikacji. Do tej pory nie było to udokumentowane, ale jest to skuteczniejszy sposób uzyskiwania dostępu do zasobów w innym pakiecie niż nazwa. - Starannie sprawdź parametr
url
w konstruktorachDataSpec
, który nie ma wartości null. Ten parametr został już dodany do adnotacji nie ma wartości null.
- Zaimplementuj obsługę identyfikatorów URI nieprzetworzonych zasobów
- Efekt:
- Obsługuj wiele zmian prędkości w obrębie tego samego atrybutu
EditedMediaItem
lubComposition
wSpeedChangeEffect
. - Obsługa wyjściowego formatu HLG i PQ z wejścia bitmapy ultra HDR.
- Dodano obsługę klasy EGL_GL_COLORSPACE_BT2020_HLG_EXT, która poprawia jakość danych wyjściowych HLG w plikach ExoPlayer.setVideoEffect i Debuger SurfaceView.
- Zaktualizuj implementację macierzy nakładki, aby była zgodna z dokumentacją, odwracając wartości x i y stosowane w
setOverlayFrameAnchor()
. Jeśli używasz funkcjiOverlaySettings.Builder.setOverlayFrameAnchor()
, odwróć ich wartości x i y, mnożąc je przez-1
.
- Obsługuj wiele zmian prędkości w obrębie tego samego atrybutu
- Sesja:
- Zmień wartość domyślną z
CommandButton.enabled
natrue
i upewnij się, że w przypadku kontrolerów ta wartość może pozostać nieskonfigurowana, nawet jeśli powiązane polecenie jest dostępne. - Dodaj stałe ikony dla elementu
CommandButton
, które powinny być używane zamiast zasobów ikon niestandardowych. - Dodaj
MediaSessionService.isPlaybackOngoing()
, aby umożliwić aplikacjom zapytania o to, czy usługa musi zostać zatrzymana w komponencieonTaskRemoved()
(#1219). - Dodaj funkcję
MediaSessionService.pauseAllPlayersAndStopSelf()
, która w wygodny sposób wstrzyma odtwarzanie wszystkich sesji, i wywołaj metodęstopSelf
, aby zakończyć cykl życiaMediaSessionService
. - Zastąp
MediaSessionService.onTaskRemoved(Intent)
, aby zapewnić bezpieczną implementację domyślną, która utrzymuje usługę na pierwszym planie, jeśli odtwarzanie trwa, lub zatrzymuje ją w inny sposób.
- Zmień wartość domyślną z
- Pobrane pliki:
- Upewnij się, że
DownloadHelper
nie ujawnia nieopublikowanych instancjiRenderer
, co może doprowadzić do awarii aplikacjiIllegalStateException: Too many receivers, total of 1000, registered for pid
(#1224).
- Upewnij się, że
- Narzędzia testowe:
- Zaimplementuj
onInit()
ionRelease()
w aplikacjiFakeRenderer
. - Zmień metody
TestPlayerRunHelper.runUntil/playUntil
, aby nie wykonywały błędów niekrytycznych (np. tych zgłoszonych doAnalyticsListener.onVideoCodecError
). Użyj nowego łańcucha metodTestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()
, aby wyłączyć takie zachowanie.
- Zaimplementuj
- Aplikacja w wersji demonstracyjnej:
- Użyj
DefaultPreloadManager
w krótkiej aplikacji demonstracyjnej.
- Użyj
- Usuń wycofane symbole:
- Usuń
CronetDataSourceFactory
. Użyj w zamian zasadyCronetDataSource.Factory
. - Usuń niektóre konstruktory
DataSpec
. Użyj w zamian zasadyDataSpec.Builder
.
- Usuń
Wersja 1.3.0
Wersja 1.3.1
11 kwietnia 2024 r.
Aplikacja androidx.media3:media3-*:1.3.1
została zwolniona.
Wersja 1.3.1 zawiera te zatwierdzenia.
- Wspólna biblioteka:
- Dodaj
Format.labels
, aby zezwolić na etykiety zlokalizowane i inne.
- Dodaj
- ExoPlayer:
- Rozwiązanie problemu polegającego na tym, że
PreloadMediaPeriod
nie może zachowywać strumieni po ponownym wczytaniu. - Zastosuj prawidłową wartość
TrackSelectionResult
do okresu odtwarzania podczas ponownego wyboru utworu. - Renderowanie z wcześniejszym włączeniem należy rozpocząć dopiero po zakończeniu okresu odtwarzania podczas przechodzenia między elementami multimedialnymi (#1017).
- Dodaj brakujący typ zwracany do reguły
-keepclasseswithmembers
ProPard dlaDefaultVideoFrameProcessor.Factory.Builder.build()
(#1187).
- Rozwiązanie problemu polegającego na tym, że
- Transformer:
- Dodaj obejście zgłoszonego wyjątku, ponieważ element
MediaMuxer
nie obsługuje wykluczonych sygnatur czasowych prezentacji przed interfejsem API 30.
- Dodaj obejście zgłoszonego wyjątku, ponieważ element
- Wybór ścieżki:
DefaultTrackSelector
: wolę ścieżki wideo z „rozsądną” liczbą klatek (>=10 kl./s) niż te z mniejszą lub nieskonfigurowaną liczbą klatek. Dzięki temu odtwarzacz wybiera „prawdziwą” ścieżkę wideo w pliku MP4 wyodrębnionym ze zdjęć ruchomych, które mogą zawierać 2 ścieżki HEVC, z których jedna ma wyższą rozdzielczość, ale bardzo małą liczbę klatek (#1051).
- Moduły wyodrębniania:
- Rozwiązano problem, który powodował, że dopełnienie nie było pomijane podczas odczytu fragmentów plików WAV o nietypowych rozmiarach (#1117).
- MP3: wypełniaj pole
Format.averageBitrate
z ramek metadanych, takich jakXING
iVBRI
. - MPEG-TS: wycofywanie zmiany, która ma na celu wyrenderowanie ostatniej klatki przez przekazanie ostatniej jednostki dostępu do strumienia do kolejki próbki (#7909). Wynika to z zmiany, która powoduje nowe problemy ze strumieniami HLS typu I-frame tylko ze strumieniami HLS (#1150) i strumieniami HLS H.262 (#1126).
- Dźwięk:
- Zezwól na przywracanie mechanizmu renderowania przez wyłączenie obciążenia, jeśli nie uda się zainicjować ścieżki audio w trybie przeładowywania.
- Film:
- Dodaj obejście problemu z urządzeniem na urządzeniach Galaxy Tab S7 FE, Chromecast z Google TV i Lenovo M10 FHD Plus, które powoduje, że strumienie H265 z 60 kl./s są oznaczane jako nieobsługiwane
- Dodaj obejście, które zapewni, że pierwsza klatka będzie zawsze renderowana podczas tunelowania, nawet jeśli urządzenie nie robi tego automatycznie zgodnie z wymaganiami interfejsu API (#1169). (#966).
- Rozwiązaliśmy problem polegający na tym, że obsługa informacji o kolorach HDR powoduje nieprawidłowe działanie kodeka i uniemożliwia adaptacyjne przełączanie formatu na ścieżkach wideo SDR (#1158).
- Tekst:
- WebVTT: zapobiega tworzeniu fałszywych dodatkowych instancji
CuesWithTiming
bezpośrednio z rzęduWebvttParser.parse
(#1177).
- WebVTT: zapobiega tworzeniu fałszywych dodatkowych instancji
- DRM:
- Obejście problemu
NoSuchMethodError
, który może być wywoływany przez platformęMediaDrm
zamiastResourceBusyException
lubNotProvisionedException
na niektórych urządzeniach z Androidem 14 (#1145).
- Obejście problemu
- Efekt:
- Ulepszono mapowanie tonów PQ na SDR dzięki konwertowaniu przestrzeni kolorów.
- Sesja:
- Interfejs:
- Jeśli
Locale
nie może rozpoznać wyświetlanej nazwy, dodaj nazwę języka ścieżki audio (#988).
- Jeśli
- Rozszerzenie DASH:
- Wypełnij wszystkie elementy
Label
z pliku manifestu w elemencieFormat.labels
(#1054).
- Wypełnij wszystkie elementy
- Rozszerzenie RTSP:
- Pomiń puste wartości informacji o sesji (tagi i) podczas analizy 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 w zależności lokalnej, mogą go ponownie włączyć.
Wersja 1.3.0
6 marca 2024 roku
Aplikacja androidx.media3:media3-*:1.3.0
została zwolniona.
Wersja 1.3.0 zawiera te zatwierdzenia.
- Wspólna biblioteka:
- Zaimplementuj obsługę identyfikatorów URI nieprzetworzonych zasobów
android.resource://package/[type/]name
, gdziepackage
różni się od pakietu bieżącej aplikacji. Zawsze było to udokumentowane, ale do tej pory nie udało się tego wprowadzić. - Normalizuj typy MIME ustawione przez kod aplikacji lub odczytywane z multimediów, aby zapisywać je w całości małymi literami.
- Zdefiniuj reklamy, używając w polu
AdPlaybackState
pełnej wartościMediaItem
zamiast pojedynczegoUri
. - Zwiększ
minSdk
do 19 (Android KitKat). Jest on spójny ze wszystkimi pozostałymi bibliotekami AndroidaX i jest wymagany do uaktualnienia do najnowszych wersji zależności AndroidX. - Jeśli co najmniej 1 z nich nie ma wartości null (#964), wypełnij pola
artworkUri
iartworkData
w poluMediaMetadata.Builder.populate(MediaMetadata)
.
- Zaimplementuj obsługę identyfikatorów URI nieprzetworzonych zasobów
- ExoPlayer:
- Dodaj zasady
PreloadMediaSource
iPreloadMediaPeriod
, które umożliwiają aplikacjom wstępne wczytywanie źródła multimediów z określoną pozycją początkową przed odtworzeniem treści.PreloadMediaSource
przygotowuje źródło multimediów do odbioruTimeline
, przygotowuje okres do buforowania w danej pozycji początkowej oraz wybiera ścieżki i wczytuje dane multimediów z tego okresu. Aplikacje kontrolują postęp wstępnego wczytywania, implementującPreloadMediaSource.PreloadControl
i konfigurując wstępnie wczytane źródło jako odtwarzacz do odtwarzania. - Dodaj właściwość
ExoPlayer.setImageOutput
, która zezwala aplikacjom na ustawienieImageRenderer.ImageOutput
. DefaultRenderersFactory
domyślnie udostępnia graczowiImageRenderer
z wartościami nullImageOutput
iImageDecoder.Factory.DEFAULT
.- emituj zdarzenie
Player.Listener.onPositionDiscontinuity
, gdy cisza jest pominięta (#765). - Dodaj eksperymentalną obsługę analizy napisów podczas wyodrębniania. Możesz to włączyć za pomocą
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
. - Obsługuj adaptacyjne źródła multimediów za pomocą
PreloadMediaSource
. - Zaimplementuj
HttpEngineDataSource
(HttpDataSource
) za pomocą interfejsu API HttpEngine. - Zapobiegaj podklasyfikacji
CompositeSequenceableLoader
. Ten komponent został wcześniej rozszerzany, ale nigdy nie został dodany do podklasy w bibliotece. Dostosowanie można dostosować, pakując instancję za pomocą wzorca dekoratora i wdrażając niestandardowy parametrCompositeSequenceableLoaderFactory
. - Rozwiązaliśmy problem polegający na tym, że powtarzanie tej samej godziny powoduje wyczyszczenie metadanych z tego elementu (#1007).
- Zmień nazwy metod
experimentalSetSubtitleParserFactory
wBundledChunkExtractor.Factory
iDefaultHlsExtractorFactory
nasetSubtitleParserFactory
i nie zezwalaj na przekazywanienull
. Użyj nowych metodexperimentalParseSubtitlesDuringExtraction(boolean)
, aby kontrolować analizowanie zachowania. - Dodano obsługę dostosowywania elementu
SubtitleParser.Factory
używanego podczas wyodrębniania. Można to osiągnąć za pomocą funkcjiMediaSource.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). - Popraw wyrażenie regularne używane do weryfikacji nazw kluczy niestandardowych danych klienta Common Media Client Data (CMCD), modyfikując je tak, aby sprawdzały tylko łącznik (#1028).
- Zatrzymaj podwójne kodowanie parametrów zapytania CMCD (#1075).
- Dodaj zasady
- Transformer:
- Dodano obsługę spłaszczenia filmów w zwolnionym tempie H.265/HEVC SEF.
- Zwiększ szybkość transmiksowania, zwłaszcza w przypadku opcji „usuwanie filmu”.
- Dodaj interfejs API, aby mieć pewność, że plik wyjściowy rozpoczyna się od klatki wideo. Dzięki temu dane wyjściowe operacji przycinania mogą być bardziej zgodne z implementacjami odtwarzacza, które nie pokazują pierwszej klatki filmu aż do sygnatury czasowej prezentacji (#829).
- Dodaj obsługę optymalizacji operacji przycinania pojedynczego zasobu w formacie MP4.
- Dodaj obsługę, aby klatka wideo miała w pliku wyjściowym pierwszą sygnaturę czasową. Poprawia pliki wyjściowe rozpoczynające się od czarnej ramki w odtwarzaczach opartych na iOS (#829).
- Wybór ścieżki:
- Dodaj
DefaultTrackSelector.selectImageTrack
, aby włączyć wybór ścieżki obrazu. - Dodaj
TrackSelectionParameters.isPrioritizeImageOverVideoEnabled
, aby określić, czy chcesz wybrać ścieżkę obrazu, jeśli dostępna jest zarówno ścieżka graficzna, jak i wideo. Wartością domyślną jestfalse
, co oznacza, że wybór ścieżki wideo jest priorytetem.
- Dodaj
- Moduły wyodrębniania:
- Dodaj dodatkową analizę AV1C do wyodrębniania MP4, aby pobrać wartości
ColorInfo.colorSpace
,ColorInfo.colorTransfer
iColorInfo.colorRange
(#692). - MP3: użyj wyszukiwania ze stałą szybkością transmisji bitów (CBR) w przypadku plików z nagłówkiem
Info
(odpowiednik CBR nagłówkaXing
). Wcześniej używaliśmy tabeli wyszukiwania z nagłówkaInfo
, ale wyniki wyszukiwania są mniej dokładne niż w przypadku zignorowania jej i założenia, że plik to CBR. - MPEG2-TS: dodaj obsługę DTS, DTS-LBR i DTS:X Profile2 (#275).
- Wyodrębnianie typów audio z deskryptorów zadań i mapowanie ich na flagi ról, co umożliwia użytkownikom podejmowanie bardziej świadomych decyzji dotyczących ścieżek audio (#973).
- Dodaj dodatkową analizę AV1C do wyodrębniania MP4, aby pobrać wartości
- Dźwięk:
- Film:
- Zmień konstruktor
MediaCodecVideoRenderer
, który przyjmuje argumentVideoFrameProcessor.Factory
i zastąp go konstruktorem, który przyjmuje argumentVideoSinkProvider
. Aplikacje, które chcą wstrzykiwać niestandardowyVideoFrameProcessor.Factory
, mogą utworzyć instancjęCompositingVideoSinkProvider
, która korzysta z niestandardowego elementuVideoFrameProcessor.Factory
, i przekazać dostawcę ujścia wideo doMediaCodecVideoRenderer
.
- Zmień konstruktor
- Tekst:
- Popraw serializację wskazówek bitmapy, aby naprawić błąd
Tried to marshall a Parcel that contained Binder objects
podczas korzystania zDefaultExtractorsFactory.setTextTrackTranscodingEnabled
(#836). - CEA-708: ignoruj wartość
rowLock
. Zgodnie ze specyfikacją CEA-708-E S-2023 obie funkcjerowLock
icolumnLock
powinny być traktowane jako prawdziwe niezależnie od wartości w strumieniu (obsługa parametrucolumnLock
nie jest zaimplementowana, więc w praktyce przyjmuje się, że zawsze ma wartość fałsz).
- Popraw serializację wskazówek bitmapy, aby naprawić błąd
- Obraz:
- Dodano obsługę miniatur DASH. Obrazy siatki są przycinane, a pojedyncze miniatury są wyświetlane
ImageOutput
w czasie zbliżonym do czasu prezentacji.
- Dodano obsługę miniatur DASH. Obrazy siatki są przycinane, a pojedyncze miniatury są wyświetlane
- DRM:
- Domyślnie odtwarzaj niezaszyfrowane próbki „czystych potencjalnych klientów” od razu w treściach DRM, nawet jeśli klucze późniejszych zaszyfrowanych próbek nie są jeszcze gotowe. Może to spowodować zatrzymanie odtwarzania w trakcie odtwarzania, jeśli klucze nadal nie będą gotowe, gdy w miejscu odtwarzania będą odtwarzane zaszyfrowane próbki (ale wcześniej odtwarzanie w ogóle się nie rozpoczęło). To zachowanie można wyłączyć za pomocą metody
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey
lubDefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
.
- Domyślnie odtwarzaj niezaszyfrowane próbki „czystych potencjalnych klientów” od razu w treściach DRM, nawet jeśli klucze późniejszych zaszyfrowanych próbek nie są jeszcze gotowe. Może to spowodować zatrzymanie odtwarzania w trakcie odtwarzania, jeśli klucze nadal nie będą gotowe, gdy w miejscu odtwarzania będą odtwarzane zaszyfrowane próbki (ale wcześniej odtwarzanie w ogóle się nie rozpoczęło). To zachowanie można wyłączyć za pomocą metody
- Rozszerzenie IMA:
- Rozwiązanie problemu, który powodował, że nie można było odtwarzać reklam DASH i HLS bez odpowiedniego rozszerzenia pliku.
- Sesja:
- Wyłącz wykrywanie dwukrotnego kliknięcia w przypadku aplikacji na telewizory (#962).
- Rozwiązanie problemu polegającego na tym, że funkcja
MediaItem.RequestMetadata
z samymi dodatkami niezerowymi nie była przesyłana między kontrolerami multimediów a sesjami. - Dodaj do
MediaLibrarySession.Builder
konstruktor, który wymaga tylkoContext
zamiastMediaLibraryService
.
- Rozszerzenie HLS:
- Ogranicz
HlsMediaPeriod
, aby uzyskać widoczność pakietów. Ten typ nie powinien zależeć od źródła spoza pakietu HLS. - Rozwiąż powoduje efektywniejsze rozpoczynanie segmentu (#1031).
- Ogranicz
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Dekoder MIDI: ignoruj komunikaty o zdarzeniach SysEx (#710).
- Narzędzia testowe:
- Nie wstrzymuj odtwarzania w
TestPlayerRunHelper.playUntilPosition
. Test zachowuje odtwarzanie w stanie odtwarzania, ale zawiesza postęp do czasu, aż będzie w stanie dodać asercje i kolejne działania.
- Nie wstrzymuj odtwarzania w
- Aplikacja w wersji demonstracyjnej:
- Dodaj krótki moduł demonstracyjny, aby zademonstrować użycie elementu
PreloadMediaSource
w przypadku użycia krótkich treści.
- Dodaj krótki moduł demonstracyjny, aby zademonstrować użycie elementu
Wersja 1.3.0-rc01
22 lutego 2024 r.
Używaj wersji stabilnej 1.3.0.
Wersja 1.3.0-beta01
7 lutego 2024 r.
Używaj wersji stabilnej 1.3.0.
Wersja 1.3.0-alfa01
15 stycznia 2024 r.
Używaj wersji stabilnej 1.3.0.
Wersja 1.2.0
Wersja 1.2.1
Styczeń 9, 2024
- ExoPlayer:
- Rozwiąż problem polegający na tym, że ręczne wyszukiwanie wykraczające poza zakres
LiveConfiguration.min/maxOffset
powoduje ponowne dostosowywanie przesunięcia domin/maxOffset
. - Rozwiązano problem z nieprawidłowym układem kanałów OPUS i VORBIS na 3, 5, 6, 7 i 8 kanałach (#8396).
- Rozwiązanie problemu polegającego na tym, że wybór utworu po przesunięciu na zero w transmisji na żywo uniemożliwiał nieprawidłowe rozpoczęcie transmisji od pozycji domyślnej (#9347).
- Rozwiąż problem, który powodował, że nowe wystąpienia parametru
CmcdData.Factory
otrzymywały wartości ujemne dla parametrubufferedDurationUs
ze źródeł fragmentarycznych, czego wynikiem byłIllegalArgumentException
(#888).
- Rozwiąż problem polegający na tym, że ręczne wyszukiwanie wykraczające poza zakres
- Transformer:
- Obejmij problem, który powoduje wystąpienie błędu przez koder w czasie konfiguracji z powodu ustawienia wysokiej szybkości działania.
- Moduły wyodrębniania:
- Oznacz dodatkowe (nieodtwarzane) ścieżki HEVC na zdjęciach ruchomych JPEG jako
ROLE_FLAG_ALTERNATE
, aby nie były automatycznie wybierane do odtwarzania ze względu na ich wyższą rozdzielczość. - Naprawianie nieprawidłowego wykrywania klatek kluczowych w przypadku strumieni TS H264 (#864).
- Popraw szacowany czas trwania strumieni TS dłuższych niż 47 721 sekund (#855).
- Oznacz dodatkowe (nieodtwarzane) ścieżki HEVC na zdjęciach ruchomych JPEG jako
- Dźwięk:
- Poprawiono obsługę EOS dla elementu
SilenceSkippingAudioProcessor
przy wielokrotnym wywołaniu (#712).
- Poprawiono obsługę EOS dla elementu
- Film:
- Dodaj obejście problemu z urządzeniem na urządzeniu Galaxy Tab S7 FE, Chromecast z Google TV i Lenovo M10 FHD Plus, które powoduje oznaczenie strumieni AVC 60 kl./s jako nieobsługiwanego (#693).
- Metadane:
- Poprawiono błąd, w którym pole
MediaMetadata
było wypełniane tylko z komentarzy Vorbis wielkimi literami (#876). - Przechwytuj
OutOfMemoryError
podczas analizowania bardzo dużych klatek ID3, co oznacza, że odtwarzanie może być kontynuowane bez informacji o tagu, zamiast zakończyć się niepowodzeniem.
- Poprawiono błąd, w którym pole
- DRM:
- Rozszerz obejście fałszywie adresu URL licencji ClearKey
https://default.url
do interfejsu API na poziomie 33 lub wyższym (wcześniej było to rozwiązanie stosowane dokładnie tylko w interfejsie API 33) (#837). - Naprawa
ERROR_DRM_SESSION_NOT_OPENED
przy przechodzeniu z zaszyfrowanej treści na usunięcie treści bez platformy z odtwarzaczem. Błąd wynikał z nieprawidłowego użycia bezpiecznego dekodera do odtwarzania wyraźnych treści.
- Rozszerz obejście fałszywie adresu URL licencji ClearKey
- Sesja:
- Umieść niestandardowe klucze i wartości w zakresie
MediaMetadataCompat
wMediaMetadata.extras
, aMediaMetadata.extras
doMediaMetadataCompat
(#756, #802). - Napraw przesyłanie obrazu
notifyChildrenChanged
w przypadku starszych kontrolerów (#644). - Poprawiono błąd polegający na tym, że ustawienie negatywnego czasu wyłączenia licznika czasu powiadomienia
setWhen
powodowało awarię na niektórych urządzeniach (#903). - Napraw błąd
IllegalStateException
, jeśli kontroler powiadomień o multimediach nie został dokończony w chwili wysłania prośby o pierwszą aktualizację powiadomienia (#917).
- Umieść niestandardowe klucze i wartości w zakresie
- Interfejs:
- Rozwiązanie problemu polegającego na tym, że przyciski przewijania do przodu i do tyłu były niewidoczne w przypadku użycia interfejsu Material Design w elemencie bottomSheetDialogFragment (#511).
- Rozwiąż problem z niewłaściwie wyrównanymi liczbami w przycisku szybkiego przewijania w elemencie
PlayerControlView
(nr 547).
- Rozszerzenie DASH:
- Przeanalizuj „f800” jako liczbę kanałów Dolby wynoszącą 5 w pliku manifestu DASH (#688).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Rozszerzenie Cast:
- Ponownie przeprowadź proces tworzenia obiektu
Timeline
, aby nie dopuścić do awarii aplikacji w przypadku niepowodzenia wczytywania multimediów na urządzeniu przesyłającym (#708).
- Ponownie przeprowadź proces tworzenia obiektu
Wersja 1.2.0
15 listopada 2023 r.
- Wspólna biblioteka:
- Dodaj parametr
@Nullable Throwable
do metod w interfejsieLog.Logger
. Parametrmessage
w tych metodach nie zawiera już żadnych informacji o elementachThrowable
przekazywanych do metodLog.{d,i,w,e}()
, więc w razie potrzeby implementacje będą musiały dołączać te informacje ręcznie (np. z użyciemLogger.appendThrowableString(String, Throwable)
). - Rozwiązanie problemu ze zgodnością z Kotlinem, który polegał na tym, że ogólne parametry typu z wartością null i typy elementów tablicy z wartością null nie są wykrywane jako null. Przykładami są parametry metody
TrackSelectorResult
iSimpleDecoder
(#6792). - Zmień domyślny interfejs i działanie powiadomień w
Util.shouldShowPlayButton
, by wyświetlać przycisk odtwarzania, gdy odtwarzanie jest tymczasowo wyłączone (np. z powodu chwilowej utraty ostrości dźwięku). Starszą wersję można zachować, używając instrukcjiPlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)
lubMediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)
(#11213). - Uaktualnij
androidx.annotation:annotation-experimental
do1.3.1
, by naprawić problem https://issuetracker.google.com/251172715. - Przenieś aplikację
ExoPlayer.setAudioAttributes
do interfejsuPlayer
.
- Dodaj parametr
- ExoPlayer:
- Rozwiązanie problemów z wyszukiwaniem w strumieniach AC4 spowodowanych nieprawidłowym identyfikacją próbek tylko do dekodowania (#11000).
- Dodaj blokowanie odtwarzania na nieodpowiednich urządzeniach wyjściowych audio (np. we wbudowanym głośniku w urządzeniach z Wear OS), gdy ta funkcja jest włączona w
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput
. Przyczyna wstrzymania odtwarzania zostanie zaktualizowana jakoPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
, jeśli próba odtwarzania zostanie podjęta, gdy odpowiednie wyjścia audio nie będą dostępne lub jeśli wszystkie odpowiednie wyjścia zostaną odłączone podczas odtwarzania. Przyczyna pominięcia zostanie usunięta po podłączeniu odpowiedniego wyjścia. - Dodaj
MediaSource.canUpdateMediaItem
iMediaSource.updateMediaItem
, aby zaakceptowaćMediaItem
aktualizacje po ich utworzeniu wPlayer.replaceMediaItem(s)
. - Zezwalaj na aktualizacje
MediaItem
we wszystkich klasachMediaSource
udostępnianych przez bibliotekę za pomocąPlayer.replaceMediaItem(s)
(#33, #9978). - Zmień nazwę
MimeTypes.TEXT_EXOPLAYER_CUES
naMimeTypes.APPLICATION_MEDIA3_CUES
. - Dodaj do
TrackOutput
plikPngExtractor
, który wysyła i odczytuje cały plik PNG, jako jeden przykładowy plik. - Ulepsz metodę
SequenceableLoader.continueLoading(long)
w interfejsieSequenceableLoader
doSequenceableLoader.continueLoading(LoadingInfo loadingInfo)
.LoadingInfo
zawiera dodatkowe parametry, m.in.playbackSpeed
ilastRebufferRealtimeMs
, oprócz obecnego parametruplaybackPositionUs
. - Ulepsz metodę
ChunkSource.getNextChunk(long, long, List, ChunkHolder)
w interfejsieChunkSource
doChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
. - Dodaj do rejestrowania Common Media Client Data (CMCD) dodatkowe pola: brak buforowania (
bs
), termin (dl
), szybkość odtwarzania (pr
) i uruchomienie (su
) (#8699). - Dodaj Luma i głębię kolorów chroma do wartości
ColorInfo
(#491). - Dodaj kolejne pola do rejestrowania CMCD: żądanie następnego obiektu (
nor
) i żądanie następnego zakresu (nrr
) (#8699). - Dodaj funkcje umożliwiające przesyłanie danych CMCD za pomocą parametrów zapytania (#553).
- Napraw
ConcurrentModificationException
wExperimentalBandwidthMeter
(#612). - Dodaj parametr
MediaPeriodId
do parametruCompositeMediaSource.getMediaTimeForChildMediaTime
. - Obsługują funkcję
ClippingMediaSource
(i inne źródła z przesunięciem przedziału czasu i okresu) w elemencieConcatenatingMediaSource2
(#11226). - Zmień
BaseRenderer.onStreamChanged()
, aby otrzymywał też argumentMediaPeriodId
.
- Transformer:
- Analizuj dane EXIF o obrotach pod kątem zdjęć wejściowych.
- Usuń typ adnotacji
TransformationRequest.HdrMode
i powiązane z nim stałe. Użyj zamiast niego parametruComposition.HdrMode
i powiązanych z nim stałych. - Aby rozwiązać problemy z rotacją, uprość atrybut
OverlaySettings
. - Zmieniono parametry
frameRate
idurationUs
w przypadkuSampleConsumer.queueInputBitmap
naTimestampIterator
.
- Wybór ścieżki:
- Dodaj element
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness
, aby jednoznacznie zezwolić na nie płynną adaptację lub go zabronić. Domyślnie ustawiona jest wartośćtrue
.
- Dodaj element
- Moduły wyodrębniania:
- MPEG-TS: upewnij się, że ostatnia klatka jest renderowana, przekazując ostatnią jednostkę dostępu do strumienia do kolejki próbki (#7909).
- Popraw literówkę przy określaniu
rotationDegrees
. ZmienionoprojectionPosePitch
naprojectionPoseRoll
(#461). - Odejmij założenie, że instancje
Extractor
można zbadać bezpośrednio za pomocą metodyinstanceof
. Jeśli chcesz mieć dostęp w czasie działania do szczegółów implementacji obiektuExtractor
, musisz najpierw wywołać metodęExtractor.getUnderlyingInstance
. - Dodaj
BmpExtractor
. - Dodaj
WebpExtractor
. - Dodaj
HeifExtractor
. - Dodaj obsługę klasycznej wersji QuickTime do pliku
Mp4Extractor
.
- Dźwięk:
- Dodaj obsługę 24-/32-bitowego typu big-endian PCM w formatach MP4 i Matroska oraz analizuj kodowanie PCM dla
lpcm
w formacie MP4. - Dodano obsługę wyodrębniania dźwięku z Vorbis w formacie MP4.
- Dodaj atrybut
AudioSink.getFormatOffloadSupport(Format)
, który pobiera poziom odciążenia, który umożliwia ujście dla formatu za pomocąDefaultAudioOffloadSupportProvider
. Zwraca nowyAudioOffloadSupport
, który zawieraisFormatSupported
,isGaplessSupported
iisSpeedChangeSupported
. - Dodaj
AudioSink.setOffloadMode()
, za pomocą którego skonfigurowana jest konfiguracja odciążania w ujściem audio. Wartość domyślna toAudioSink.OFFLOAD_MODE_DISABLED
. - Odciążanie można włączyć za pomocą funkcji
setAudioOffloadPreference
w narzędziuTrackSelectionParameters
. Jeśli ustawienie jest włączone, urządzenie będzie obsługiwać odrzucanie formatu, a wybrana ścieżka to pojedyncza ścieżka dźwiękowa. - Jeśli
audioOffloadModePreference
ma wartośćAUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED
,DefaultTrackSelector
wybierze tylko ścieżkę audio i tylko wtedy, gdy jej format jest obsługiwany w przenoszeniu. Jeśli nie obsługujemy żadnej ścieżki audio, nie zostanie wybrana żadna ścieżka audio. - Wyłączenie obsługi braku przerw w odtwarzaniu na poziomie 33 przed interfejsem API z powodu problemu z pozycją odtwarzania po przejściu ścieżki.
- Usuń parametr
enableOffload
z podpisu metodyDefaultRenderersFactory.buildAudioSink
. - Usuń metodę
DefaultAudioSink.Builder.setOffloadMode
. - Usuń wartość nieoznaczoną jako
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
. - Dodano obsługę metadanych Opus bez luk w odtwarzaniu.
- Zezwalaj na przywracanie mechanizmu renderowania przez wyłączenie przeciążenia w przypadku niepowodzenia przy pierwszym zapisie (#627).
- W przypadku odtwarzania z wyłączonym dźwiękiem włącz domyślnie harmonogram odciążania.
- Usuń
ExoPlayer.experimentalSetOffloadSchedulingEnabled
iAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
. - Zmieniono nazwę
onExperimentalSleepingForOffloadChanged
naonSleepingForOffloadChanged
, aonExperimentalOffloadedPlayback
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
) do metodAnalyticsListener
,AudioRendererEventListener
iAudioSink.Listener
. - Rozwiązano problem z niedostatecznym przepływem danych w buforze audio DTS Express (#650).
- Naprawa błędu, który powodował, że kontrola możliwości E-AC3-JOC powoduje błąd
IllegalArgumentException
(#677).
- Dodaj obsługę 24-/32-bitowego typu big-endian PCM w formatach MP4 i Matroska oraz analizuj kodowanie PCM dla
- Film:
- Zezwól przeglądarce
MediaCodecVideoRenderer
na używanie niestandardowego elementuVideoFrameProcessor.Factory
. - Naprawa błędu polegającego na tym, że nie można było wyrenderować pierwszej klatki, gdy strumień audio rozpoczyna się od ujemnych sygnatur czasowych (#291).
- Zezwól przeglądarce
- Tekst:
- Usuń
ExoplayerCuesDecoder
. Ścieżki tekstowe z atrybutemsampleMimeType = application/x-media3-cues
są teraz obsługiwane bezpośrednio przez usługęTextRenderer
bez konieczności użycia instancjiSubtitleDecoder
.
- Usuń
- Metadane:
- Funkcja
MetadataDecoder.decode
nie będzie już wywoływana w przypadku przykładów „tylko do dekodowania”, ponieważ implementacja i tak musi zwracać wartość null.
- Funkcja
- Efekt:
- Dodaj dane wejściowe bitmapy
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)
według sygnatury czasowej. - Zmień
VideoFrameProcessor.registerInputStream()
na nieblokujący. Aplikacje muszą implementowaćVideoFrameProcessor.Listener#onInputStreamRegistered()
. - Zmieniono parametry
frameRate
idurationUs
w przypadkuVideoFrameProcessor.queueInputBitmap
naTimestampIterator
.
- Dodaj dane wejściowe bitmapy
- Rozszerzenie IMA:
- Poprawka błędu, który powodował, że transmisja na żywo DASH z wieloma przedziałami czasu, która nie jest pierwszym elementem playlisty, może zgłaszać wyjątek (#571).
- Zwolnij StreamManagera, zanim zadzwonisz do:
AdsLoader.destroy()
- Uaktualnij pakiet IMA SDK do wersji 3.31.0.
- Sesja:
- Ustaw działanie usługi powiadomień na pierwszym planie na
FOREGROUND_SERVICE_IMMEDIATE
w:DefaultMediaNotificationProvider
(#167). - Używaj tylko interfejsu
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()
powyżej interfejsu API 31, aby uniknąć problemów z wycofanym interfejsem API na urządzeniach Samsung (nr 167). - Używaj kontrolera powiadomień o multimediach jako serwera proxy, aby ustawiać dostępne polecenia i niestandardowy układ służący do wypełniania powiadomienia i sesji na platformie.
- Konwertuj zdarzenia przycisku multimediów odbierane przez usługę
MediaSessionService.onStartCommand()
w Media3, zamiast przekierowywać je do sesji na platformie i z powrotem do Media3. Dzięki temu element wywołujący jest zawsze kontrolerem powiadomień multimedialnych, a aplikacje mogą łatwo rozpoznawać wywołania pochodzące z powiadomień w taki sam sposób na wszystkich obsługiwanych poziomach API. - Napraw błąd, który sprawia, że interfejs
MediaController.getCurrentPosition()
nie jest awansowany po połączeniu ze starszą wersją systemuMediaSessionCompat
. - Dla wygody dodaj:
MediaLibrarySession.getSubscribedControllers(mediaId)
. - Zastąp
MediaLibrarySession.Callback.onSubscribe()
, aby potwierdzić dostępność identyfikatora nadrzędnego, który subskrybuje kontroler. Jeśli subskrypcja się powiedzie, subskrypcja zostanie zaakceptowana inotifyChildrenChanged()
zostanie natychmiast wywołana w celu przekazania informacji do przeglądarki (#561). - Dodaj moduł demonstracyjny sesji dla systemu operacyjnego Automotive i włącz demonstrację sesji w Androidzie Auto.
- Nie ustawiaj kolejki sesji platformy, gdy kontroler powiadomień o multimediach nie ma dostępu do
COMMAND_GET_TIMELINE
. Gdy Android Auto jako kontroler klienta odczytuje dane z sesji platformy, przyciskqueue
w interfejsie Androida Auto nie jest wyświetlany (nr 339). - Zamiast
SimpleBitmapLoader
używaj domyślnie polaDataSourceBitmapLoader
(#271, #327). - Dodaj
MediaSession.Callback.onMediaButtonEvent(Intent)
, który pozwoli aplikacjom na zastępowanie domyślnej obsługi zdarzeń przycisku multimediów.
- Ustaw działanie usługi powiadomień na pierwszym planie na
- Interfejs:
- Dodaj implementację
Player.Listener
na urządzeniach z Wear OS, które obsługują blokowanie odtwarzania z powoduPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
.W tym celu uruchom okno systemowe, aby umożliwić użytkownikowi podłączenie odpowiedniego wyjścia audio (np. słuchawek Bluetooth). Detektor automatycznie wznowi odtwarzanie, jeśli odpowiednie urządzenie zostanie podłączone w konfigurowanym czasie oczekiwania (domyślnie wynosi 5 minut).
- Dodaj implementację
- Pobrane pliki:
- Zadeklaruj typ usługi na pierwszym planie typu „synchronizacja danych” na potrzeby
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 typu „synchronizacja danych” na potrzeby
- Rozszerzenie HLS:
- Odśwież playlistę na żywo HLS, podając odstęp obliczony na podstawie czasu rozpoczęcia ostatniego wczytywania, a nie czasu ostatniego wczytywania (#663).
- Rozszerzenie DASH:
- Zezwalaj na używanie wielu takich samych identyfikatorów DASH w adresie URL szablonu segmentu.
- Dodaj eksperymentalną obsługę analizy napisów podczas wyodrębniania. Lepsza obsługa scalania nakładających się napisów, w tym rozwiązanie migotania podczas przechodzenia między segmentami napisów. Aby to zrobić, użyj parametru
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
(#288).
- Rozszerzenie RTSP:
- Napraw warunek wyścigu, który może powodować występowanie błędu
IndexOutOfBoundsException
przy powrocie do TCP lub zawieszanie odtwarzania w niektórych sytuacjach. - Sprawdź stan w konfiguracji RTSP po zwróceniu stanu wczytywania
RtspMediaPeriod
(#577). - Ignoruj niestandardowe metody żądań Rtsp w nagłówku publicznym odpowiedzi w opcjach (#613).
- Używaj wartości limitu czasu na konfigurację protokołu RTSP w przedziale czasu wysyłania żądań dotyczących opcji utrzymywania aktywności RTSP (#662).
- Napraw warunek wyścigu, który może powodować występowanie błędu
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Opublikuj moduł dekodera MIDI, który obsługuje odtwarzanie standardowych plików MIDI przy użyciu biblioteki Jsyn do syntezy dźwięku.
- Dodaj
DecoderOutputBuffer.shouldBeSkipped
, aby bezpośrednio oznaczyć bufory danych wyjściowych, których nie trzeba prezentować. Jest to preferowane rozwiązanie do zasobówC.BUFFER_FLAG_DECODE_ONLY
, które zostaną wycofane. - Dodaj
Decoder.setOutputStartTimeUs
iSimpleDecoder.isAtLeastOutputStartTimeUs
, aby umożliwić dekoderom pomijanie próbek tylko do dekodowania przed czasem rozpoczęcia. Używaj go zamiast właściwościBuffer.isDecodeOnly
, które zostaną wycofane. - Naprawiono błąd publikowania artefaktu dekodera MIDI w repozytorium Maven. Nazwa artefaktu to
media3-exoplayer-midi
(#734).
- Rozszerzenie BeyondCorp:
- Napraw błąd, który powodował, że wyłączenie platformy mogło spowodować pojawienie się błędu
ArithmeticException
w kodzie Leanback (#617).
- Napraw błąd, który powodował, że wyłączenie platformy mogło spowodować pojawienie się błędu
- Narzędzia testowe:
- Zadbaj o zgodność
TestExoPlayerBuilder
iFakeClock
z testami interfejsu Espresso i testami interfejsu Compose. Naprawiliśmy błąd polegający na tym, że odtwarzanie przesuwa się niedeterminalnie podczas interakcji z widokiem Espresso lub Compose.
- Zadbaj o zgodność
- Usuń wycofane symbole:
- Usuń
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)
iTransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)
. UżyjComposition.Builder.setHdrMode(int)
i przekażComposition
zamiast tego doTransformer.start(Composition, String)
. - Usuń wycofaną metodę
DownloadNotificationHelper.buildProgressNotification
. Użyj niewycofywanej metody, która przyjmuje parametrnotMetRequirements
.
- Usuń
Wersja 1.2.0-rc01
1 listopada 2023 roku
Używaj wersji stabilnej 1.2.0.
Wersja 1.2.0-beta01
19 października 2023 r.
Używaj wersji stabilnej 1.2.0.
Wersja 1.2.0-alfa02
29 września 2023 r.
Używaj wersji stabilnej 1.2.0.
Wersja 1.2.0-alfa01
17 sierpnia 2023 r.
Używaj wersji stabilnej 1.2.0.
Wersja 1.1.0
Wersja 1.1.1
16 sierpnia 2023 r.
- Wspólna biblioteka:
- Usuń przypadkowo dodaną zależność
multidex
ze wszystkich modułów (#499).
- Usuń przypadkowo dodaną zależność
- ExoPlayer:
- Naprawiono błąd w elemencie
PlaybackStatsListener
, który powodował, że po wyczyszczeniu playlisty tworzone są fałszywePlaybackStats
. - Dodaj do rejestrowania Common Media Client Data (CMCD) dodatkowe pola: format strumieniowania (sf), typ strumienia (st), wersja (v), górny szybkość transmisji bitów (tb), czas trwania obiektu (d), zmierzoną przepustowość (mtp) i typ obiektu (#8699).
- Naprawiono błąd w elemencie
- Dźwięk:
- Poprawiono błąd, który powodował, że usługa
Player.getState()
nigdy nie była uaktualniana doSTATE_ENDED
podczas odtwarzania bardzo krótkich plików (#538).
- Poprawiono błąd, który powodował, że usługa
- Obciążenie dźwiękiem:
- Dołącz strony nagłówka identyfikatora Ogg na początku i nagłówki komentarzy do strumienia bitów, aby zmniejszyć obciążenie odtwarzania Opus zgodnie ze standardem RFC 7845.
- Film:
- H.265/HEVC: naprawiono analizowanie krótko- i długoterminowych informacji referencyjnych dotyczących obrazów w SPS.
- Tekst:
- CEA-608: zmień zasady obcinania wskazówek tak, by uwzględniały tylko widoczny tekst. Dotychczasowe wcięcie i przesunięcie tabulatora były uwzględniane przy ograniczaniu długości wstawienia do 32 znaków (co było technicznie poprawne w specyfikacji) (#11019).
- Rozszerzenie IMA:
- Uaktualnij pakiet IMA SDK do wersji 3.30.3.
- Sesja:
- Dodaj układ niestandardowy do stanu kontrolera i udostępnij obiekt pobierający, który zapewnia do niego dostęp. W przypadku zmiany układu niestandardowego wywoływana jest właściwość
MediaController.Listener.onCustomLayoutChanged
. Aplikacje, które chcą wysyłać różne układy niestandardowe do różnych kontrolerów Media3, mogą to zrobić wMediaSession.Callback.onConnect
za pomocąAcceptedResultBuilder
, aby mieć pewność, że po zakończeniu połączenia ten układ będzie dostępny dla kontrolera. - Naprawiono przypadki, w których
MediaLibraryServiceLegacyStub
wysyłał błąd do interfejsuResult
, który nie obsługiwał tej czynności, co spowodowało błądUnsupportedOperationException
(78). - Rozwiąż problem ze sposobem, w jaki
PlayerWrapper
tworzyVolumeProviderCompat
, wskazując typvolumeControlType
za pomocą zarówno starszych poleceń (COMMAND_ADJUST_DEVICE_VOLUME
iCOMMAND_SET_DEVICE_VOLUME
), jak i nowych poleceń (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
iCOMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
) (#554).
- Dodaj układ niestandardowy do stanu kontrolera i udostępnij obiekt pobierający, który zapewnia do niego dostęp. W przypadku zmiany układu niestandardowego wywoływana jest właściwość
Wersja 1.1.0
5 lipca 2023 r.
- Wspólna biblioteka:
- Dodaj przyczynę pominięć w przypadku nieodpowiedniej trasy audio i odtwarzaj w przypadku gotowej zmiany jako przyczyna zbyt długiego wstrzymania odtwarzania. (#15).
- Dodaj polecenia do odtwarzacza:
COMMAND_GET_METADATA
COMMAND_SET_PLAYLIST_METADATA
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- Dodaj do odtwarzacza przeciążone metody, które pozwalają użytkownikom określać flagi głośności:
void setDeviceVolume(int, int)
void increaseDeviceVolume(int)
void decreaseDeviceVolume(int)
void setDeviceMuted(boolean, int)
- Dodaj element
Builder
do elementuDeviceInfo
i wycofaj istniejący konstruktor. - Dodaj
DeviceInfo.routingControllerId
, aby określić identyfikator kontrolera routingu na potrzeby odtwarzania zdalnego. - Dodaj
Player.replaceMediaItem(s)
jako skrót do dodawania i usuwania elementów na tej samej pozycji (#8046).
- ExoPlayer:
- Zezwól ExoPlayer na sterowanie metodami głośności urządzenia tylko po uzyskaniu wyraźnej zgody.
ExoPlayer.Builder.setDeviceVolumeControlEnabled
umożliwia dostęp do:getDeviceVolume()
isDeviceMuted()
setDeviceVolume(int)
isetDeviceVolume(int, int)
increaseDeviceVolume(int)
iincreaseDeviceVolume(int, int)
decreaseDeviceVolume(int)
idecreaseDeviceVolume(int, int)
- Dodaj atrybut
FilteringMediaSource
, który pozwoli filtrować dostępne typy ścieżek z tabeliMediaSource
. - Dodano obsługę uwzględniania danych klienta Common Media Client Data (CMCD) w żądaniach wychodzących adaptacyjnych formatów strumieniowania DASH, HLS i SmoothStream. Te pola
br
,bl
,cid
,rtp
isid
zostały uwzględnione (#8699). Struktura interfejsów API i metody API:- Logowanie CMCD jest domyślnie wyłączone. Aby je włączyć, użyj
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory)
. - Wszystkie klucze są domyślnie włączone. Zastąp
CmcdConfiguration.RequestConfig.isKeyAllowed(String key)
, aby odfiltrować zarejestrowane klucze. - Zastąp
CmcdConfiguration.RequestConfig.getCustomData()
, aby włączyć logowanie niestandardowych kluczy.
- Logowanie CMCD jest domyślnie wyłączone. Aby je włączyć, użyj
- Dodaj do pliku manifestu głównej wersji demonstracyjnej dodatkowe działanie, aby ułatwić uruchamianie aplikacji demonstracyjnej z użyciem niestandardowego pliku
*.exolist.json
(#439). - Dodaj
ExoPlayer.setVideoEffects()
za użycieEffect
podczas odtwarzania filmu. - Zaktualizuj
SampleQueue
, aby przechowywaćsourceId
jakolong
, a nieint
. Spowoduje to zmianę podpisów metod publicznychSampleQueue.sourceId
iSampleQueue.peekSourceId
. - Dodaj do metod
LoadControl
shouldStartPlayback
ionTracksSelected
parametry, które pozwolą powiązać te metody z odpowiednimi właściwościamiMediaPeriod
. - Zmień podpis obiektu
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)
, dodając parametr osi czasu zawierający okresy z identyfikatorami UID używanymi jako klucze na mapie. Jest to wymagane, aby uniknąć problemów z równoczesnością transmisji na żywo obejmujących kilka okresów. - Wycofaj
EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)
iBaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)
. Zamiast tego można wywołać wariant metod bez parametrumediaTimeOffsetUs
. Pamiętaj, że nawet w przypadku wycofanych wersji przesunięcie nie będzie już dodawane do wartościstartTimeUs
iendTimeUs
obiektówMediaLoadData
wysyłanych przez dyspozytora. - Zmień nazwę
ExoTrackSelection.blacklist
naexcludeTrack
iisBlacklisted
naisTrackExcluded
. - Rozwiąż problem z niespójnością działania funkcji
ExoPlayer.setMediaItem(s)
iaddMediaItem(s)
w przypadku wywołania pustej playlisty.
- Zezwól ExoPlayer na sterowanie metodami głośności urządzenia tylko po uzyskaniu wyraźnej zgody.
- Transformer:
- Usuń
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)
. Zamiast nich użyjExoPlayerAssetLoader.Factory(MediaSource.Factory)
iTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)
. - Usuń
Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
. - Naprawa błędu, który uniemożliwiał transformację (co prowadziło do przekroczenia limitu czasu miksera), jeśli sygnalizowany był koniec strumienia wideo w momencie, gdy klatka wejściowa oczekiwała na przetworzenie.
- Aby zwiększyć obsługę, wysyłaj zapytania o kodeki za pomocą
MediaCodecList
zamiast korzystać z narzędzifindDecoder/EncoderForFormat
. - Usuń konfigurację klatki B z
DefaultEncoderFactory
, ponieważ nie działa na niektórych urządzeniach.
- Usuń
- Wybór ścieżki:
- Dodaj element
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange
, który jest domyślnie wyłączony. Gdy ta opcja jest włączona,DefaultTrackSelector
aktywuje nowy wybór ścieżki w przypadku zmiany możliwości mechanizmu renderowania.
- Dodaj element
- Moduły wyodrębniania:
- Dźwięk:
- Naprawa błędu, który powodował, że niektóre odtworzenia kończyły się niepowodzeniem, gdy włączone jest tunelowanie, a plik
AudioProcessors
jest aktywny (np. w przypadku przycinania bez przerw (#10847). - Herbaty Opus w pakietach Ogg w ramach odtwarzania bezpośredniego (przeciążenia).
- Dzięki harmonogramowi przeciążenia możesz oszacować bieżącą pozycję podczas snu.
- Dodaj
Renderer.release()
iAudioSink.release()
, aby zwolnić zasoby na koniec cyklu życia gracza. - Słuchaj zmian w funkcjach audio w aplikacji
DefaultAudioSink
. Dodaj w konstruktorze elementuDefaultAudioSink
wymagany parametrcontext
, za pomocą któregoDefaultAudioSink
zarejestruje się jako odbiornikAudioCapabilitiesReceiver
i zaktualizuje swoją właściwośćaudioCapabilities
, gdy pojawi się informacja o zmianie możliwości. - Promuj zmiany możliwości audio za pomocą nowego zdarzenia
onAudioCapabilitiesChanged
w interfejsieAudioSink.Listener
i nowego interfejsuRendererCapabilities.Listener
, który uruchamia zdarzeniaonRendererCapabilitiesChanged
. - Dodaj
ChannelMixingAudioProcessor
, aby zastosować skalowanie/miksowanie do kanałów audio. - Dodaj nową wartość int
DISCARD_REASON_AUDIO_BYPASS_POSSIBLE
doDecoderDiscardReasons
, aby odrzucić dekoder dźwięku, gdy po zmianie możliwości audio możliwe jest korzystanie z trybu omijania. - Dodano obsługę odtwarzania bezpośredniego w przypadku DTS Express i DTS:X (#335).
- Naprawa błędu, który powodował, że niektóre odtworzenia kończyły się niepowodzeniem, gdy włączone jest tunelowanie, a plik
- Film:
- Ustaw w
MediaCodecVideoRenderer
raportowanieVideoSize
o szerokości i wysokości 0, gdy mechanizm renderowania jest wyłączony. Po zmianie elementuPlayer.getVideoSize()
parametrPlayer.Listener.onVideoSizeChanged
jest odpowiednio wywoływany. Po tej zmianie rozmiar filmu w systemie ExoPlayer (MediaCodecVideoRenderer
) będzie miał szerokość i wysokość 0, jeśli systemPlayer.getCurrentTracks
nie obsługuje wideo lub rozmiar obsługiwanej ścieżki wideo nie został jeszcze określony.
- Ustaw w
- DRM:
- Ogranicz widoczność kilku metod używanych tylko do użytku wewnętrznego w
DefaultDrmSession
, które nie powinny być wywoływane spoza pakietu DRM:void onMediaDrmEvent(int)
void provision()
void onProvisionCompleted()
onProvisionError(Exception, boolean)
- Ogranicz widoczność kilku metod używanych tylko do użytku wewnętrznego w
- Muxer:
- Dodaj nową bibliotekę Muxer, której można używać do tworzenia pliku kontenera MP4.
- Rozszerzenie IMA:
- Włącz transmisje DASH na żywo z wielu okresów na potrzeby DAI. Pamiętaj, że obecna implementacja nie obsługuje jeszcze przewijania w transmisjach na żywo (#10912).
- Popraw błąd polegający na wstawieniu w transmisjach na żywo nowej grupy reklam, ponieważ obliczona pozycja treści na kolejnych osiach czasu nieco się różni.
- Sesja:
- Dodaj metodę pomocniczą
MediaSession.getControllerForCurrentRequest
, aby uzyskać informacje o kontrolerze, który obecnie wywołuje metodęPlayer
. - Dodaj
androidx.media3.session.MediaButtonReceiver
, aby umożliwić w aplikacjach implementowanie wznawiania odtwarzania za pomocą zdarzeń przycisku multimediów wysyłanych np. przez zestaw słuchawkowy Bluetooth (#167). - Dodaj domyślną implementację do elementu
MediaSession.Callback.onAddMediaItems
, aby umożliwić przekazywanie żądanej wartościMediaItems
do elementuPlayer
, jeśli zawiera on tagLocalConfiguration
(np. identyfikator URI) (#282). - Domyślnie w Androidzie 12 i starszych wersjach z Androidem 12 i starszymi przyciskami poleceń „przewiń do poprzedniego” i „przewiń do następnego” w kompaktowym widoku powiadomień o multimediach są one domyślnie dodawane.
- Dodaj domyślną implementację do elementu
MediaSession.Callback.onAddMediaItems
, aby umożliwić przekazywanie żądanej wartościMediaItems
do elementuPlayer
, jeśli zawiera on tagLocalConfiguration
(np. identyfikator URI) (#282). - Domyślnie w Androidzie 12 i starszych wersjach z Androidem 12 i starszymi przyciskami poleceń „przewiń do poprzedniego” i „przewiń do następnego” w kompaktowym widoku powiadomień o multimediach są one domyślnie dodawane.
- Dodaj metodę pomocniczą
- Interfejs:
- Dodaj metody używane
shouldShowPlayButton
ihandlePlayPauseButtonAction
, aby pisać niestandardowe elementy interfejsu za pomocą przycisku odtwarzania/wstrzymywania.
- Dodaj metody używane
- Rozszerzenie RTSP:
- Rozszerzenie DASH:
- Usuń przesunięcie czasu odtwarzania multimediów z
MediaLoadData.startTimeMs
iMediaLoadData.endTimeMs
w przypadku wielookresowych transmisji DASH. - Naprawiliśmy błąd, który powodował, że ponowne przygotowywanie źródła multimediów Dashi w internecie z wieloma przedziałami czasu spowodowało wygenerowanie parametru
IndexOutOfBoundsException
(#10838).
- Usuń przesunięcie czasu odtwarzania multimediów z
- Rozszerzenie HLS:
- Dodaj
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)
, aby ustawić czas oczekiwania wątku wczytywania na zainicjowanieTimestampAdjuster
. Jeśli inicjowanie nie zakończy się przed upływem limitu czasu oczekiwania, zostanie zgłoszonyPlaybackException
, aby uniknąć nieskończonego wstrzymania odtwarzania. Limit czasu jest domyślnie ustawiony na zero (#323).
- Dodaj
- Narzędzia testowe:
- Sprawdź niewrażliwość wielkości liter w schemacie URI w pliku
DataSourceContractTest
.
- Sprawdź niewrażliwość wielkości liter w schemacie URI w pliku
- Usuń wycofane symbole:
- Usuń konstruktory
DefaultAudioSink
, użyj zamiast tego elementuDefaultAudioSink.Builder
. - Usuń typ
HlsMasterPlaylist
, zamiast tego użyj elementuHlsMultivariantPlaylist
. - Usuń
Player.stop(boolean)
. Użyj zamiast niejPlayer.stop()
iPlayer.clearMediaItems()
(jeślireset
totrue
). - Usuń 2 wycofane konstruktory
SimpleCache
. Użyj niewycofanego konstruktora, który zamiast tego używa konstruktoraDatabaseProvider
, aby zwiększyć wydajność. - Usuń konstruktor
DefaultBandwidthMeter
, zamiast tego użyjDefaultBandwidthMeter.Builder
. - Usuń konstruktory
DefaultDrmSessionManager
, zamiast tego użyjDefaultDrmSessionManager.Builder
. - Usuń 2 wycofane konstruktory
HttpDataSource.InvalidResponseCodeException
. Użyj niewycofanego konstruktora, który akceptuje dodatkowe pola(cause
,responseBody
), aby usprawnić logowanie błędów. - Usuń zasady
DownloadHelper.forProgressive
,DownloadHelper.forHls
,DownloadHelper.forDash
iDownloadHelper.forSmoothStreaming
, a zamiast nich użyj elementuDownloadHelper.forMediaItem
. - Usuń wycofany konstruktor
DownloadService
, użyj niewycofanego konstruktora, który zawiera opcję podawania parametruchannelDescriptionResourceId
. - Usuń wycofane stałe ciągi znaków dla zestawów znaków (
ASCII_NAME
,UTF8_NAME
,ISO88591_NAME
,UTF16_NAME
iUTF16LE_NAME
). Użyj zamiast nich Kotlin Charsets z pakietukotlin.text
,java.nio.charset.StandardCharsets
lubcom.google.common.base.Charsets
. - Usuń wycofany konstruktor
WorkManagerScheduler
. Użyj niewycofanego konstruktora, który zawiera opcję podania parametruContext
. - Usuń wycofane metody
createVideoSampleFormat
,createAudioSampleFormat
,createContainerFormat
icreateSampleFormat
, które były używane do utworzenia instancji klasyFormat
. Do tworzenia instancjiFormat
zamiast tego użyj poleceniaFormat.Builder
. - Usuń wycofane metody
copyWithMaxInputSize
,copyWithSubsampleOffsetUs
,copyWithLabel
,copyWithManifestFormatInfo
,copyWithGaplessInfo
,copyWithFrameRate
,copyWithDrmInitData
,copyWithMetadata
,copyWithBitrate
icopyWithVideoSize
. Użyj zamiast tego metodFormat.buildUpon()
i setter. - Usuń wycofaną zasadę
ExoPlayer.retry()
. Zamiast niej użyj parametruprepare()
. - Usuń wycofany konstruktor
DefaultTrackSelector
z zerowym argumentem, a zamiast niego użyjDefaultTrackSelector(Context)
. - Usuń wycofany konstruktor
OfflineLicenseHelper
, użyj zamiast niegoOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
. - Usuń wycofany konstruktor
DownloadManager
. Użyj konstruktora, który przyjmujeExecutor
. - Usuń wycofane konstruktory
Cue
. Zamiast nich użyjCue.Builder
. - Usuń wycofany konstruktor
OfflineLicenseHelper
, użyj zamiast niegoOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
. - Usuń 4 wycofane metody
AnalyticsListener
:onDecoderEnabled
użyj zamiast niegoonAudioEnabled
lubonVideoEnabled
.onDecoderInitialized
, użyj zamiast niegoonAudioDecoderInitialized
lubonVideoDecoderInitialized
.onDecoderInputFormatChanged
, użyj zamiast niegoonAudioInputFormatChanged
lubonVideoInputFormatChanged
.onDecoderDisabled
użyj zamiast niegoonAudioDisabled
lubonVideoDisabled
.
- Usuń wycofane funkcje
Player.Listener.onSeekProcessed
iAnalyticsListener.onSeekProcessed
. Zamiast nich użyj właściwościonPositionDiscontinuity
z parametremDISCONTINUITY_REASON_SEEK
. - Usuń regułę
ExoPlayer.setHandleWakeLock(boolean)
, użyj zamiast niej elementusetWakeMode(int)
. - Usuń wycofywaną właściwość
DefaultLoadControl.Builder.createDefaultLoadControl()
, użyj w zamian parametrubuild()
. - Usuń wycofaną zasadę
MediaItem.PlaybackProperties
. Zamiast niej użyj parametruMediaItem.LocalConfiguration
. Wycofane poleMediaItem.playbackProperties
jest teraz typuMediaItem.LocalConfiguration
.
- Usuń konstruktory
Wersja 1.1.0-rc01
21 czerwca 2023 r.
Używaj wersji stabilnej 1.1.0.
Wersja 1.1.0-beta01
7 czerwca 2023 r.
Używaj wersji stabilnej 1.1.0.
Wersja 1.1.0-alfa01
10 maja 2023 r.
Używaj wersji stabilnej 1.1.0.
Wersja 1.0.0
Wersja 1.0.2
18 maja 2023 r.
Aplikacja androidx.media3:media3-*:1.0.2
została zwolniona.
Wersja 1.0.2 zawiera te zatwierdzenia.
Ta wersja jest powiązana z wersją ExoPlayer 2.18.7.
Ta wersja zawiera następujące zmiany od wersji 1.0.1:
- Biblioteka główna:
- Dodaj atrybut
Buffer.isLastSample()
, który wskazuje, czy elementBuffer
zawiera flagęC.BUFFER_FLAG_LAST_SAMPLE
. - Rozwiązanie problemu polegającego na tym, że ostatnia klatka mogła nie zostać wyrenderowana, jeśli ostatnia próbka z ramkami została usunięta z kolejki bez odczytania próbki z końca strumienia. (#11079).
- Dodaj atrybut
- Moduły wyodrębniania:
- Naprawa analizowania składni H.265 SPS w plikach MPEG-TS, ponownie wykorzystując logikę analizy używaną już przez moduły wyodrębniania RTSP i MP4 (#303).
- Tekst:
- SSA: dodaj obsługę plików UTF-16, jeśli zaczynają się od znaku kolejności bajtów (#319).
- Sesja:
- Rozwiązanie problemu polegającego na tym, że
MediaController
nie aktualizuje dostępnych poleceń po połączeniu ze starszą wersją systemuMediaSessionCompat
, która aktualizuje swoje działania. - Popraw błąd, który uniemożliwiał usłudze
MediaLibraryService
zwracanie wartości null w przypadku wywołania interfejsu systemowegoCallback.onGetLibraryRoot
z opisemparams.isRecent == true
w interfejsie API 30 (#355). - Napraw wyciek pamięci w systemie
MediaSessionService
lubMediaLibraryService
(#346). - Napraw błąd, w wyniku którego połączenie
Timeline
i aktualizacji pozycji w funkcjiMediaSession
mogło powodować, żeMediaController
zwrócił(a)IllegalStateException
.
- Rozwiązanie problemu polegającego na tym, że
Wersja 1.0.1
18 kwietnia 2023 r.
Aplikacja androidx.media3:media3-*:1.0.1
została zwolniona.
Wersja 1.0.1 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayer 2.18.6.
- Biblioteka główna:
- Przy przewijaniu do pozycji domyślnej resetujesz zastąpienie docelowej transmisji na żywo (#11051).
- Naprawiono błąd polegający na tym, że puste strumienie próbek w multimediach mogły powodować zatrzymanie odtwarzania.
- Sesja:
- Poprawiono błąd, który powodował, że wiele identycznych elementów kolejki opublikowanych przez starszą wersję
MediaSessionCompat
spowodowało wyjątek w reguleMediaController
(#290). - Dodaj brakujące przekierowanie
MediaSession.broadcastCustomCommand
do starszej wersjiMediaControllerCompat.Callback.onSessionEvent
(#293). - Naprawiono błąd, który powodował, że wywołanie metody
MediaSession.setPlayer
nie aktualizuje dostępnych poleceń. - Rozwiązanie problemu polegającego na tym, że
TrackSelectionOverride
instancje wysłane z elementuMediaController
są ignorowane, jeśli odwołują się do grupy z identyfikatoremFormat.metadata
(#296). - Rozwiąż problem, który powodował, że aby uzyskać dostęp do metadanych za pomocą starszej wersji
MediaSessionCompat
, musisz mieć dostęp doPlayer.COMMAND_GET_CURRENT_MEDIA_ITEM
. - Rozwiązano problem, który powodował, że wystąpienia
MediaSession
w wątku w tle powodowały awarie, gdy jest używana w zasadzieMediaSessionService
(#318). - Rozwiązaliśmy problem polegający na tym, że odbiornik przycisku multimediów był zadeklarowany przez bibliotekę, ale aplikacja tego nie zadeklarowała (#314).
- Poprawiono błąd, który powodował, że wiele identycznych elementów kolejki opublikowanych przez starszą wersję
- DASH:
- Napraw obsługę pustych osi czasu segmentów (#11014).
- RTSP:
- Spróbuj użyć protokołu TCP, jeśli konfiguracja protokołu RTSP z UDP nie powiedzie się i wystąpi błąd RTSP 461 supportedTransport (#11069).
Wersja 1.0.0
22 marca 2023 r.
Aplikacja androidx.media3:media3-*:1.0.0
została zwolniona.
Wersja 1.0.0 zawiera te zatwierdzenia.
Ta wersja jest powiązana z wersją ExoPlayer 2.18.5.
Nie wprowadzono żadnych zmian od wersji 1.0.0-rc02.
Wersja 1.0.0-rc02
2 marca 2023 r.
Aplikacja androidx.media3:media3-*:1.0.0-rc02
została zwolniona.
Wersja 1.0.0-rc02 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayer 2.18.4.
- Biblioteka główna:
- Pobrane pliki:
- Zadbaj o to, aby maksymalna różnica czasu rozpoczęcia 2 segmentów była możliwa do skonfigurowania w klasach
SegmentDownloader
i podklasach (#248).
- Zadbaj o to, aby maksymalna różnica czasu rozpoczęcia 2 segmentów była możliwa do skonfigurowania w klasach
- Dźwięk:
- Film:
- Zmapuj format HEVC HDR10 na
HEVCProfileMain10HDR10
zamiastHEVCProfileMain10
. - Dodaj obejście problemu z urządzeniem Chromecast z Google TV i Lenovo M10 FHD Plus, które powoduje oznaczenie strumieni AVC 60 kl./s jako nieobsługiwanego (#10898).
- Napraw problemy z wydajnością wyświetlania klatek podczas odtwarzania multimediów z liczbą klatek znacznie większą niż częstotliwość odświeżania ekranu.
- Zmapuj format HEVC HDR10 na
- Obsada:
- Popraw tymczasowy
STATE_IDLE
podczas przechodzenia między elementami multimedialnymi (#245).
- Popraw tymczasowy
- RTSP:
- Przechwytuje wyjątek IllegalArgumentException zgłoszony podczas analizowania nieprawidłowych wiadomości z opisu odpowiedzi RTSP (#10971).
- Sesja:
- Poprawiono błąd, który powodował, że przycisk odtwarzania/wstrzymywania powiadomień nie aktualizował się na podstawie stanu odtwarzacza (#192).
- Rozszerzenie IMA:
- Naprawiliśmy błąd, który uniemożliwiał strumieniowanie z dynamicznym wstawianiem reklam bez reklam, ponieważ pierwsze zdarzenie
LOADED
(i w przypadku pozostałych reklam) nie zostało odebrane.
- Naprawiliśmy błąd, który uniemożliwiał strumieniowanie z dynamicznym wstawianiem reklam bez reklam, ponieważ pierwsze zdarzenie
Wersja 1.0.0-rc01
16 lutego 2023 r.
Aplikacja androidx.media3:media3-*:1.0.0-rc01
została zwolniona.
Wersja 1.0.0-rc01 zawiera te zatwierdzenia.
Ta wersja jest powiązana z wersją ExoPlayer 2.18.3.
- Biblioteka główna:
- Zmodyfikuj logikę kolejności dekodera w mechanizmie renderowania, aby zachować preferencje
MediaCodecSelector
, nawet jeśli dekoder zgłosi, że może nie być w stanie odtworzyć multimediów z wydajnością. Na przykład w przypadku selektora domyślnego dekoder sprzętowy z tylko funkcjonalną obsługą będzie preferowany od dekodera programowego, który w pełni obsługuje ten format (#10604). - Dodaj obiekt
ExoPlayer.Builder.setPlaybackLooper
, który ustawi istniejący wątek odtwarzania dla nowej instancji ExoPlayer. - Zezwalaj na wyczyszczenie pomocników menedżera pobierania (#10776).
- Dodaj do
BasePlayer.seekTo
parametr, aby wskazać polecenie używane do przewijania. - Używaj motywu podczas wczytywania elementów rysowalnych w interfejsie API 21 i nowszych (#220).
- Dodawanie elementu
ConcatenatingMediaSource2
, który umożliwia łączenie wielu elementów multimedialnych w jednym oknie (#247).
- Zmodyfikuj logikę kolejności dekodera w mechanizmie renderowania, aby zachować preferencje
- Moduły wyodrębniania:
- Jeśli podczas analizowania atomów Traak w tabeli przykładowej (stbl) brakuje wymaganego opisu (stsd), zamiast elementu
NullPointerException
użyj wywołaniaParserException
. - Prawidłowo pomijaj próbki podczas przechodzenia bezpośrednio do ramki synchronizacji w fMP4 (#10941).
- Jeśli podczas analizowania atomów Traak w tabeli przykładowej (stbl) brakuje wymaganego opisu (stsd), zamiast elementu
- Dźwięk:
- Użyj szybkości transmisji skompresowanego formatu audio do obliczenia minimalnego rozmiaru bufora w przypadku odtwarzania bezpośredniego (przekazywania) w przypadku funkcji
AudioTrack
.
- Użyj szybkości transmisji skompresowanego formatu audio do obliczenia minimalnego rozmiaru bufora w przypadku odtwarzania bezpośredniego (przekazywania) w przypadku funkcji
- Tekst:
- Popraw atrybut
TextRenderer
, przekazując nieprawidłowy indeks (ujemny) doSubtitle.getEventTime
, jeśli plik z napisami nie zawiera żadnych wskazówek. - SubRip: dodaj obsługę plików UTF-16, jeśli zaczynają się od znacznika kolejności bajtów.
- Popraw atrybut
- Metadane:
- Analizuj wiele wartości oddzielonych null z ramek ID3, zgodnie z zasadami ID3 w wersji 2.4.
- Dodaj
MediaMetadata.mediaType
, aby wskazać typ treści lub typ folderu opisany w metadanych. - Dodaj
MediaMetadata.isBrowsable
jako zamiennikMediaMetadata.folderType
. Ten typ folderu zostanie wycofany w następnej wersji.
- DASH:
- Dodaj pełną analizę zestawów do adaptacji obrazów, w tym liczbę kafelków (#3752).
- Interfejs:
- Napraw wycofywaną właściwość
PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener)
, aby mieć pewność, że zmiany dotyczące widoczności są przekazywane do zarejestrowanego detektora (#229). - Popraw kolejność elementów sterujących odtwarzacza środkowego w układzie
PlayerView
w układzie od prawej do lewej (nr 227).
- Napraw wycofywaną właściwość
- Sesja:
- Dodaj abstrakcję
SimpleBasePlayer
, by ułatwić implementację interfejsuPlayer
w odtwarzaczach niestandardowych. - Dodaj metodę pomocniczą, aby przekonwertować token sesji platformy na Media3
SessionToken
(#171). - Użyj polecenia
onMediaMetadataChanged
, aby aktywować aktualizacje sesji mediów na platformie (#219). - Dodaj sesję multimediów jako argument
getMediaButtons()
elementuDefaultMediaNotificationProvider
i użyj stałych list, aby zwiększyć przejrzystość (#216). - Dodaj detektor wywołania zwrotnego
onSetMediaItems
, aby zapewnić sposoby modyfikowania i ustawiania listyMediaItem
, początkowego indeksu i pozycji według sesji przed ustawieniem dla odtwarzacza (#156). - Unikaj wykrywania dwukrotnego kliknięcia w przypadku zdarzeń przycisków multimediów innych niż Bluetooth (#233).
- Zwiększ działanie
QueueTimeline
w przypadku podejrzanego stanu starszej sesji (#241).
- Dodaj abstrakcję
- Metadane:
- Analizuj wiele wartości oddzielonych null z ramek ID3, zgodnie z zasadami ID3 w wersji 2.4.
- Dodaj
MediaMetadata.mediaType
, aby wskazać typ treści lub typ folderu opisany w metadanych. - Dodaj
MediaMetadata.isBrowsable
jako zamiennikMediaMetadata.folderType
. Ten typ folderu zostanie wycofany w następnej wersji.
- Rozszerzenie Cast:
- Zmień wersję pakietu SDK Cast na 21.2.0.
- Rozszerzenie IMA:
- Aby uniknąć problemów z podziałem na wątki, usuń odbiornik zdarzenia
ImaServerSideAdInsertionMediaSource
w wątku aplikacji. - Dodaj właściwość
focusSkipButtonWhenAvailable
do elementuImaServerSideAdInsertionMediaSource.AdsLoader.Builder
, aby zażądać zaznaczenia przycisku pominięcia na urządzeniach telewizyjnych i domyślnie ustawić dla niego wartość „true” (prawda). - Dodaj do elementu
ImaServerSideAdInsertionMediaSource.AdsLoader
metodęfocusSkipButton()
, aby automatycznie żądać zaznaczenia przycisku pominięcia. - Uaktualnij pakiet IMA SDK do wersji 3.29.0.
- Aby uniknąć problemów z podziałem na wątki, usuń odbiornik zdarzenia
- Aplikacja w wersji demonstracyjnej:
- Poproś o zgodę na wysyłanie powiadomień o pobieraniu w czasie działania (#10884).
Wersja 1.0.0-beta03
22 listopada 2022 r.
Aplikacja androidx.media3:media3-*:1.0.0-beta03
została zwolniona.
Wersja 1.0.0-beta03 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayer 2.18.2.
- Biblioteka główna:
- Dodaj
ExoPlayer.isTunnelingEnabled
, aby sprawdzić, czy w przypadku obecnie wybranych ścieżek włączone jest tunelowanie (#2518). - Dodaj
WrappingMediaSource
, aby uprościć zawijanie pojedynczych elementówMediaSource
(#7279). - Odrzuć wsteczny bufor, zanim odtwarzanie zatrzyma się z powodu niewystarczającej ilości pamięci.
- Zamknij blok Tracking „doSomeWork”, gdy włączone jest odciążanie.
- Rozwiąż problem ze śledzeniem sesji z szybkim wyszukiwaniem w elemencie
PlaybackStatsListener
(nr 180). - Wyślij brakujące wywołanie zwrotne funkcji
onMediaItemTransition
, gdy dzwonisz pod numerseekToNext
lubseekToPrevious
w przypadku playlisty z jednym elementem (#10667). - Dodaj właściwość
Player.getSurfaceSize
, która zwraca rozmiar powierzchni, na której jest renderowany film. - Naprawiono błąd, który powodował, że usunięcie odbiorników w trakcie publikowania odtwarzacza mogło powodować błąd
IllegalStateException
(#10758).
- Dodaj
- Kompilacja:
- Aby uniknąć błędów kompilacji, wymuś minimalną wartość
compileSdkVersion
(#10684). - Unikaj publikowania bloku, gdy znajduje się w innej kompilacji Gradle.
- Aby uniknąć błędów kompilacji, wymuś minimalną wartość
- Wybór ścieżki:
- Jeśli wyświetlanie nie obsługuje Dolby Vision, wybieraj inne ścieżki. (#8944).
- Pobrane pliki:
- Napraw potencjalną pętlę nieskończoną w elemencie
ProgressiveDownloader
spowodowaną równoczesnym pobieraniem i odtwarzaniem z tym samym tagiemPriorityTaskManager
(#10570). - Natychmiastowe powiadomienie o pobieraniu (#183).
- Ogranicz liczbę usunięć równoległego pobierania do 1, aby uniknąć nadmiernego tworzenia wątków (#10458).
- Napraw potencjalną pętlę nieskończoną w elemencie
- Film:
- Jeśli wyświetlacz nie obsługuje innego dekodera Dolby Vision, wypróbuj alternatywny dekoder. (#9794).
- Dźwięk:
- Użyj zasady
SingleThreadExecutor
do zwolnieniaAudioTrack
instancji, aby uniknąć błędów zabraknięcia pamięci podczas jednoczesnego udostępniania wielu graczy (#10057). - Dodaje
AudioOffloadListener.onExperimentalOffloadedPlayback
dla stanu odciążenia 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
. - Zmapuj 8- i 12-kanałowy dźwięk na maski kanałów 7.1 i 7.1.4 zależnie od wszystkich wersji Androida (#10701).
- Użyj zasady
- Metadane:
- W
MetadataRenderer
można teraz skonfigurować renderowanie metadanych, gdy tylko będą dostępne. Utwórz instancję z funkcjąMetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean)
, aby określić, czy mechanizm renderowania będzie wydawał metadane wcześniej, czy synchronizował się z pozycją odtwarzacza.
- W
- DRM:
- Obejście błędu w implementacji ClearKey na Androidzie 13, który zwraca niepusty, ale nieprawidłowy adres URL licencji.
- Naprawiono błąd
setMediaDrmSession failed: session not opened
podczas przełączania między schematami DRM w playliście (np. Widevine na ClearKey).
- Tekst:
- CEA-608: sprawdź, czy polecenia przełączania usługi w polu 2 są obsługiwane prawidłowo (#10666).
- DASH:
- Analizuj
EventStream.presentationTimeOffset
z plików manifestu (#10460).
- Analizuj
- Interfejs:
- Użyj bieżących zastąpień odtwarzacza jako gotowych ustawień w sekcji
TrackSelectionDialogBuilder
(#10429).
- Użyj bieżących zastąpień odtwarzacza jako gotowych ustawień w sekcji
- Sesja:
- Sprawdź, czy polecenia są zawsze wykonywane w prawidłowej kolejności, nawet jeśli niektóre wymagają asynchronicznego rozwiązania problemu (#85).
- Dodaj
DefaultMediaNotificationProvider.Builder
do utworzeniaDefaultMediaNotificationProvider
instancji. Kreator może skonfigurować identyfikator powiadomień, identyfikator kanału powiadomień oraz nazwę kanału powiadomień używaną przez dostawcę. Dodaj też metodęDefaultMediaNotificationProvider.setSmallIcon(int)
, aby ustawić małą ikonę powiadomień. (#104). - Upewnij się, że polecenia wysłane przed
MediaController.release()
nie są odrzucane (#99). SimpleBitmapLoader
może wczytać bitmapę z identyfikatorów URIfile://
(#108).- Napraw asercję, która uniemożliwia usłudze
MediaController
wyszukiwanie reklamy w danym okresie (#122). - Po zakończeniu odtwarzania wskaźnik
MediaSessionService
zatrzymuje się na pierwszym planie i wyświetla się powiadomienie z prośbą o ponowne rozpoczęcie odtwarzania ostatnio odtwarzanego elementu multimedialnego (#112). - Nie uruchamiaj usługi na pierwszym planie z oczekującą intencją wstrzymania (#167).
- Ręcznie ukryj „plakietkę” powiązaną z powiadomieniem utworzonym przez użytkownika
DefaultNotificationProvider
w interfejsie API 26 i API 27 (w interfejsach API w wersji 28 i nowszych) plakietka jest automatycznie ukryta (nr 131). - Naprawa błędu, który powodował, że drugie połączenie łączące ze starszą wersją MediaSession z Media3 MediaController powoduje zdarzenie IllegalStateExceptions (#49).
- RTSP:
- IMA:
- Dodaj czas oczekiwania na wczytanie informacji o reklamie, by uwzględnić przypadki, gdy pakiet IMA SDK utknie przy wczytywaniu reklamy (#10510).
- Zapobiegaj pomijaniu reklam w trakcie filmu przy przewijaniu do końca treści (#10685).
- Prawidłowo oblicz czas trwania okna w przypadku transmisji na żywo z reklamami wstawionymi po stronie serwera, np. IMA DAI (#10764).
- Rozszerzenie FFmpeg:
- Dodaj nowe wymagane flagi, aby połączyć biblioteki FFmpeg z pakietem NDK w wersji 23.1.7779620 lub nowszym (#9933).
- Rozszerzenie AV1:
- Zaktualizuj wersję CMake, aby uniknąć niezgodności z najnowszymi wersjami Android Studio (#9933).
- Rozszerzenie Cast:
- Zaimplementuj
getDeviceInfo()
, aby móc rozpoznać parametrCastPlayer
podczas sterowania odtwarzaniem za pomocą przyciskuMediaController
(#142).
- Zaimplementuj
- Transformer:
- Dodaj licznik czasu watchdoga muxer, aby wykrywać, że generowanie próbki wyjściowej jest zbyt wolne.
- Usuń wycofane symbole:
- Usuń
Transformer.Builder.setOutputMimeType(String)
. Ta funkcja została usunięta. Jeśli używany jest domyślny mikser, typem MIME będzie zawsze MP4.
- Usuń
Wersja 1.0.0-beta02
21 lipca 2022 r.
Aplikacja androidx.media3:media3-*:1.0.0-beta02
została zwolniona.
Wersja 1.0.0-beta02 zawiera te zatwierdzenia.
Ta wersja jest powiązana z wersją ExoPlayer 2.18.1.
- Biblioteka główna:
- Upewnij się, że zmiana pola
ShuffleOrder
za pomocąExoPlayer.setShuffleOrder
spowoduje wywołanie metodyPlayer.Listener#onTimelineChanged
z parametremreason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED
(#9889). - W przypadku multimediów progresywnych uwzględnij tylko wybrane ścieżki w pozycji buforowanej (#10361).
- Zezwalaj na niestandardowy rejestrator na potrzeby wszystkich danych wyjściowych dziennika ExoPlayer (#9752).
- Popraw implementację parametru
setDataSourceFactory
w usłudzeDefaultMediaSourceFactory
, która w niektórych przypadkach nie działała (#116).
- Upewnij się, że zmiana pola
- Moduły wyodrębniania:
- DASH:
- Analizuj adres URL licencji ClearKey z plików manifestu (#10246).
- Interfejs:
- Upewnij się, że TalkBack informuje o aktualnie aktywnej opcji prędkości w menu elementów sterujących odtwarzaniem (#10298).
- RTSP:
- Dodaj obsługę pofragmentowanych pakietów VP8 (#110).
- Rozszerzenie BeyondCorp:
- Posłuchaj zmian w elemencie
playWhenReady
w usłudzeLeanbackAdapter
(10420).
- Posłuchaj zmian w elemencie
- Obsada:
Wersja 1.0.0-beta01
16 czerwca 2022 r.
Aplikacja androidx.media3:media3-*:1.0.0-beta01
została zwolniona.
Wersja 1.0.0-beta01 zawiera te zatwierdzenia.
Odpowiada to wersji ExoPlayer 2.18.0.
- Biblioteka główna:
- Włącz obsługę diagnostyki platformy Androida w
MediaMetricsManager
. ExoPlayer przekazuje na platformę zdarzenia odtwarzania i dane o wydajności. Pomaga to dostarczać informacji o wydajności systemu i debugowaniu na urządzeniu. Te dane mogą też być zbierane przez Google, jeśli użytkownik urządzenia włączy udostępnianie danych o użytkowaniu i diagnostyce. Aplikacje mogą zrezygnować z udziału w diagnostyce platformy dla odtwarzacza ExoPlayer za pomocą parametruExoPlayer.Builder.setUsePlatformDiagnostics(false)
. - Napraw błąd, który powoduje zbyt częste resetowanie ścieżek podczas korzystania z funkcji
MergingMediaSource
, np. ładowanie napisów z innego urządzenia i zmianę wybranego w trakcie odtwarzania napisów (#10248). - Przestań wykrywać typ sieci 5G-NSA w interfejsach API 29 i 30. Odtworzenia będą odtwarzane w sieci 4G.
- Nie zezwalaj na przekazywanie instrukcji
null
do interfejsówMediaSource.Factory.setDrmSessionManagerProvider
iMediaSource.Factory.setLoadErrorHandlingPolicy
. W razie potrzeby instancjeDefaultDrmSessionManagerProvider
iDefaultLoadErrorHandlingPolicy
można przekazywać wprost. - Dodaj element
MediaItem.RequestMetadata
, aby wskazać metadane potrzebne do odtwarzania multimediów, gdy dokładny elementLocalConfiguration
nie jest znany. Usuń też tagMediaMetadata.mediaUrl
, ponieważ jest on teraz uwzględniony w źródleRequestMetadata
. - Dodaj
Player.Command.COMMAND_SET_MEDIA_ITEM
, aby umożliwić graczom ustawienie jednego elementu.
- Włącz obsługę diagnostyki platformy Androida w
- Wybór ścieżki:
- Przenieś klasę
TrackSelectionOverrides
naTrackSelectionParameters
i awansujTrackSelectionOverride
do klasy najwyższego poziomu. - Zmień nazwę
TracksInfo
naTracks
, aTracksInfo.TrackGroupInfo
naTracks.Group
. NazwyPlayer.getCurrentTracksInfo
iPlayer.Listener.onTracksInfoChanged
również zostały zmienione naPlayer.getCurrentTracks
iPlayer.Listener.onTracksChanged
. Obejmuje to „cofnięcie” nazwy metodyPlayer.Listener.onTracksChanged
, ale z innymi typami parametrów. - Zmień
DefaultTrackSelector.buildUponParameters
iDefaultTrackSelector.Parameters.buildUpon
, aby zwracały wartościDefaultTrackSelector.Parameters.Builder
zamiast wycofanej wersjiDefaultTrackSelector.ParametersBuilder
. - Dodaj wartość
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities
, która jest domyślnie włączona. Gdy ta opcja jest włączona,DefaultTrackSelector
preferuje ścieżki audio, których liczba kanałów nie przekracza możliwości wyjściowych urządzenia. Na urządzeniach mobilnychDefaultTrackSelector
będzie preferować dźwięk stereo/mono niż wielokanałowy, chyba że format wielokanałowy może być przestrzenny (Android 12L i nowszy) lub dźwięk przestrzenny Dolby. Dodatkowo na urządzeniach, które obsługują przestrzenność dźwięku,DefaultTrackSelector
będzie sprawdzać zmiany we właściwościach Przestrzenny i w przypadku tych opcji wybierać nową ścieżkę. Ograniczenia te nie dotyczą urządzeń obsługującychtelevision
tryb interfejsu. Preferowany będzie format z największą liczbą kanałów. Aby można było włączyć tę funkcję, instancjaDefaultTrackSelector
musi być skonstruowana przy użyciuContext
.
- Przenieś klasę
- Film:
- Zmień nazwę społeczności
DummySurface
naPlaceholderSurface
. - Dodaj obsługę AV1 do
MediaCodecVideoRenderer.getCodecMaxInputSize
.
- Zmień nazwę społeczności
- Dźwięk:
- Użyj dekodera dźwięku LG AC3 do wyświetlania reklam o niestandardowym typie MIME.
- Zmień zwracany typ kodu
AudioAttributes.getAudioAttributesV21()
zandroid.media.AudioAttributes
na nową klasę otokiAudioAttributesV21
, aby zapobiec powolnej weryfikacji ART w interfejsie API < 21. - Zapytanie o platformę (interfejs API 29 lub nowszy) lub przyjmowanie liczby kanałów kodowania audio na potrzeby przekazywania audio, gdy liczba kanałów w formacie audio jest nieskonfigurowana, co ma miejsce w przypadku przygotowywania bez fragmentów HLS (10204).
- Skonfiguruj
AudioTrack
z maską kanałuAudioFormat.CHANNEL_OUT_7POINT1POINT4
, jeśli dekoder odtwarza 12-kanałowy dźwięk PCM (#10322.
- DRM
- Upewnij się, że sesja DRM jest zawsze poprawnie zaktualizowana przy wyszukiwaniu natychmiast po zmianie formatu (10274).
- Tekst:
- Zmień
Player.getCurrentCues()
, aby zwracał wartośćCueGroup
zamiastList<Cue>
. - SSA: obsługuje ustawienie stylu
OutlineColour
, gdyBorderStyle == 3
(tj.OutlineColour
ustawia tło wstawienia) (#8435). - CEA-708: analizowanie danych w wiele bloków usługi i ignorowanie bloków niepowiązanych z wybranym numerem usługi.
- Usuń atrybut
RawCcExtractor
, który był używany tylko do obsługi formatu napisów wewnętrznych Google.
- Zmień
- Moduły wyodrębniania:
- Interfejs:
- Popraw dostarczanie zdarzeń do ustawień
OnClickListener
ustawionych naPlayerView
w tym przypadku w przypadku wartościuseController=false
(#9605). Napraw też dostarczanie zdarzeń doOnLongClickListener
we wszystkich konfiguracjach widoku. - Rozwiązanie problemu: nieprawidłowe traktowanie sekwencji zdarzeń kliknięcia, które wykraczają poza zakres
PlayerView
przedACTION_UP
, jako kliknięcia (#9861). - Rozwiązano problem z ułatwieniami dostępu w usłudze
PlayerView
polegający na tym, że dotknięcie może powodować przełączanie odtwarzania, a nie ukrywanie elementów sterujących (#8627). - Przeredaguj wartości
TrackSelectionView
iTrackSelectionDialogBuilder
, aby działały z interfejsemPlayer
, a nieExoPlayer
. Dzięki temu widoków danych można używać w innych implementacjachPlayer
i usuwać zależność między modułem interfejsu a modułem ExoPlayer. To rewolucyjna zmiana. - Nie pokazuj wymuszonych ścieżek tekstowych w selektorze ścieżek
PlayerView
i pozostaw wybraną odpowiednią ścieżkę tekstu wymuszonego, jeśli wybrana jest opcja „Brak” (#9432).
- Popraw dostarczanie zdarzeń do ustawień
- DASH:
- Przeanalizuj liczbę kanałów z elementów DTS
AudioChannelConfiguration
. Umożliwia to ponowne włączenie przekazywania dźwięku w przypadku strumieni DTS (#10159). - Nie zezwalaj na przekazywanie instrukcji
null
do instancjiDashMediaSource.Factory.setCompositeSequenceableLoaderFactory
. InstancjeDefaultCompositeSequenceableLoaderFactory
mogą być przekazywane w sposób jednoznaczny, jeśli jest to konieczne.
- Przeanalizuj liczbę kanałów z elementów DTS
- HLS:
- Jeśli atrybut CODECS playlisty nie zawiera kodeka audio (#10065), użyj go, jeśli chodzi o przygotowanie szczegółowe.
- Nie zezwalaj na przekazywanie instrukcji
null
do interfejsówHlsMediaSource.Factory.setCompositeSequenceableLoaderFactory
,HlsMediaSource.Factory.setPlaylistParserFactory
iHlsMediaSource.Factory.setPlaylistTrackerFactory
. Wystąpienia właściwościDefaultCompositeSequenceableLoaderFactory
,DefaultHlsPlaylistParserFactory
lub odwołania do elementuDefaultHlsPlaylistTracker.FACTORY
można przekazywać w sposób jawny, jeśli jest to konieczne.
- Płynne strumieniowanie:
- Nie zezwalaj na przekazywanie instrukcji
null
do instancjiSsMediaSource.Factory.setCompositeSequenceableLoaderFactory
. Jeśli jest to wymagane, instancjeDefaultCompositeSequenceableLoaderFactory
mogą być przekazywane wprost.
- Nie zezwalaj na przekazywanie instrukcji
- RTSP:
- Dodaj czytnik RTP na potrzeby H263 (#63).
- Dodaj czytnik RTP na potrzeby MPEG4 (#35).
- Dodaj czytnik RTP na potrzeby HEVC (#36).
- Dodaj czytnik RTP na AMR. Obecnie obsługiwane są tylko jednokanałowe, nieprzeplatane strumienie AMR. Złożony ładunek AMR RTP nie jest obsługiwany. (#46)
- Dodaj czytnik RTP na potrzeby VP8 (#47).
- Dodaj czytnik RTP na potrzeby WAV (#56).
- Poprawiono nagłówek podstawowej autoryzacji RTSP. (#9544).
- Przestań sprawdzać obowiązkowe pola SDP, ponieważ ExoPlayer ich nie potrzebuje (#10049).
- Podczas analizowania czasu protokołu RTSP Zgłoszono wyjątek (#10165).
- Dodaj czytnik RTP na potrzeby VP9 (#47).
- Dodaj czytnik RTP dla OPUS (#53).
- Źródła danych:
- Zmień nazwę społeczności
DummyDataSource
naPlaceholderDataSource
. - Obejście problemu z obsługą OkHttp.
- Zmień nazwę społeczności
- Sesja:
- Aby umożliwić asynchroniczne rozpoznawanie żądań, zastąp
MediaSession.MediaItemFiller
wartościąMediaSession.Callback.onAddMediaItems
. - obsługiwać metody
setMediaItems(s)
, gdyMediaController
łączy się ze starszą sesją multimediów. - Usuń
MediaController.setMediaUri
iMediaSession.Callback.onSetMediaUri
. Tę samą funkcję można osiągnąć za pomocą metodMediaController.setMediaItem
iMediaSession.Callback.onAddMediaItems
. - Przekierowuj starsze wywołania
MediaController
do odtwarzania multimediów doMediaSession.Callback.onAddMediaItems
zamiastonSetMediaUri
. - Aby dostosować powiadomienia, dodaj
MediaNotification.Provider
iDefaultMediaNotificationProvider
. - Aby pobrać obrazy grafiki, dodaj
BitmapLoader
iSimpleBitmapLoader
. - Dodaj
MediaSession.setCustomLayout()
, aby zapewnić wsteczną zgodność ze starszą sesją. - Dodaj
MediaSession.setSessionExtras()
, aby zapewnić spójność funkcji ze starszą sesją. - Zmień nazwę
MediaSession.MediaSessionCallback
naMediaSession.Callback
,MediaLibrarySession.MediaLibrarySessionCallback
naMediaLibrarySession.Callback
iMediaSession.Builder.setSessionCallback
nasetCallback
. - Popraw NPE w usłudze
MediaControllerImplLegacy
(nr 59). - Aktualizowanie informacji o pozycji sesji na osi czasu(#51).
- Napraw NPE w
MediaControllerImplBase
po zwolnieniu kontrolera (#74).
- Aby umożliwić asynchroniczne rozpoznawanie żądań, zastąp
- Odtwarzanie reklam / IMA:
- Zmniejsz częstotliwość odpytywania reklam z częstotliwości co 100 ms do 200 ms, aby zachować zgodność z rekomendacjami rady Media Rating Council (MRC).
- Rozszerzenie FFmpeg:
- Zaktualizuj wersję CMake do
3.21.0+
, aby uniknąć błędu CMake, który spowodował błąd synchronizacji Gradle w AndroidStudio (#9933).
- Zaktualizuj wersję CMake do
- Usuń wycofane symbole:
- Usuń
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
. Użyj w zamian zasadyPlayer.Listener.onTracksChanged(Tracks)
. - Usuń
Player.getCurrentTrackGroups
iPlayer.getCurrentTrackSelections
. Użyj w zamian zasadyPlayer.getCurrentTracks
. Możesz też nadal używaćExoPlayer.getCurrentTrackGroups
iExoPlayer.getCurrentTrackSelections
, ale te metody są nadal wycofane. - Usuń stałe
DownloadHelper
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
iDEFAULT_TRACK_SELECTOR_PARAMETERS
. W miarę możliwości używaj polagetDefaultTrackSelectorParameters(Context)
. W innych przypadkach używaj polaDEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT
. - Usuń konstruktor
DefaultTrackSelector(ExoTrackSelection.Factory)
. Użyj w zamian zasadyDefaultTrackSelector(Context, ExoTrackSelection.Factory)
. - Usuń
Transformer.Builder.setContext
. Zamiast tego wartośćContext
powinna być przekazywana do konstruktoraTransformer.Builder
.
- Usuń
Wersja 1.0.0-alfa03
14 marca 2022 r.
Aplikacja androidx.media3:media3-*:1.0.0-alpha03
została zwolniona.
Wersja 1.0.0-alpha03 zawiera te zatwierdzenia.
Odpowiada to wersji ExoPlayer 2.17.1.
- Dźwięk:
- Naprawiono błąd podczas sprawdzania funkcji dźwięku Dolby Atmos (E-AC3-JOC) w HLS.
- Moduły wyodrębniania:
- FMP4: rozwiąż problem, który powodował, że metadane próbki emsg były wyświetlane w niewłaściwej kolejności w przypadku strumieni zawierających atomy emsg w wersjach v0 i v1 (#9996).
- Tekst:
- Popraw interakcję elementów
SingleSampleMediaSource.Factory.setTrackId
iMediaItem.SubtitleConfiguration.Builder.setId
, aby nadać priorytet poluSubtitleConfiguration
, a jeśli nie jest ustawiona, użyj wartościFactory
(#10016).
- Popraw interakcję elementów
- Odtwarzanie reklam:
- Naprawianie niedokładności w dźwięku między okresami reklam w transmisjach HLS SSAI na żywo.
Wersja 1.0.0-alfa02
2 marca 2022 r.
Aplikacja androidx.media3:media3-*:1.0.0-alpha02
została zwolniona.
Wersja 1.0.0-alpha02 zawiera te zatwierdzenia.
Odpowiada to wersji ExoPlayer 2.17.0.
- Biblioteka podstawowa:
- Dodaj chronioną metodę
DefaultRenderersFactory.getCodecAdapterFactory()
, aby podklasyDefaultRenderersFactory
, które zastępująbuildVideoRenderers()
lubbuildAudioRenderers()
, miały dostęp do fabryki adapterów kodeków i przekazywały je doMediaCodecRenderer
utworzonych przez siebie instancji. - Propaguj pola nagłówka ICY
name
igenre
odpowiednio do pólMediaMetadata.station
iMediaMetadata.genre
, aby docierały do aplikacji przezPlayer.Listener.onMediaMetadataChanged()
(#9677). - Usuń puste klucze z
DefaultHttpDataSource#getResponseHeaders
. - Przejdź w tryb uśpienia i spróbuj ponownie, jeśli nie uda się utworzyć instancji
MediaCodec
. Jest to rozwiązanie problemu występującego na niektórych urządzeniach podczas przełączania platformy z bezpiecznego kodeka na inny kodek (#8696). - Dodaj
MediaCodecAdapter.getMetrics()
, aby umożliwić użytkownikom pobieranie danych z usługiMediaCodec
. (#9766). - Napraw rozdzielczość zależności Maven (#8353).
- Wyłącz automatyczną korektę szybkości w przypadku transmisji na żywo, które nie mają funkcji małego opóźnienia ani nie ustawiają szybkości na prośbę użytkownika (#9329).
- Zmień nazwę społeczności
DecoderCounters#inputBufferCount
naqueuedInputBufferCount
. - Ustaw numer
SimpleExoPlayer.renderers
jako prywatny. Mechanizmy renderowania są dostępne na stronieExoPlayer.getRenderer
. - Zaktualizowano niektóre wartości stałe
AnalyticsListener.EventFlags
, aby pasowały do wartości w elemenciePlayer.EventFlags
. - Podziel encję
AnalyticsCollector
na interfejs i domyślną implementację, aby umożliwić jej pomijanie przez R8, gdy aplikacja jej nie potrzebuje.
- Dodaj chronioną metodę
- Wybór ścieżki:
- Obsługują flagi preferowanych ról wideo przy wyborze ścieżki (#9402).
- Zaktualizuj mechanizmy wyboru ścieżki wideo, aby uwzględnić preferowane typy MIME i flagi roli podczas wybierania wielu ścieżek wideo do adaptacji (#9519).
- Zaktualizuj logikę wyboru ścieżki wideo i audio, aby wybierać tylko formaty na potrzeby wybierania adaptacyjnego, które mają ten sam poziom obsługi dekodera i sprzętu (#9565).
- Jeśli podstawowe dekodery z akceleracją sprzętową obsługują wiele kodeków, zaktualizuj zasady wyboru ścieżki wideo, aby preferować bardziej wydajne kodeki (#4835).
- Preferuj ustawienia treści audio (np. „domyślną” ścieżkę audio lub ścieżkę pasującą do języka lokalnego systemu) zamiast ograniczeń technicznych (np. preferowany typ MIME lub maksymalną liczbę kanałów).
- Rozwiąż problem z wyborem utworu, który powodował, że zastąpienie jednej grupy ścieżek nie wyłączało innych grup ścieżek tego samego typu (#9675).
- Napraw problem z wyborem ścieżki, w wyniku którego kombinacja zastąpień z pustą i niepustych ścieżek nie jest prawidłowo stosowana (#9649).
- Zabroń zduplikowanych identyfikatorów
TrackGroup
w elemencieTrackGroupArray
. ElementyTrackGroup
zawsze można odróżnić przez ustawienie w konstruktorzeTrackGroup
elementuid
. Rozwiązuje to problem z awarią, która występowała przy wznawianiu odtwarzania po włączeniu odtwarzania w tle aplikacji z aktywnym zastąpieniem ścieżki (#9718). - Popraw logikę w
AdaptiveTrackSelection
, aby umożliwić wzrost jakości przy wystarczającej przepustowości sieci nawet wtedy, gdy odtwarzanie jest bardzo blisko krawędzi transmisji na żywo (#9784).
- Film:
- W razie potrzeby napraw logikę zastępczą dekodera Dolby Vision, aby używać zgodnego dekodera H264/H265.
- Dźwięk:
- W razie potrzeby napraw logikę kreacji zastępczej dekodera Dolby Atmos (E-AC3-JOC), aby w razie potrzeby używać zgodnego dekodera E-AC3.
- Zmień interfejsy API
AudioCapabilities
tak, aby wymagały jawnego przekazywania metodyAudioCapabilities.DEFAULT_AUDIO_CAPABILITIES
zamiastnull
. - Zezwól na dostosowanie obliczania rozmiaru bufora
AudioTrack
przez wstawienie typuAudioTrackBufferSizeProvider
doDefaultAudioSink
. (#8891). - Jeśli żądany rozmiar bufora przekracza 1 MB, spróbuj ponownie utworzyć element
AudioTrack
. (#9712).
- Moduły wyodrębniania:
- Tekst:
- Dodaj pole
MediaItem.SubtitleConfiguration.id
, które zostanie przekazane do polaFormat.id
ścieżki napisów utworzonej w konfiguracji (#9673). - Dodaj podstawową obsługę napisów WebVTT w kontenerach Matroska (#9886).
- Zablokuj usłudze
Cea708Decoder
możliwość odczytu więcej niż zadeklarowany rozmiar bloku usług.
- Dodaj pole
- DRM:
- Usuń
playbackLooper
z kontaDrmSessionManager.(pre)acquireSession
. Gdy aplikacja używa elementuDrmSessionManager
w niestandardowym elemencieMediaSource
, zamiast tego doDrmSessionManager.setPlayer
musi być przekazywanyplaybackLooper
.
- Usuń
- Odtwarzanie reklam / IMA:
- Dodano obsługę dynamicznego wstawiania reklam (DAI) IMA (#8213).
- Dodaj metodę do elementu
AdPlaybackState
, by umożliwić zresetowanie grupy reklam i ponowne jej odtworzenie (#9615). - Wymuszanie odtwarzania podczas odtwarzania reklamy na poziomie 1,0 (#9018).
- Rozwiąż problem polegający na tym, że nie udało się załadować grupy reklam, która spowodowała natychmiastowy reset odtwarzania (#9929).
- Interfejs:
- DASH:
- Dodaj do pliku
Representation
(#9579) przeanalizowane podstawowe i dodatkowe właściwości. - obsługują rolę śledzenia
forced-subtitle
(#9727). - Przestań interpretować rolę ścieżki
main
jakoC.SELECTION_FLAG_DEFAULT
. - Napraw podstawową logikę wykluczania adresów URL w plikach manifestu, które nie deklarują przestrzeni nazw DVB (#9856).
- Obsługa względnych adresów URL
MPD.Location
(#9939).
- Dodaj do pliku
- HLS:
- Prawidłowo wypełnij pole
Format.label
w przypadku strumieni HLS tylko z dźwiękiem (#9608). - Aby skrócić czas uruchamiania, domyślnie użyj przygotowań bez fragmentów. Jeśli Twoje nagrania zawierają ścieżki z napisami, które nie są zadeklarowane na playliście reklamy nadrzędnej, dodaj je do playlisty reklamy nadrzędnej, by można było je odtwarzać, lub wyłącz opcję
HlsMediaSource.Factory.setAllowChunklessPreparation(false)
. - Obsługuj dokładne przewijanie klatek kluczowych w HLS (#2882).
- Prawidłowo wypełnij pole
- RTSP:
- Podaj interfejs API klienta, aby zastąpić identyfikator
SocketFactory
używany do każdego połączenia z serwerem (#9606). - Jeśli występują obie metody uwierzytelniania DIGEST zamiast PODSTAWOWEJ (#9800).
- Obsługa, gdy czas wczytywania ścieżki RTSP jest niedostępny (#9775).
- Ignoruj nieprawidłowe wartości nagłówka RTP-Info (#9619).
- Podaj interfejs API klienta, aby zastąpić identyfikator
- Transformer:
- Zwiększ wymaganą minimalną wersję interfejsu API do 21.
TransformationException
służy teraz do opisywania błędów, które występują podczas przekształcania.- Dodaj
TransformationRequest
, aby określić opcje przekształcania. - Zezwalaj na rejestrowanie wielu detektorów.
- Naprawianie zawieszania się Transformera, gdy dane wyjściowe kodeka są częściowo odczytywane.
- Popraw potencjalny NPE w
Transformer.getProgress
podczas zwalniania rzutów modyfikujących. - Dodaj aplikację demonstracyjną do stosowania przekształceń.
- Rozszerzenie MediaSession:
- Domyślnie
MediaSessionConnector
usuwa teraz playlistę po zatrzymaniu. Aplikacje, które chcą zachować playlistę, mogą wywoływaćsetClearMediaItemsOnStop(false)
w oprogramowaniu sprzęgającym.
- Domyślnie
- Rozszerzenie Cast:
- Rozszerzenie FFmpeg:
- Spraw, aby funkcja
build_ffmpeg.sh
korzystała z funkcji bin utils, a nie GNU (#9933).
- Spraw, aby funkcja
- Zgodność z Androidem 12:
- Uaktualnij rozszerzenie Cast, by korzystało z wtyczki
com.google.android.gms:play-services-cast-framework:20.1.0
. Wcześniejsze wersje systemuplay-services-cast-framework
nie są zgodne z aplikacjami kierowanymi na Androida 12 i będą powodować awarię z błędemIllegalArgumentException
podczas tworzenia komponentówPendingIntent
(#9528).
- Uaktualnij rozszerzenie Cast, by korzystało z wtyczki
- Usuń wycofane symbole:
- Usuń
Player.EventListener
. Użyj w zamian zasadyPlayer.Listener
. - Usuń
MediaSourceFactory#setDrmSessionManager
,MediaSourceFactory#setDrmHttpDataSourceFactory
iMediaSourceFactory#setDrmUserAgent
. Użyj w zamian zasadyMediaSourceFactory#setDrmSessionManagerProvider
. - Usuń
MediaSourceFactory#setStreamKeys
. Użyj w zamian zasadyMediaItem.Builder#setStreamKeys
. - Usuń
MediaSourceFactory#createMediaSource(Uri)
. Użyj w zamian zasadyMediaSourceFactory#createMediaSource(MediaItem)
. - Usuń
setTag
zDashMediaSource
,HlsMediaSource
iSsMediaSource
. Użyj w zamian zasadyMediaItem.Builder#setTag
. - Usuń
DashMediaSource#setLivePresentationDelayMs(long, boolean)
. UżyjMediaItem.Builder#setLiveConfiguration
iMediaItem.LiveConfiguration.Builder#setTargetOffsetMs
, aby zastąpić plik manifestu, lubDashMediaSource#setFallbackTargetLiveOffsetMs
, aby podać wartość zastępczą. - Usuń
(Simple)ExoPlayer.setThrowsWhenUsingWrongThread
. Nie można już zrezygnować z egzekwowania wątku. - Usuń użytkowników
ActionFile
iActionFileUpgradeUtil
. Użyj ExoPlayera w wersji 2.16.1 lub wcześniejszej, aby scalić pliki działańActionFileUpgradeUtil
wDefaultDownloadIndex
. - Usuń
ProgressiveMediaSource#setExtractorsFactory
. Użyj konstruktoraProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)
. - Usuń
ProgressiveMediaSource.Factory#setTag
iProgressiveMediaSource.Factory#setCustomCacheKey
. Zamiast niej używaj znacznikówMediaItem.Builder#setTag
iMediaItem.Builder#setCustomCacheKey
. - Usuń konstruktora
DefaultRenderersFactory(Context, @ExtensionRendererMode int)
iDefaultRenderersFactory(Context, @ExtensionRendererMode int, long)
. Zamiast nich użyj konstruktoraDefaultRenderersFactory(Context)
,DefaultRenderersFactory#setExtensionRendererMode
iDefaultRenderersFactory#setAllowedVideoJoiningTimeMs
. - Usuń wszystkie publiczne konstruktory
CronetDataSource
. Użyj w zamian zasadyCronetDataSource.Factory
.
- Usuń
- Zmień
IntDefs
tylko na@Target(TYPE_USE)
. Może to zakłócić kompilację użycia w Kotlinie, co można poprawić, przenosząc adnotację do 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
opakowaniu)@FlacExtractor.Flags
(wcom.google.android.exoplayer2.extractor.flac
pakiecie)@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-alfa01
27 października 2021 roku
Aplikacja androidx.media3:media3-*:1.0.0-alpha01
została zwolniona.
Wersja 1.0.0-alpha01 zawiera te zatwierdzenia.
Nowe funkcje
Media3 to nowe miejsce na biblioteki obsługi multimediów, w tym ExoPlayer. Pierwsza wersja alfa zawiera wczesne, funkcjonalne implementacje bibliotek do implementowania przypadków użycia multimediów, w tym:
- ExoPlayer – odtwarzacz multimedialny na poziomie aplikacji na Androida, który można łatwo dostosować i rozszerzyć.
- Funkcjonalność sesji multimedialnej – eksponowanie i sterowanie odtwarzaniem. Ten nowy moduł sesji używa tego samego interfejsu
Player
co ExoPlayer. - Komponenty UI do tworzenia interfejsów odtwarzania multimediów.
- funkcje dodawania modułów z innych bibliotek do wykorzystania z ExoPlayer, np. wstawiania reklam za pomocą pakietu IMA SDK.
Więcej informacji znajdziesz w artykule o projekcie Media3 na GitHubie.
Komponent ExoPlayer był wcześniej hostowany w osobnym projekcie ExoPlayer na GitHubie. W Media3 nazwa pakietu to androidx.media3.exoplayer
. Planujemy nadal utrzymywać i publikować projekt ExoPlayer na GitHubie przez jakiś czas, aby dać aplikacjom czas na migrację do Media3. Media3 ma zamienniki wszystkich modułów ExoPlayer z wyjątkiem starszych rozszerzeń media2 i mediasession, które zostały zastąpione nowym modułem media3-session
. Pozwala to na bezpośrednią integrację odtwarzaczy z sesjami multimediów bez konieczności używania adaptera/klasy oprogramowania sprzęgającego.