Media3
Ostatnia aktualizacja | Wersja stabilna | Wersja kandydująca | Wersja Beta | Wersja alfa |
---|---|---|---|---|
30 października 2024 r. | 1.4.1 | - | 1.5.0-beta01 | 1.5.0-alfa01 |
Deklarowanie zależności
Aby dodać zależność od Media3, musisz dodać repozytorium Google Maven do projektu. Więcej informacji znajdziesz w repozytorium Maven firmy Google.
Dodaj zależności dla artefaktów, których potrzebujesz, w pliku build.gradle
aplikacji lub modułu:
Odlotowe
dependencies { def media3_version = "1.4.1" // For media playback using ExoPlayer implementation "androidx.media3:media3-exoplayer:$media3_version" // For DASH playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-dash:$media3_version" // For HLS playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-hls:$media3_version" // For SmoothStreaming playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version" // For RTSP playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version" // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation "androidx.media3:media3-exoplayer-midi:$media3_version" // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation "androidx.media3:media3-exoplayer-ima:$media3_version" // For loading data using the Cronet network stack implementation "androidx.media3:media3-datasource-cronet:$media3_version" // For loading data using the OkHttp network stack implementation "androidx.media3:media3-datasource-okhttp:$media3_version" // For loading data using librtmp implementation "androidx.media3:media3-datasource-rtmp:$media3_version" // For building media playback UIs implementation "androidx.media3:media3-ui:$media3_version" // For building media playback UIs for Android TV using the Jetpack Leanback library implementation "androidx.media3:media3-ui-leanback:$media3_version" // For exposing and controlling media sessions implementation "androidx.media3:media3-session:$media3_version" // For extracting data from media containers implementation "androidx.media3:media3-extractor:$media3_version" // For integrating with Cast implementation "androidx.media3:media3-cast:$media3_version" // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version" // For transforming media files implementation "androidx.media3:media3-transformer:$media3_version" // For applying effects on video frames implementation "androidx.media3:media3-effect:$media3_version" // For muxing media files implementation "androidx.media3:media3-muxer:$media3_version" // Utilities for testing media components (including ExoPlayer components) implementation "androidx.media3:media3-test-utils:$media3_version" // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation "androidx.media3:media3-test-utils-robolectric:$media3_version" // Common functionality for reading and writing media containers implementation "androidx.media3:media3-container:$media3_version" // Common functionality for media database components implementation "androidx.media3:media3-database:$media3_version" // Common functionality for media decoders implementation "androidx.media3:media3-decoder:$media3_version" // Common functionality for loading data implementation "androidx.media3:media3-datasource:$media3_version" // Common functionality used across multiple media libraries implementation "androidx.media3:media3-common:$media3_version" // Common Kotlin-specific functionality implementation "androidx.media3:media3-common-ktx:$media3_version" }
Kotlin
dependencies { val media3_version = "1.4.1" // For media playback using ExoPlayer implementation("androidx.media3:media3-exoplayer:$media3_version") // For DASH playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-dash:$media3_version") // For HLS playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-hls:$media3_version") // For SmoothStreaming playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version") // For RTSP playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version") // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation("androidx.media3:media3-exoplayer-midi:$media3_version") // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation("androidx.media3:media3-exoplayer-ima:$media3_version") // For loading data using the Cronet network stack implementation("androidx.media3:media3-datasource-cronet:$media3_version") // For loading data using the OkHttp network stack implementation("androidx.media3:media3-datasource-okhttp:$media3_version") // For loading data using librtmp implementation("androidx.media3:media3-datasource-rtmp:$media3_version") // For building media playback UIs implementation("androidx.media3:media3-ui:$media3_version") // For building media playback UIs for Android TV using the Jetpack Leanback library implementation("androidx.media3:media3-ui-leanback:$media3_version") // For exposing and controlling media sessions implementation("androidx.media3:media3-session:$media3_version") // For extracting data from media containers implementation("androidx.media3:media3-extractor:$media3_version") // For integrating with Cast implementation("androidx.media3:media3-cast:$media3_version") // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version") // For transforming media files implementation("androidx.media3:media3-transformer:$media3_version") // For applying effects on video frames implementation("androidx.media3:media3-effect:$media3_version") // For muxing media files implementation("androidx.media3:media3-muxer:$media3_version") // Utilities for testing media components (including ExoPlayer components) implementation("androidx.media3:media3-test-utils:$media3_version") // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation("androidx.media3:media3-test-utils-robolectric:$media3_version") // Common functionality for reading and writing media containers implementation("androidx.media3:media3-container:$media3_version") // Common functionality for media database components implementation("androidx.media3:media3-database:$media3_version") // Common functionality for media decoders implementation("androidx.media3:media3-decoder:$media3_version") // Common functionality for loading data implementation("androidx.media3:media3-datasource:$media3_version") // Common functionality used across multiple media libraries implementation("androidx.media3:media3-common:$media3_version") // Common Kotlin-specific functionality implementation("androidx.media3:media3-common-ktx:$media3_version") }
Więcej informacji o zależnościach znajdziesz w artykule Dodawanie zależności kompilacji.
Opinia
Twoja opinia pomoże nam ulepszyć Jetpacka. Korzystając z śledzika problemów z Media3, możesz znaleźć odpowiedzi na pytania, zgłaszać znane problemy i zgłaszać prośby o dodanie funkcji oraz zgłaszać nowe problemy.
Wersja 1.5
Wersja 1.5.0-beta01
30 października 2024 r.
androidx.media3:media3-*:1.5.0-beta01
został zwolniony.
Wersja 1.5.0-beta01 zawiera te komity.
- Biblioteka wspólna:
- Usuń adnotacje
@DoNotInline
z ręcznie wylistowanych wewnętrznych klas, aby uniknąć błędów weryfikacji klasy w czasie wykonywania. Najnowsze wersje R8 automatycznie wywołują takie wywołania offline, aby uniknąć błędów w czasie wykonywania (nie jest już wymagane ręczne wywoływanie offline). Wszyscy użytkownicy biblioteki Gradle muszą już używać wersji wtyczki Gradle dla Androida, która korzysta z wersji R8, która to z kolei wykorzystujecompileSdk = 35
. Użytkownicy biblioteki korzystający z systemów kompilacji innych niż Gradle muszą zadbać o to, aby ich odpowiednik kroku kompresji/zaciemnienia R8 wykonywał podobny automatyczny proces wyodrębniania, aby uniknąć błędów weryfikacji klasy w czasie wykonywania. Ta zmiana została już wprowadzona w innych bibliotekach AndroidX.
- Usuń adnotacje
- ExoPlayer:
- Naprawiono błąd, który powodował, że
MediaCodec.CryptoException
był czasami zgłaszany jako „nieoczekiwany błąd podczas działania”, gdyMediaCodec.CryptoException
działał w trybie asynchronicznym (domyślne zachowanie w wersji interfejsu API 31 lub nowszej).MediaCodec
- Zamiast
bufferedPositionUs
podajbufferedDurationUs
wPreloadMediaSource.PreloadControl.onContinueLoadingRequested()
. ZmianaDefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS
naDefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS
powoduje, że aplikacje muszą przekazać wartość reprezentującą konkretny czas trwania od domyślnej pozycji początkowej, dla której odpowiednie źródło multimediów musi zostać wstępnie załadowane za pomocą tej definicji typu int, zamiast pozycji. - Dodaj implementację
ForwardingRenderer
, która przekierowuje wszystkie wywołania metod do innego renderera (1703). - Dodaj wstępne wczytywanie playlisty dla następnego elementu na playliście. Aplikacje mogą włączyć wstępne wczytywanie, wywołując odpowiednio polecenie
ExoPlayer.setPreloadConfiguration(PreloadConfiguration)
. Wstępne wczytywanie jest domyślnie wyłączone. Gdy ta opcja jest włączona i nie chcesz zakłócać odtwarzania,DefaultLoadControl
ogranicza wstępne wczytywanie do rozpoczęcia i kontynuowania tylko wtedy, gdy odtwarzacz się nie wczytuje. Aplikacje mogą zmienić to zachowanie, implementując kodLoadControl.shouldContinuePreloading()
(np. przy zastąpieniu tej metody wDefaultLoadControl
). Domyślna implementacjaLoadControl
wyłącza wstępne wczytywanie w przypadkach, gdy aplikacja używa niestandardowej implementacjiLoadControl
. - Dodaj metodę
MediaSourceEventListener.EventDispatcher.dispatchEvent()
, aby umożliwić wywoływanie zdarzeń detektorów podklas (1736). - Dodaj obiekt
DefaultPreloadManager.Builder
, który kompiluje instancjeDefaultPreloadManager
iExoPlayer
o spójnych konfiguracjach. - Usuń parametr
Renderer[]
z funkcjiLoadControl.onTracksSelected()
, ponieważ implementacjaDefaultLoadControl
może pobierać typy strumieni z funkcjiExoTrackSelection[]
. - Wycofana metoda
DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])
została oznaczona jako ostateczna, aby zapobiec jej zastąpieniu. Zamiast niego należy używać nowejDefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])
. - Raportuj zdarzenia typu
MediaSourceEventListener
ze źródeł dodatkowych w usłudzeMergingMediaSource
. Spowoduje to zgłoszenie zdarzeń rozpoczęcia, błędu, anulowania i zakończenia wczytywania napisów wyświetlanych na ekranie (dodanych za pomocąMediaItem.LocalConfiguration.subtitleConfigurations
), które mogą być wyświetlane jako zduplikowane zdarzenia wczytywania emitowane przezAnalyticsListener
. - Zapobiegaj błędom napisów i metadanych przed całkowitym zatrzymaniem odtwarzania.
Zamiast tego wyłączyliśmy problemowy utwór, a pozostałe utwory będą odtwarzane dalej (#1722).
- W nowej obsłudze napisów (podczas wyodrębniania) powiązane błędy analizy (np. nieprawidłowe dane napisów) i błędy wczytywania (np. HTTP 404) są emitowane za pomocą wywołań zwrotnych
onLoadError
. - W przypadku obsługi starszych napisów (podczas renderowania) tylko powiązane błędy wczytywania są emitowane za pomocą wywołań zwrotnych
onLoadError
, a błędy parsowania są ignorowane (jest to wcześniejsze zachowanie).
- W nowej obsłudze napisów (podczas wyodrębniania) powiązane błędy analizy (np. nieprawidłowe dane napisów) i błędy wczytywania (np. HTTP 404) są emitowane za pomocą wywołań zwrotnych
- Naprawiono błąd, który powodował, że
- Transformator:
- Ustaw czas trwania obrazu za pomocą funkcji
MediaItem.Builder.setImageDurationMs
jako obowiązkowy element eksportu obrazu. - Dodano obsługę eksportu luk w sekwencjach plików audio EditedMediaItems.
- Ustaw czas trwania obrazu za pomocą funkcji
- Wybór utworu:
DefaultTrackSelector
: wolą dźwięk bazujący na obiektach niż dźwięk kanałowy, gdy inne czynniki są równe.
- Moduły wyodrębniania danych:
- Poprawiono obsługę próbki preroll dla pozycji rozpoczęcia mediów, które nie są kluczowymi klatkami, podczas przetwarzania list edycji w plikach MP4 (#1659).
- Ulepszono obliczanie częstotliwości klatek za pomocą czasu trwania multimediów z pola
mdhd
wMp4Extractor
iFragmentedMp4Extractor
(#1531). - Poprawka nieprawidłowego skalowania
media_time
w listach edycji MP4. Podczas gdysegment_duration
została już prawidłowo przeskalowana za pomocą skali czasowej filmu,media_time
jest teraz prawidłowo przeskalowana za pomocą skali czasowej ścieżki zgodnie ze standardem formatu MP4 (#1792). - Obsługuj nieodpowiednie klatki w obliczeniach funkcji
endIndices
w przypadku MP4 z listą edycji (#1797).
- Dźwięk:
- Poprawiono dźwięki trzasknięcia, które mogły występować podczas przewijania.
- Naprawiono gromadzenie błędów związanych z odcięciem w przypadku algorytmu rozciągania czasu i zmiany wysokości dźwięku w Sonic.
- Naprawiono błąd w
SpeedChangingAudioProcessor
, który powodował utratę klatek na wyjściu.
- Film:
- Dodano obejście problemu z urządzeniem Galaxy Tab S7 FE, który powodował, że strumienie zabezpieczone H264 z częstotliwością 60 fps były oznaczane jako niedostępne (#1619).
- Dodaj obejście dla kodeków, które blokują się po odtworzeniu ostatniego przykładu bez zwracania sygnału końca strumienia.
- Tekst:
- Upewnij się, że wyświetlane są napisy WebVTT w HLS z bardzo dużymi sygnaturami czasowymi napisów (które przepełniają 64-bitową
long
, gdy są reprezentowane jako mikrosekundy i pomnożone przez bazę czasu MPEG90,000
) (#1763).
- Upewnij się, że wyświetlane są napisy WebVTT w HLS z bardzo dużymi sygnaturami czasowymi napisów (które przepełniają 64-bitową
- Metadane:
- Przypisz typ
C.TRACK_TYPE_METADATA
do ścieżek zawierających treści icy lub vnd.dvb.ait.
- Przypisz typ
- DRM:
- Napraw
IllegalStateException
zDefaultDrmSession.requiresSecureDecoder
po otwarciu sesji DRM. Ten problem pojawił się w wersji1.5.0-alpha01
.
- Napraw
- Muxery:
- Rozszerzenie IMA:
- Naprawiono błąd, w którym strumienie DAI wstawiane po stronie serwera bez prerollu mogły powodować
ArrayIndexOutOfBoundsException
podczas odtwarzania po ostatniej reklamie midroll (#1741).
- Naprawiono błąd, w którym strumienie DAI wstawiane po stronie serwera bez prerollu mogły powodować
- Sesja:
- Naprawiono błąd, który powodował, że niestandardowe polecenia wysyłane z usługi
MediaBrowser
były wysyłane do usługiMediaSessionCompat.Callback
zamiast do usługiMediaBrowserServiceCompat
, gdy użytkownik był połączony ze starszą usługą. To uniemożliwiłoMediaBrowser
otrzymanie rzeczywistej wartości zwróconej przez starszą usługę (#1474). - Obsługa wyjątku
IllegalArgumentException
zgłaszanego przez urządzenia niektórych producentów podczas konfigurowania odbiornika transmisji dla intencji przycisku multimediów (#1730). - Dodawanie przycisków poleceń dla elementów multimediów. Spowoduje to dodanie interfejsu Media3 API do biblioteki znanej jako
Custom browse actions
do starszej biblioteki wMediaBrowserCompat
. Pamiętaj, że przyciski poleceń Media3 dla elementów multimedialnych są dostępne zarówno w przypadkuMediaBrowser
, jak iMediaController
. Zobacz niestandardowe działania przeglądania w AAOS. - Naprawiono błąd, który powodował, że kontroler Media3 nie zawsze pozwalał aplikacji sesji na uruchomienie usługi na pierwszym planie po wysłaniu żądania
play()
. - Ogranicz
CommandButton.Builder.setIconUri
, aby akceptować tylko identyfikatory URI treści. - Przekazywanie wskazówek dotyczących połączenia przeglądarki Media3 do początkowego
MediaBrowserCompat
podczas łączenia się z starszą wersjąMediaBrowserCompat
. Usługa może otrzymywać wskazówki dotyczące połączenia przekazywane jako wskazówki główne z pierwszym wywołaniem funkcjionGetRoot()
. - Naprawiono błąd polegający na tym, że gdy przeglądarka
MediaBrowser
była połączona ze starszą wersją przeglądarki, nie otrzymywała wiadomości o błędzie wysłanych przez tę usługę po zasubskrybowaniu przeglądarkiparentid
. - Poprawić działanie interoperacyjności, aby przeglądarka Media3 połączona ze starszą wersją
MediaBrowserService
nie wysyłała żądania do podrzędnychparentId
dwukrotnie, gdy subskrybuje wersję nadrzędną.
- Naprawiono błąd, który powodował, że niestandardowe polecenia wysyłane z usługi
- UI:
- Z powodu problemów ze współdzielonymi przejściami opartymi na formacie XML włącz w usłudze
PlayerView
-in-Compose-AndroidView
rozciągnięte/przycięte filmy. Aplikacje korzystające z funkcjiPlayerView
w ramachAndroidView
muszą wywoływać funkcjęPlayerView.setEnableComposeSurfaceSyncWorkaround
, aby umożliwić użytkownikom wyrażenie zgody (#1237, #1594). - Dodaj
setFullscreenButtonState
doPlayerView
, aby umożliwić aktualizację ikony przycisku pełnoekranowego na żądanie, czyli poza pasmem i nie w reakcji na kliknięcie (#1590, #184). - Naprawiono błąd polegający na tym, że opcja „Brak” w zaznaczonym tekście nie działa, jeśli istnieją preferencje wyboru ścieżki tekstowej zdefiniowane przez aplikację.
- Z powodu problemów ze współdzielonymi przejściami opartymi na formacie XML włącz w usłudze
- Rozszerzenie Płynne strumieniowanie:
- Poprawiono błąd
Bad magic number for Bundle
podczas odtwarzania strumieni SmoothStreaming ze ścieżkami tekstowymi (#1779).
- Poprawiono błąd
- Rozszerzenie RTSP:
- Popraw usuwanie informacji o użytkowniku w przypadku adresów URL zawierających zakodowane znaki @ (#1138).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Dodano obsługę stron o rozmiarze 16 KB w przypadku rozszerzeń dekodera na Androidzie 15 (#1685).
- Rozszerzenie Cast:
- Zatrzymanie czyszczenia osi czasu po rozłączeniu sesji przesyłania, co umożliwia aplikacji nadawcy wznowienie odtwarzania lokalnie po rozłączeniu.
- Wypełnij parametr
DeviceInfo
w CastPlayer, gdy podany jest parametrContext
. Umożliwia to połączenieMediaSession
z elementemRoutingSession
, co jest niezbędne do integracji przełącznika wyjścia (#1056).
- Usuń wycofane symbole:
- Usuń wycofane konstruktory
DefaultEncoderFactory
. Zamiast tego użyj atrybutuDefaultEncoderFactory.Builder
.
- Usuń wycofane konstruktory
Wersja 1.5.0-alpha01
10 września 2024 r.
W tej wersji wprowadzono następujące zmiany w porównaniu z wersją 1.4.1:
- Biblioteka wspólna:
- Dodaj element
ForwardingSimpleBasePlayer
, który umożliwia przekazywanie dalej do innego odtwarzacza z niewielkimi zmianami, a jednocześnie zapewnia pełną spójność i obsługę słuchaczy (#1183). - Zastąp metodę
SimpleBasePlayer.State.playlist
metodągetPlaylist()
. - Dodaj zastąpienie dla
SimpleBasePlayer.State.Builder.setPlaylist()
, aby bezpośrednio określićTimeline
oraz bieżąceTracks
iMetadata
zamiast tworzyć strukturę playlisty. - Zwiększ
minSdk
do 21 (Android Lollipop). Jest to zgodne ze wszystkimi innymi bibliotekami AndroidX. - Dodaj element
androidx.media3:media3-common-ktx
, który zapewnia funkcje związane z językiem Kotlin i oparte na bibliotece wspólnej. - Dodaj funkcję zawieszania rozszerzenia
Player.listen
, aby uruchomić rutynę w celu nasłuchiwania funkcjiPlayer.Events
w bibliotecemedia3-common-ktx
.
- Dodaj element
- ExoPlayer:
MediaCodecRenderer.onProcessedStreamChange()
można teraz wywoływać dla każdego elementu multimedialnego. Wcześniej nie wywołano pierwszego. Aby włączyć tę funkcję, użyj poleceniaMediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart()
.- Dodaj
PreloadMediaSource.PreloadControl.onPreloadError
, aby umożliwić implementacjiPreloadMediaSource.PreloadControl
wykonywania działań w przypadku wystąpienia błędu. - Dodaj
BasePreloadManager.Listener
, aby propagować zdarzenia wstępnego wczytywania do aplikacji. - Zezwalanie na zmianę limitu czasu klienta SNTP i ponowne próby wysyłania danych do alternatywnych adresów w przypadku przekroczenia limitu czasu (problem 1540).
- Usuń
MediaCodecAdapter.Configuration.flags
, ponieważ pole zawsze zawierało wartość zero. - Zezwalaj użytkownikowi na wybranie wbudowanego głośnika do odtwarzania na Wear OS w wersji API 35 lub nowszej (gdzie urządzenie reklamuje obsługę tej funkcji).
- Odrocz wywołanie blokady do
Context.getSystemService(Context.AUDIO_SERVICE)
, dopóki nie włączysz obsługi skupienia na dźwięku. Dzięki temu nie dochodzi do blokowania połączeń, jeśli nie jest włączone obsługiwanie dźwięku w przypadku skupienia (#1616). - Zezwalanie na odtwarzanie niezależnie od czasu buforowania w przypadku niepowodzenia wczytywania (#1571).
- Dodaj
AnalyticsListener.onRendererReadyChanged()
, aby zasygnalizować, że poszczególne renderowanie pozwala na odtwarzanie.
- Transformator:
- Dodaj
SurfaceAssetLoader
, który umożliwia kolejkowanie danych wideo do usługi Transformer za pomocąSurface
. ImageAssetLoader
zwraca nieobsługiwany typ danych za pomocąAssetLoader.onError
zamiastIllegalStateException
.
- Dodaj
- Wyodrębnianie:
- Zezwalaj na to, aby
Mp4Extractor
iFragmentedMp4Extractor
rozpoznawały próbki H264, które nie są używane jako odniesienie przez kolejne próbki. - Dodanie opcji włączania przeskakiwania na podstawie indeksu w
AmrExtractor
. - Pliki MP3 z więcej niż 128 kB między prawidłowymi ramkami są traktowane jako obcięte (zamiast nieprawidłowe). Oznacza to, że pliki z danymi innymi niż MP3 na końcu, bez innych metadanych wskazujących długość bajtów MP3, będą teraz odtwarzane do końca danych MP3 zamiast kończyć się z błędem
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}
(#1563).
- Zezwalaj na to, aby
- DataSource:
- Zaktualizuj
HttpEngineDataSource
, aby umożliwić korzystanie z wersji S rozszerzenia 7 zamiast poziomu interfejsu API 34 (#1262).
- Zaktualizuj
- Dźwięk:
- Automatycznie skonfiguruj metadane głośności CTA-2075 w kodeki, jeśli są one obecne w multimediów.
- zapewnić płynne zmniejszanie głośności podczas przewijania.
- Film:
MediaCodecVideoRenderer
pozwala uniknąć dekodowania próbek, które nie są renderowane ani używane jako odwołanie przez inne przykłady.- W interfejsie API 35 i nowszych
MediaCodecAdapter
może teraz otrzymywaćnull
Surface
wconfigure
i wywoływać nową metodędetachOutputSurface
, aby usunąć wcześniej ustawionySurface
, jeśli kodek obsługuje tę funkcję (MediaCodecInfo.detachedSurfaceSupported
). - Podczas przetwarzania
onOutputFormatChanged
użyj wartości współczynnika proporcji pikseliMediaCodecAdapter
, jeśli zostały podane (#1371).
- Tekst:
- Dodaj niestandardowy element
VoiceSpan
i wypełnij go dla odcinków głosowych WebVTT (#1632).
- Dodaj niestandardowy element
- Obraz:
- Dodaj
ExternallyLoadedImageDecoder
, aby uprościć integrację z bibliotekami zewnętrznymi do ładowania obrazów, takimi jak Glide czy Coil.
- Dodaj
- DataSource:
- Dodaj
FileDescriptorDataSource
, nowy obiektDataSource
, którego można używać do odczytu z polaFileDescriptor
(#3757).
- Dodaj
- Efekt:
- Dodaj obejście problemu
DefaultVideoFrameProcessor
w przypadku drobnegoSurfaceTexture
zwiększania skali.SurfaceTexture
może zawierać niewielkie skalowanie, które odcina 1-texelską krawędź przyciętego bufora. Teraz jest to obsługiwane, dzięki czemu wyniki są bliższe oczekiwanym. - Przyspiesz
DefaultVideoFrameProcessor.queueInputBitmap()
. W rezultacie eksportowanie obrazów do filmów za pomocąTransformer
jest szybsze.
- Dodaj obejście problemu
- Rozszerzenie IMA:
- Naprawiono błąd, w którym wyczyszczenie playlisty mogło spowodować błąd
ArrayIndexOutOfBoundsException
wImaServerSideAdInsertionMediaSource
.
- Naprawiono błąd, w którym wyczyszczenie playlisty mogło spowodować błąd
- Sesja:
- Dodaj
MediaButtonReceiver.shouldStartForegroundService(Intent)
, aby umożliwić aplikacjom pominięcie polecenia odtwarzania przychodzącego w celu wznowienia odtwarzania przez zastąpienie tej metody. Domyślnie usługa jest zawsze uruchomiona i odtwarzanie nie może zostać wstrzymane, jeśli system nie spowoduje awarii usługi za pomocą koduForegroundServiceDidNotStartInTimeException
(#1528).
- Dodaj
- Rozszerzenie DASH:
- Dodawanie obsługi okresów rozpoczynających się w środku segmentu (#1440).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Dodaj moduł dekodera IAMF, który zapewnia obsługę odtwarzania plików MP4 zawierających ścieżki IAMF przy użyciu natywnej biblioteki libiamf do syntezy dźwięku.
- Odtwarzanie jest włączone w układzie stereo i 5.1 ze sterowaniem przestrzennym oraz opcjonalnym śledzeniem ruchów głowy, ale obsługa odtwarzania binauralnego jest obecnie niedostępna.
- Dodaj moduł dekodera IAMF, który zapewnia obsługę odtwarzania plików MP4 zawierających ścieżki IAMF przy użyciu natywnej biblioteki libiamf do syntezy dźwięku.
- Rozszerzenie Cast:
- Zatrzymanie czyszczenia osi czasu po rozłączeniu sesji przesyłania, co umożliwia aplikacji przesyłającej wznowienie odtwarzania lokalnie po rozłączeniu.
- Wypełnij parametr
DeviceInfo
w CastPlayer, gdy podano parametrContext
. Umożliwia to połączenieMediaSession
z elementemRoutingSession
, co jest niezbędne do integracji przełącznika wyjścia (#1056).
- Narzędzia testowe:
DataSourceContractTest
zawiera teraz testy, które sprawdzają:- Strumień wejściowy
read position
został zaktualizowany. - Bufor wyjściowy
offset
jest stosowany prawidłowo.
- Strumień wejściowy
- Usuń symbole wycofane:
- Usuń wycofane
Player.hasPrevious
,Player.hasPreviousWindow()
. Użyj w zamian zasadyPlayer.hasPreviousMediaItem()
. - Usuń przestarzała metodę
Player.previous()
. Zamiast tego użyj atrybutuPlayer.seekToPreviousMediaItem()
. - Usuń przestarzała metodę
DrmSessionEventListener.onDrmSessionAcquired
.
- Usuń wycofane
Wersja 1.4.0
Wersja 1.4.1
27 sierpnia 2024 r.
Usługa androidx.media3:media3-*:1.4.1
została zwolniona.
Wersja 1.4.1 zawiera te komity.
- ExoPlayer:
- Moduły wyodrębniania danych:
- MP3: napraw błąd
Searched too many bytes
, prawidłowo ignorując dane końcowe inne niż MP3 na podstawie pola długości w ramceInfo
(#1480).
- MP3: napraw błąd
- Tekst:
- TTML: poprawić obsługę wartości procentowych
tts:fontSize
, aby były one prawidłowo dziedziczone z węzłów nadrzędnych z wartościami procentowymitts:fontSize
. - Napraw
IndexOutOfBoundsException
wLegacySubtitleUtil
z powodu nieprawidłowego obsługiwania przypadku, gdy żądany czas rozpoczęcia danych wyjściowych jest większy lub równy końcowemu zdarzeniu wSubtitle
(#1516).
- TTML: poprawić obsługę wartości procentowych
- DRM:
- Naprawiono błąd
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE
na urządzeniach z interfejsem API w wersji 31 i nowszych, na których odtwarzane są treści L1 Widevine. Ten błąd jest spowodowany niepełną implementacją metody platformyMediaDrm.requiresSecureDecoder
(#1603).
- Naprawiono błąd
- Skutek:
- Dodaj formę płatności
release()
doGlObjectsProvider
.
- Dodaj formę płatności
- Sesja:
- Rozszerzenie RTSP:
- Pomijanie nieprawidłowych opisów multimediów podczas analizowania SDP (#1087).
Wersja 1.4.0
25 lipca 2024 r.
androidx.media3:media3-*:1.4.0
został zwolniony.
Wersja 1.4.0 zawiera te komitowane zmiany.
- Biblioteka wspólna:
- Przesyłaj do metod
BasePlayer.seekTo()
iSimpleBasePlayer.handleSeek()
chronione wywołania seek, które prawdopodobnie nie wymagają wykonania żadnej operacji, zamiast je ignorować. Jeśli te metody są stosowane w niestandardowym odtwarzaczu, może być konieczne obsłużenie tych dodatkowych wywołań za pomocą funkcjimediaItemIndex == C.INDEX_UNSET
. - Usuń zależność kompilacji od ulepszonej desugaring Java 8 (#1312).
- Upewnij się, że czas trwania przekazany do
MediaItem.Builder.setImageDurationMs()
jest ignorowany w przypadku elementów innych niż obrazyMediaItem
(jak to zostało udokumentowane). - Dodaj
Format.customData
, aby przechowywać informacje niestandardowe dotyczące instancjiFormat
dostarczone przez aplikację.
- Przesyłaj do metod
- ExoPlayer:
- Dodaj
BasePreloadManager
, który koordynuje wstępny wczytywanie wielu źródeł na podstawie priorytetów zdefiniowanych przez ichrankingData
. Dostosowywanie jest możliwe dzięki rozszerzeniu tej klasy. DodajDefaultPreloadManager
, który używaPreloadMediaSource
do wstępnego załadowania próbek multimediów źródeł do pamięci, oraz liczby całkowitejrankingData
, która wskazuje indeks elementu w interfejsie. - Dodaj
PlayerId
do większości metodLoadControl
, aby umożliwićLoadControl
implementacje obsługujące wielu graczy. - Usuń
Buffer.isDecodeOnly()
iC.BUFFER_FLAG_DECODE_ONLY
. Nie trzeba ustawiać tej flagi, ponieważ renderowanie i dekodowanie zdecydują o pominięciu buforów na podstawie sygnatury czasowej. Niestandardowe implementacjeRenderer
powinny sprawdzać, czy czas buforowania wynosi co najmniejBaseRenderer.getLastResetPositionUs()
, aby zdecydować, czy należy wyświetlić próbkę. W przypadku niestandardowych implementacjiSimpleDecoder
można sprawdzićisAtLeastOutputStartTimeUs()
w razie potrzeby lub oznaczyć inne bufory za pomocąDecoderOutputBuffer.shouldBeSkipped
, aby je pominąć. - Zezwalaj na zwracanie przez
TargetPreloadStatusControl.getTargetPreloadStatus(T)
wartości null, aby wskazać, że nie należy wstępnie wczytywaćMediaSource
za pomocą podanego parametrurankingData
. - Dodano
remove(MediaSource)
doBasePreloadManager
. - Dodaj
reset()
doBasePreloadManager
, aby zwolnić wszystkie źródła z zatrzymaniem, a jednocześnie zachować instancję menedżera wstępnego wczytania. - Dodaj
ExoPlayer.setPriority()
(iBuilder.setPriority()
), aby zdefiniować wartość priorytetu używaną wPriorityTaskManager
i w przypadku znaczenia MediaCodec z interfejsu API 35. - Rozwiązanie problemu z aktualizacją ostatniego czasu ponownego buforowania, który powodował nieprawidłowy klucz
bs
(niedobór bufora) w CMCD (#1124). - Dodaj
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
, aby wskazać, że źródło zostało wczytane do końca. Umożliwia to implementacjomDefaultPreloadManager
i specjalnym implementacjomPreloadMediaSource.PreloadControl
wstępne załadowanie następnego źródła lub wykonanie innych działań. - Naprawiono błąd, który powodował, że pomijanie ciszy na końcu elementów mogło wywołać wyjątek odtwarzania.
- Aby odrzucić okres wstępnego wczytywania, dodaj
clear
doPreloadMediaSource
. - Dodaj nowy kod błędu
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED
, który jest używany, gdy zasoby kodeka są odzyskiwane na potrzeby zadań o wyższym priorytecie. - Pozwalaj
AdsMediaSource
wczytywać reklamy przed rozpoczęciem przygotowywania treści (#1358). - Naprawiono błąd, który powodował, że odtwarzanie przenosiło się do
STATE_ENDED
podczas ponownego przygotowywania transmisji na żywo DASH z wieloma okresami po usunięciu oryginalnego okresu z pliku manifestu. - Zmień nazwę
onTimelineRefreshed()
naonSourcePrepared()
, aonPrepared()
naonTracksSelected()
wPreloadMediaSource.PreloadControl
. Odpowiednio zmień też nazwy definicji interfejsów w plikuDefaultPreloadManager.Stage
. - Dodanie eksperymentalnej obsługi dynamicznego harmonogramowania w celu lepszego dopasowania pracy do cykli aktywacji procesora i opóźnienia aktywacji do momentu, gdy renderowanie może się rozpocząć.
Możesz to włączyć, używając
experimentalSetDynamicSchedulingEnabled()
podczas konfigurowania instancji ExoPlayera. - Dodaj
Renderer.getDurationToProgressUs()
.Renderer
może zaimplementować tę metodę, aby zwrócić do ExoPlayera czas trwania odtwarzania, który musi zostać przesunięty, aby renderer mógł kontynuować. JeśliExoPlayer
jest ustawiony za pomocąexperimentalSetDynamicSchedulingEnabled()
,ExoPlayer
wywoła tę metodę podczas obliczania czasu, aby zaplanować zadanie robocze. - Dodaj
MediaCodecAdapter#OnBufferAvailableListener
, aby otrzymywać alerty, gdyMediaCodecRenderer
ma dostęp do buforów danych wejściowych i wyjściowych.MediaCodecRenderer
będzie wysyłać sygnały doExoPlayer
po otrzymaniu tych wywołań zwrotnych. JeśliExoPlayer
jest ustawiony naexperimentalSetDynamicSchedulingEnabled()
,ExoPlayer
będzie planować swoją pętlę roboczą, gdy tylko renderowanie będzie się posuwać do przodu. - Zamiast poszczególnych parametrów w metodach
LoadControl
używaj klasy danych. - Dodaj
ExoPlayer.isReleased()
, aby sprawdzić, czy funkcjaExoplayer.release()
została wywołana. - Dodaj
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()
, aby skonfigurować maksymalną pozycję, z której funkcjaseekToPrevious()
wyszukuje poprzedni element (#1425). - Poprawiono niespójności w przyciąganiu uwagi dźwiękiem, np. brak zgłaszania pełnego lub chwilowego utraty skupienia podczas pauzy odtwarzacza (#1436).
- Naprawiono potencjalny błąd
IndexOutOfBoundsException
spowodowany przez ekstraktory zgłaszające dodatkowe ścieżki po początkowym etapie przygotowania (#1476). - Funkcja
Effects
w regionieExoPlayer.setVideoEffect()
otrzyma sygnatury czasowe z usuniętym przesunięciem mechanizmu renderowania (#1098). - Naprawiono potencjalny błąd
IllegalArgumentException
podczas obsługi błędu odtwarzacza, który wystąpił podczas odczytu do przodu innego elementu playlisty (#1483).
- Dodaj
- Transformator:
- Dodaj
audioConversionProcess
ivideoConversionProcess
doExportResult
, aby wskazać, jak powstała dana ścieżka w pliku wyjściowym. - Zmniejszenie liczby kontroli poziomu H.264 w optymalizacji przycinania.
- Dodanie obsługi sekwencyjnego przełączania się między SDR a HDR.
- Dodaliśmy obsługę efektów dźwiękowych na poziomie kompozycji.
- Dodaliśmy obsługę transkodowania obrazów Ultra HDR na filmy HDR.
- Rozwiązanie problemu polegającego na tym, że po zresetowaniu i ponownym użyciu,
DefaultAudioMixer
nie zwraca prawidłowej liczby bajtów. - obejście błędu dekodera, w którym liczba kanałów audio była ograniczona do stereo podczas obsługi wejścia PCM;
- Podczas wybierania ścieżek w
ExoPlayerAssetLoader
ignoruj ograniczenia dotyczące liczby kanałów audio, ponieważ dotyczą one tylko odtwarzania. - Zastąp interfejs
androidx.media3.transformer.Muxer
interfejsemandroidx.media3.muxer.Muxer
i usuńandroidx.media3.transformer.Muxer
. - Naprawiono wczytywanie obrazów HEIC ze schematów identyfikatorów URI treści. (#1373).
- Aby poprawić synchronizację obrazu i dźwięku, dostosuj czas trwania ścieżki audio w
AudioGraphInput
. - Usuń pole
ExportResult.processedInputs
. Jeśli używasz tego pola do określenia szczegółów kodeka, użyj zamiast tego polaDefaultDecoderFactory.listener
. W przypadku wyjątku dotyczącego kodeka szczegóły dotyczące tego kodeka będą dostępne wExportException.codecInfo
.
- Dodaj
- Wyodrębnianie:
- MPEG-TS: wycofuj zmianę tak, aby renderowała ostatnią klatkę, przekazując ostatnią jednostkę dostępu strumienia do kolejki próbek (#7909). Wprowadzono poprawki, które rozwiązują problemy występujące w przypadku strumieni HLS tylko z ramkami I(#1150) i strumieni HLS H.262 (#1126).
- MP3: wybieraj rozmiar danych z klatki
Info
zamiast rozmiaru zgłaszanego przez strumień źródłowy (np. rozmiar pliku lub nagłówek HTTPContent-Length
). Pomaga to wykluczyć z obliczeń wyszukiwania z stałym bitrate’em dane dotyczące nieodtwarzalnych zwiastunów (np. okładki albumów), co zwiększa dokładność wyszukiwania (#1376). - MP3: na podstawie liczby klatek i innych danych w klatce
Info
(jeśli występują) oblicz średnią szybkość transmisji bitów dla stałej szybkości transmisji bitów, zamiast zawyżać szybkość transmisji bitów klatki po klatceInfo
, która może być sztucznie mała, np.PCUT
(#1376). - Naprawić wyodrębnianie formatu audio PCM w kontenerach AVI.
- Dźwięk:
- Naprawiono atrybuty kodowania DTS:X Profile 2 w przypadku odtwarzania przezroczystego (#1299).
- W przypadku odtwarzania w pamięci podręcznej zresetuj pole śledzenia zakończenia strumienia w
DefaultAudioSink
przed wywołaniemAudioTrack.stop()
, abyAudioTrack.StreamEventCallback#onPresentationEnded
prawidłowo rozpoznawał, kiedy odtworzono wszystkie oczekujące dane. - Usunięto błąd w
SilenceSkippingAudioProcessor
, w którym przejścia między różnymi formatami audio (np. stereo na mono) mogły spowodować wyjątek w procesorze (#1352). - Zaimplementuj
MediaCodecAudioRenderer.getDurationToProgressUs()
, by ExoPlayer dynamicznie zaplanował, kiedy główna pętla pracy może wykonać MediaCodecAudioRenderer.
- Film:
- Rozwiązanie problemu polegającego na tym, że
Listener.onRenderedFirstFrame()
pojawia się zbyt wcześnie podczas przełączania powierzchni w trakcie odtwarzania. - Naprawić logikę dekodera zapasowego dla Dolby Vision, aby w razie potrzeby używać zgodnego dekodera AV1 (#1389).
- Napraw wyjątek w kodeku, który może być spowodowany włączeniem mechanizmu renderowania wideo w trakcie odtwarzania.
- Rozwiązanie problemu polegającego na tym, że
- Tekst:
- Rozwiązaliśmy problem, który powodował pomijanie napisów, które zaczynają się przed pozycją przesunięcia. Ten problem pojawił się tylko w Media3 w wersji 1.4.0-alpha01.
- Zmień domyślny sposób analizy napisów, tak aby miał miejsce podczas wyodrębniania, a nie podczas renderowania (różnicę 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)
. Aby dowiedzieć się, jak podłączyć te komponenty do instancjiExoPlayer
, zapoznaj się z dokumentacją dotyczącą dostosowywania. Te metody (oraz cała obsługa starszego dekodowania napisów) zostaną usunięte w przyszłej wersji. - Aplikacje z niestandardową implementacją
SubtitleDecoder
muszą zostać zaktualizowane, aby zamiast niej używaćSubtitleParser
(a zamiastSubtitleDecoderFactory
–SubtitleParser.Factory
).
- Tę zmianę można zastąpić, wywołując zarówno
- PGS: napraw dekodowanie długości trwania, aby wskazać
0
jako indeks kolorów zamiast dosłownej wartości koloru (#1367). - CEA-708: zignoruj wartość
rowLock
. Specyfikacja CEA-708-E S-2023 mówi, że obie wartości właściwościrowLock
icolumnLock
powinny być traktowane jako prawdziwe, niezależnie od wartości występujących w strumieniu (obsługacolumnLock
nie jest zaimplementowana, więc w rzeczywistości przyjmuje się, że zawsze ma ona wartość fałsz).- Informacje te zostały pierwotnie uwzględnione w notatkach do wersji
1.3.0-alpha01
, ale zostały przypadkowo cofnięte przed wydaniem wersji1.3.0-rc01
. Problem został rozwiązany, więc zmiana jest ponownie widoczna.
- Informacje te zostały pierwotnie uwzględnione w notatkach do wersji
- CEA-708: unikaj dodawania powielonych wierszy do nowego wiersza w wyniku niesłusznego korzystania przez ExoPlayer z polecenia „set pen location” (ustawienie lokalizacji pióra) (#1315).
- Napraw
IllegalArgumentException
zLegacySubtitleUtil
, gdy próbka napisów WebVTT nie zawiera żadnych wskazówek, np. w ramach strumienia DASH (#1516).
- Metadane:
- Poprawiono mapowanie tagów sortowania MP4 na ID3. Wcześniej tagi MP4 „album sort” (
soal
), „artist sort” (soar
) i „album artist sort” (soaa
) były błędnie mapowane na tagi ID3TSO2
,TSOA
iTSOP
(#1302). - Naprawiono odczyt tagów MP4 (/iTunes)
gnre
(gatunek) itmpo
(tempo), gdy ich wartość ma więcej niż 1 bajt. - Propaguj ramkę
TCON
o identyfikatorze 3 doMediaMetadata.genre
(#1305).
- Poprawiono mapowanie tagów sortowania MP4 na ID3. Wcześniej tagi MP4 „album sort” (
- Obraz:
- Dodaj obsługę niekwadratowych siatek miniatur DASH (#1300).
- Dodanie obsługi formatu AVIF w przypadku interfejsu API w wersji 34 lub nowszej.
- Dopuszczanie wartości
null
jako parametru dlaExoPlayer.setImageOutput()
w celu wyczyszczenia wcześniej ustawionej wartościImageOutput
.
- DataSource:
- Wdrożyć obsługę identyfikatorów URI surowych zasobów
android.resource://package/id
, gdziepackage
jest inny niż pakiet bieżącej aplikacji. Wcześniej nie było to udokumentowane, ale jest to wydajniejszy sposób uzyskiwania dostępu do zasobów w innym pakiecie niż przez nazwę. - W konstruktorach
DataSpec
sprawdź, czyurl
jest niezerową wartością. Ten parametr został już oznaczony jako niepusty. - Zezwalaj funkcji
ByteArrayDataSource
na rozstrzyganie identyfikatora URI do tablicy bajtów podczasopen()
, zamiast być zakodowany na stałe podczas budowy (#1405).
- Wdrożyć obsługę identyfikatorów URI surowych zasobów
- DRM:
- Zezwalaj na ustawienie
LoadErrorHandlingPolicy
wDefaultDrmSessionManagerProvider
(#1271).
- Zezwalaj na ustawienie
- Skutek:
- Obsługuj kilka zmian szybkości w obrębie tego samego
EditedMediaItem
lubComposition
w poluSpeedChangeEffect
. - Obsługa danych wyjściowych HLG i PQ z wejścia bitmapy ultra HDR.
- Dodaliśmy obsługę EGL_GL_COLORSPACE_BT2020_HLG_EXT, która poprawia jakość wyjścia powierzchni HLG w ExoPlayer.setVideoEffect i Debug SurfaceView w Transformer.
- Zaktualizuj implementację macierzy nakładki, aby była zgodna z dokumentacją. Aby to zrobić, obróć wartości x i y zastosowane w funkcji
setOverlayFrameAnchor()
. Jeśli używaszOverlaySettings.Builder.setOverlayFrameAnchor()
, odwróć ich wartości x i y, mnożąc je przez-1
. - Naprawiono błąd, który powodował awarię aplikacji
TimestampWrapper
podczas korzystania z aplikacjiExoPlayer#setVideoEffects
(#821). - Zmień domyślną przestrzeń roboczą kolorów SDR z kolorów liniowych na elektryczne BT 709 SDR. Dodaj też trzecią opcję, aby zachować oryginalną przestrzeń barw.
- Zezwalanie na definiowanie nieokreślonego z-orderu dla EditedMediaItemSequences (#1055).
- Zachowanie spójnego zakresu luminacji w różnych częściach treści HDR (korzystanie z zakresu HLG).
- Dodaliśmy obsługę nakładek Ultra HDR (bitmapy) w przypadku treści HDR.
- Zezwalanie na używanie efektów
SeparableConvolution
przed wersją API 26. - Usuń nieużywane
OverlaySettings.useHdr
, ponieważ zakres dynamiczny nakładki i ramki musi być taki sam. - Dodano obsługę HDR w przypadku zdjęć (
TextOverlay
). Jasność nakładki tekstowej można dostosować za pomocąOverlaySettings.Builder.setHdrLuminanceMultiplier()
.
- Obsługuj kilka zmian szybkości w obrębie tego samego
- Rozszerzenie IMA:
- Przeniesienie interfejsu API, który jest wymagany do odtwarzania strumynów reklam DAI w aplikacjach, do wersji stabilnej.
- Dodaj tag
replaceAdTagParameters(Map <String, String>)
do taguImaServerSideAdInsertionMediaSource.AdLoader
, który umożliwia zastępowanie parametrów tagu reklamy w czasie wykonywania. - Naprawiono błąd, który powodował, że funkcja
VideoAdPlayer.VideoAdPlayerCallback.onError()
nie była wywoływana, gdy podczas odtwarzania reklamy wystąpił błąd odtwarzacza (#1334). - Zmień wersję pakietu IMA SDK na 3.33.0, aby naprawić błąd
NullPointerException
, jeśli używasz identyfikatorów URI tagu reklamydata://
(#700).
- Sesja:
- Zmień domyślną wartość
CommandButton.enabled
natrue
i upewnij się, że w przypadku kontrolerów wartość może pozostać jako fałsz, nawet jeśli powiązane polecenie jest dostępne. - Dodaj stałe ikon
CommandButton
, które powinny być używane zamiast niestandardowych zasobów ikon. - Dodaj
MediaSessionService.isPlaybackOngoing()
, aby umożliwić aplikacjom wysyłanie zapytań o to, czy wonTaskRemoved()
(#1219) trzeba zatrzymać usługę. - Dodaj
MediaSessionService.pauseAllPlayersAndStopSelf()
, który pozwala w wygodny sposób wstrzymać odtwarzanie wszystkich sesji i wywołać funkcjęstopSelf()
, aby zakończyć cykl życiaMediaSessionService
. - Zastąpić
MediaSessionService.onTaskRemoved(Intent)
, aby zapewnić bezpieczną implementację domyślną, która utrzymuje usługę na pierwszym planie, jeśli odtwarzanie jest w toku, lub w przeciwnym razie zatrzymuje usługę. - Ukryj suwak w powiadomieniu o multimediów w przypadku transmisji na żywo, nie ustawiając czasu trwania w metadanych sesji platformy (#1256).
- Dopasuj konwersję atrybutu
MediaMetadata
do atrybutuMediaDescriptionCompat
, aby podczas wybierania właściwości metadanych używać tej samej preferowanej kolejności i logiki co w przypadku atrybutów w media1. - Dodaj
MediaSession.sendError()
, który umożliwia wysyłanie błędów niekrytycznych do kontrolera Media3. W przypadku korzystania z kontrolera powiadomień (patrzMediaSession.getMediaNotificationControllerInfo()
) błąd niestandardowy jest używany do aktualizowaniaPlaybackState
sesji platformy do stanu błędu z podanymi informacjami o błędzie (#543). - Dodaj
MediaSession.Callback.onPlayerInteractionFinished()
, aby informować o zakończeniu serii interakcji gracza z konkretnym kontrolerem. - Dodaj
SessionError
i użyj go wSessionResult
iLibraryResult
zamiast kodu błędu, aby przekazać więcej informacji o błędzie i sposobie jego rozwiązania (jeśli to możliwe). - Opublikuj kod aplikacji testowej sterownika media3, która może służyć do testowania interakcji z aplikacjami publikującymi sesję multimedialną.
- Przekaż dodatkowe informacje przekazane do
MediaSession[Builder].setSessionExtras()
w media3 doMediaSession[Builder].setSessionExtras()
sterownika media1.PlaybackStateCompat.getExtras()
- Zmapuj błędy krytyczne i niekrytyczne na sesję platformy i z niej.
PlaybackException
jest mapowany na stan błędu krytycznego wPlaybackStateCompat
.SessionError
wysłany do kontrolera powiadomień o mediach z wartościąMediaSession.sendError(ControllerInfo, SessionError)
jest mapowany na błąd niekrytyczny wPlaybackStateCompat
, co oznacza, że kod błędu i komunikat są ustawione, ale stan sesji platformy pozostaje inny niżSTATE_ERROR
. - Zezwalanie na ustawianie aktywności sesji przez poszczególne kontrolery w celu zastąpienia aktywności sesji globalnej. Aktywność sesji można zdefiniować dla kontrolera w momencie połączenia, tworząc
ConnectionResult
zAcceptedResultBuilder.setSessionActivivty(PendingIntent)
. Po nawiązaniu połączenia aktywność sesji można zaktualizować za pomocąMediaSession.setSessionActivity(ControllerInfo, PendingIntent)
. - Popraw replikację błędów wywołań funkcji
MediaLibrarySession.Callback
. Replikację błędów można teraz skonfigurować, używając opcjiMediaLibrarySession.Builder.setLibraryErrorReplicationMode()
do wyboru typu błędu lub rezygnacji z replikacji błędów, która jest domyślnie włączona.
- Zmień domyślną wartość
- UI:
- Dodaj obsługę wyświetlania obrazów w
PlayerView
po połączeniu zExoPlayer
(#1144). - Dodaj możliwość dostosowywania różnych ikon w elementach
PlayerControlView
za pomocą atrybutów XML, aby umożliwić tworzenie różnych obiektów do rysowania na podstawie poszczególnych wystąpień elementuPlayerView
, a nie globalnych zastąpień (#1200). - Obchodzenie błędu platformy, który powoduje rozciąganie lub przycinanie wideo podczas używania elementu
SurfaceView
w komponencieAndroidView
w wersji interfejsu API 34 (#1237).
- Dodaj obsługę wyświetlania obrazów w
- Pobrane:
- Upewnij się, że
DownloadHelper
nie ujawnia nieopublikowanych instancjiRenderer
, co może doprowadzić do awarii aplikacji przy użyciuIllegalStateException: Too many receivers, total of 1000, registered for pid
(#1224).
- Upewnij się, że
- Rozszerzenie Cronet:
- Napraw
SocketTimeoutException
wCronetDataSource
. W niektórych wersjach Cronet żądanie przekazywane przez funkcję wywołania zwrotnego nie jest zawsze takie samo. Spowoduje to, że wywołanie zwrotne nie zostanie ukończone i przekroczy limit czasu żądania (https://issuetracker.google.com/328442628).
- Napraw
- Rozszerzenie HLS:
- Naprawiono błąd, który powodował, że oczekujące próbki EMSG oczekujące na przerwę były delegowane w
HlsSampleStreamWrapper
z nieprawidłowym przesunięciem, co powodowało błądIndexOutOfBoundsException
lub błądIllegalArgumentException
(#1002). - Usunięto błąd, który powodował ciągłe wczytywanie niegłównych playlist w przypadku strumieni LL-HLS (#1240).
- Naprawiono błąd, który powodował, że włączenie CMCD dla HLS z segmentami inicjowania powodowało błąd
Source Error
iIllegalArgumentException
. - Usunięto błąd, który powodował, że inne niż główne odtwarzane playlisty nie były odświeżane podczas odtwarzania na żywo (#1240).
- Naprawiono błąd, który powodował problemy z włączeniem CMCD w przypadku transmisji na żywo HLS.
ArrayIndexOutOfBoundsException
(#1395).
- Naprawiono błąd, który powodował, że oczekujące próbki EMSG oczekujące na przerwę były delegowane w
- Rozszerzenie DASH:
- Rozszerzenie Cast:
- Naprawiono błąd, który powodował konwersję tytułu albumu
MediaQueueItem
na wykonawcę w elemencie multimedialnym Media3 (#1255).
- Naprawiono błąd, który powodował konwersję tytułu albumu
- Narzędzia testowe:
- Zaimplementuj
onInit()
ionRelease()
wFakeRenderer
. - Zmień metody
TestPlayerRunHelper.runUntil()/playUntil()
tak, aby nie działały w przypadku błędów niekrytycznych (np. zgłoszonych doAnalyticsListener.onVideoCodecError()
). Aby wyłączyć to zachowanie, użyj nowego łańcucha metodTestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()
.
- Zaimplementuj
- Aplikacja demonstracyjna:
- Użyj
DefaultPreloadManager
w aplikacji demonstracyjnej krótkich form. - Umożliwienie ustawiania trybu powtarzania za pomocą argumentów
Intent
z poziomu wiersza poleceń (#1266). - Użyj
HttpEngineDataSource
jakoHttpDataSource
, jeśli urządzenie obsługuje tę funkcję.
- Użyj
- Usuń symbole wycofane:
- Usuń
CronetDataSourceFactory
. Użyj w zamian zasadyCronetDataSource.Factory
. - Usuń niektóre konstruktory
DataSpec
. Użyj w zamian zasadyDataSpec.Builder
. - Usuń metodę płatności
setContentTypePredicate(Predicate)
z kontDefaultHttpDataSource
,OkHttpDataSource
iCronetDataSource
. Zamiast tego użyj w przypadku każdego elementuXXXDataSource.Factory
odpowiednich metod. - Usuń konstruktory
OkHttpDataSource
iOkHttpDataSourceFactory
. Zamiast tego użyj polaOkHttpDataSource.Factory
. - Usuń
PlayerMessage.setHandler(Handler)
. Użyj w zamian zasadysetLooper(Looper)
. - Usuń pole
Timeline.Window.isLive
. Zamiast tego użyj metodyisLive()
. - Usuń konstruktory
DefaultHttpDataSource
. UżyjDefaultHttpDataSource.Factory
. - Usuń
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS
. Zamiast tego użyj atrybutuDashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS
. - Usuń
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)
. Zamiast tego użyj polaMediaCodecInfo.canReuseCodec(Format, Format)
. - Usuń metody płatności
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 tego użyj przeciążeń, które przyjmują argumentDecoderReuseEvaluation
. - Usuń stałe
RendererSupport.FormatSupport
iFORMAT_HANDLED
,FORMAT_EXCEEDS_CAPABILITIES
,FORMAT_UNSUPPORTED_DRM
,FORMAT_UNSUPPORTED_SUBTYPE
iFORMAT_UNSUPPORTED_TYPE
. Zamiast tego użyj odpowiednich definicji typu IntDef i konstant w funkcjiandroidx.media3.common.C
(np.C.FORMAT_HANDLED
). - Usuń interfejs
Bundleable
. Obejmuje to usunięcie wszystkich pól stałychBundleable.Creator<Foo> CREATOR
. Wywołujący powinni w przypadku każdego typu używać metodBundle toBundle()
istatic Foo fromBundle(Bundle)
.
- Usuń
Wersja 1.4.0-rc01
10 lipca 2024 r.
Użyj wersji stabilnej 1.4.0.
Wersja 1.4.0-beta01
26 czerwca 2024 r.
Użyj wersji stabilnej 1.4.0.
Wersja 1.4.0-alpha02
7 czerwca 2024 r.
Użyj wersji stabilnej 1.4.0.
Wersja 1.4.0-alpha01
17 kwietnia 2024 r.
Użyj wersji stabilnej 1.4.0.
Wersja 1.3.0
Wersja 1.3.1
11 kwietnia 2024 r.
androidx.media3:media3-*:1.3.1
został zwolniony.
Wersja 1.3.1 zawiera te zatwierdzenia.
- Biblioteka wspólna:
- Dodaj
Format.labels
, aby zezwolić na lokalizowane lub inne alternatywne etykiety.
- Dodaj
- ExoPlayer:
- Rozwiązanie problemu polegającego na tym, że
PreloadMediaPeriod
nie może zachować strumieni po ponownym załadowaniu. - Zastosuj właściwą wartość
TrackSelectionResult
do okresu odtwarzania przy ponownym wyborze utworu. - Rozpoczynanie renderowania wczesnego tylko po przesunięciu okresu odtwarzania podczas przechodzenia między elementami multimediów (#1017).
- Dodaj brakujący typ zwracania do reguły proguard
-keepclasseswithmembers
w przypadkuDefaultVideoFrameProcessor.Factory.Builder.build()
(#1187).
- Rozwiązanie problemu polegającego na tym, że
- Transformator:
- Dodaj obejście wyjątku zgłoszonego, ponieważ
MediaMuxer
nie obsługuje wykluczających sygnatur czasowych prezentacji przed interfejsem API 30.
- Dodaj obejście wyjątku zgłoszonego, ponieważ
- Wybór utworu:
DefaultTrackSelector
: preferuj ścieżki wideo z „rozsądną” liczbą klatek na sekundę (≥ 10 fps) zamiast tych z niższą lub nieskonfigurowaną liczbą klatek na sekundę. Dzięki temu odtwarzacz wybierze „prawdziwą” ścieżkę wideo w plikach MP4 wyodrębnionych z filmów poklatkowych, które mogą zawierać 2 ścieżki HEVC, z których jedna ma wyższą rozdzielczość, ale bardzo małą liczbę klatek (#1051).
- Wyodrębnianie:
- Rozwiązanie problemu, który powodował, że podczas odczytu nieparzystych rozmiarów fragmentów z plików WAV nie było pomijane wypełnienie (#1117).
- MP3: wypełnij plik
Format.averageBitrate
z ramek metadanych, takich jakXING
iVBRI
. - MPEG-TS: cofnięcie zmiany, która miała zagwarantować wyrenderowanie ostatniej klatki, przez przekazanie ostatniej jednostki dostępu strumienia do kolejki próbek (#7909). Wynika to ze zmiany, która powoduje nowe problemy ze strumieniami HLS (#1150) i H.262 HLS (#1126) tylko ze strumieniami I-Frame.
- Dźwięk:
- Zezwalaj na przywracanie mechanizmu renderowania przez wyłączenie funkcji odciążania, jeśli nie uda się zainicjować ścieżki audio w trybie odciążania.
- Film:
- Dodawanie obejścia problemu z urządzeniem Galaxy Tab S7 FE, Chromecastem z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie H265 60 fps są oznaczone jako niedostępne
- Dodaj obejście, które zapewni, że pierwsza klatka będzie zawsze renderowana podczas tunelowania, nawet jeśli urządzenie nie zrobi tego automatycznie zgodnie z wymaganiami interfejsu API (#1169). (#966).
- Rozwiązanie problemu, który polegał na tym, że obsługa informacji o kolorach HDR powoduje nieprawidłowe działanie kodeka i uniemożliwia przełączanie formatu adaptacyjnego ścieżek wideo SDR (#1158).
- Tekst:
- WebVTT: zapobieganie tworzeniu przez bezpośrednio następujące po sobie sygnały dodatkowego
CuesWithTiming
instancje zWebvttParser.parse
(#1177).
- WebVTT: zapobieganie tworzeniu przez bezpośrednio następujące po sobie sygnały dodatkowego
- DRM:
- obejście problemu
NoSuchMethodError
, który może zostać wywołany przez frameworkMediaDrm
zamiastResourceBusyException
lubNotProvisionedException
na niektórych urządzeniach z Androidem 14 (#1145);
- obejście problemu
- Efekt:
- Ulepszona mapa tonów PQ na SDR poprzez konwersję przestrzeni kolorów.
- Sesja:
- Interfejs:
- Jeśli
Locale
nie może zidentyfikować wyświetlanej nazwy, dodaj nazwę języka ścieżki audio (#988).
- Jeśli
- Rozszerzenie DASH:
- Wypełnij wszystkie elementy
Label
z pliku manifestu wFormat.labels
(#1054).
- Wypełnij wszystkie elementy
- Rozszerzenie RTSP:
- Pomiń puste wartości informacji o sesji (i-tagi) 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 z lokalnej zależności, mogą go ponownie włączyć.
Wersja 1.3.0
6 marca 2024 roku
androidx.media3:media3-*:1.3.0
został zwolniony.
Wersja 1.3.0 zawiera te komity.
- Biblioteka wspólna:
- Wprowadź obsługę nieprzetworzonych identyfikatorów URI zasobów
android.resource://package/[type/]name
, gdziepackage
jest inny niż pakiet bieżącej aplikacji. Ta funkcja była zawsze udokumentowana, ale do tej pory nie była prawidłowo implementowana. - Normalizuj typy MIME ustawione przez kod aplikacji lub odczytane z multimediów, tak aby były w całości małymi literami.
- Zamiast pojedynczej wartości
Uri
w poluAdPlaybackState
definiuj reklamy za pomocą pełnej wartościMediaItem
. - Zwiększ
minSdk
do 19 (Android KitKat). Jest to zgodne ze wszystkimi innymi bibliotekami AndroidX i jest wymagane, abyśmy mogli zaktualizować do najnowszych wersji zależności AndroidX. - Wypełnij pola
artworkUri
iartworkData
w poluMediaMetadata.Builder.populate(MediaMetadata)
, gdy co najmniej 1 z nich ma wartość inną niż null (#964).
- Wprowadź obsługę nieprzetworzonych identyfikatorów URI zasobów
- ExoPlayer:
- Dodaj
PreloadMediaSource
iPreloadMediaPeriod
, które umożliwiają aplikacjom wstępne wczytanie źródła multimediów w konkretnej pozycji początkowej przed odtworzeniem.PreloadMediaSource
zajmuje się przygotowaniem źródła multimediów treści do odbioruTimeline
, przygotowaniem i zapisaniem okresu w podanej pozycji początkowej, wybraniem ścieżek i załadowaniem danych multimediów dla tego okresu. Aplikacje kontrolują postęp wstępnego wczytywania, implementując poleceniePreloadMediaSource.PreloadControl
i ustawiając wstępnie wczytywane źródło do odtwarzacza, aby można było je odtwarzać. - Dodaj zasadę
ExoPlayer.setImageOutput
, która zezwala aplikacjom na konfigurowanie ustawieńImageRenderer.ImageOutput
. DefaultRenderersFactory
udostępnia terazImageRenderer
graczowi domyślnie z wartością nullImageOutput
iImageDecoder.Factory.DEFAULT
.- Emituj zdarzenie
Player.Listener.onPositionDiscontinuity
, gdy pominięto wyciszenie (#765). - Dodano eksperymentalną obsługę analizy napisów podczas wyodrębniania. Możesz to włączyć za pomocą
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
. - Obsługa dostosowanych źródeł multimediów za pomocą
PreloadMediaSource
. - Zaimplementuj
HttpEngineDataSource
(HttpDataSource
) za pomocą interfejsu API HttpEngine. - Zapobiegaj podklasyfikowaniu
CompositeSequenceableLoader
. Ten komponent został wcześniej rozszerzony, ale nigdy nie został podklasyfikowany w bibliotece. Dostosowania można wprowadzić, owijając instancję za pomocą wzoru dekoratora i wdrażając niestandardową funkcjęCompositeSequenceableLoaderFactory
. - Rozwiązanie problemu polegającego na tym, że powtarzanie tego samego czasu powoduje wyczyszczenie metadanych tego elementu (#1007).
- Zmień nazwy metod
experimentalSetSubtitleParserFactory
naBundledChunkExtractor.Factory
iDefaultHlsExtractorFactory
nasetSubtitleParserFactory
i zablokuj przekazywanie danychnull
. Używaj nowych metodexperimentalParseSubtitlesDuringExtraction(boolean)
do kontrolowania działania analizy. - Dodano obsługę dostosowywania
SubtitleParser.Factory
używanego podczas ekstrakcji. Umożliwia toMediaSource.Factory.setSubtitleParserFactory()
. - Dodaj prefiks źródła do wszystkich pól
Format.id
wygenerowanych zMergingMediaSource
. Pomaga to zidentyfikować źródło, które wygenerowało odpowiedźFormat
(#883). - Popraw wyrażenie regularne używane do sprawdzania nazw niestandardowych kluczy danych klienta w ramach usługi Common Media Data (CMCD), tak aby sprawdzało tylko obecność myślnika (#1028).
- Zaprzestanie podwójnego kodowania parametrów zapytania CMCD (#1075).
- Dodaj
- Transformer:
- Dodano obsługę spłaszczania filmów w zwolnionym tempie w formacie H.265/HEVC SEF.
- Zwiększ szybkość transmuksowania, zwłaszcza przy usuwaniu zmian za pomocą polecenia „usuń film”.
- Dodaj interfejs API, aby plik wyjściowy zaczynał się od klatki filmu. Dzięki temu operacje przycinania będą bardziej kompatybilne z implementacjami odtwarzaczy, które nie wyświetlają pierwszego klatki wideo do momentu jej sygnatury czasowej (#829).
- Dodanie obsługi optymalizacji operacji przycinania w formacie MP4 pojedynczego zasobu.
- Dodaj obsługę, aby klatka wideo miała w pliku wyjściowym pierwszą sygnaturę czasową. Naprawiono problem z plikami wyjściowymi zaczynającymi się od czarnego kadru w odtwarzaczach na iOS (#829).
- Wybór utworu:
- Aby umożliwić wybór ścieżki obrazów, dodaj
DefaultTrackSelector.selectImageTrack
. - Dodaj
TrackSelectionParameters.isPrioritizeImageOverVideoEnabled
, aby określić, czy wybrać ścieżkę obrazu, jeśli dostępne są zarówno ścieżka obrazu, jak i ścieżka wideo. Wartość domyślna tofalse
, co oznacza, że priorytetem jest wybór ścieżki wideo.
- Aby umożliwić wybór ścieżki obrazów, dodaj
- Moduły wyodrębniania danych:
- Dodaj do ekstraktora MP4 dodatkowe parsowanie AV1C, aby pobrać wartości
ColorInfo.colorSpace
,ColorInfo.colorTransfer
iColorInfo.colorRange
(#692). - MP3: użyj wyszukiwania z stałym bitrate (CBR) dla plików z nagłówkiem
Info
(odpowiadającemu CBR nagłówkowiXing
). Wcześniej używaliśmy tabeli przeskakiwania z nagłówkaInfo
, ale powoduje to mniej precyzyjne przeskakiwanie niż wtedy, gdy zignorujemy ten nagłówek i zakładamy, że plik jest w formacie CBR. - MPEG2-TS: dodanie obsługi DTS, DTS-LBR i DTS:X Profile2 (#275).
- Wyodrębnianie typów dźwięku z opisów TS i przypisywanie im flag ról, co pozwala użytkownikom na dokonywanie bardziej świadomych wyborów ścieżek audio (#973).
- Dodaj do ekstraktora MP4 dodatkowe parsowanie AV1C, aby pobrać wartości
- Dźwięk:
- Film:
- Zmień konstruktor
MediaCodecVideoRenderer
, który przyjmuje argumentVideoFrameProcessor.Factory
, i zastąp go konstruktorem, który przyjmuje argumentVideoSinkProvider
. Aplikacje, które chcą wstrzyknąć niestandardoweVideoFrameProcessor.Factory
, mogą utworzyć instancjęCompositingVideoSinkProvider
, która używa niestandardowegoVideoFrameProcessor.Factory
, i przekazać dostawcę odbiornika wideo doMediaCodecVideoRenderer
.
- Zmień konstruktor
- Tekst:
- Napraw serializację wskazówek bitmapy, aby rozwiązać błąd
Tried to marshall a Parcel that contained Binder objects
podczas używaniaDefaultExtractorsFactory.setTextTrackTranscodingEnabled
(#836). - CEA-708: ignoruj wartość
rowLock
. Specyfikacja CEA-708-E S-2023 określa, że wartościrowLock
icolumnLock
powinny być uznawane za prawdziwe niezależnie od wartości obecnych w strumieniu (obsługa parametrucolumnLock
nie jest implementowana, więc jest on uznawany za zawsze fałszywy).
- Napraw serializację wskazówek bitmapy, aby rozwiązać błąd
- Obraz:
- Dodaj obsługę miniatur DASH. Obrazy siatki są przycinane, a pojedyncze miniatury są dostarczane w
ImageOutput
w przybliżeniu do czasu ich wyświetlania.
- Dodaj obsługę miniatur DASH. Obrazy siatki są przycinane, a pojedyncze miniatury są dostarczane w
- DRM:
- Domyślnie odtwarzaj niezwłocznie nieszyfrowane próbki w treściach z DRM, nawet jeśli klucze do późniejszych zaszyfrowanych próbek nie są jeszcze gotowe. Może to spowodować zacinanie się odtwarzania, jeśli klucze nie będą jeszcze gotowe, gdy pozycja odtwarzania dotrze do zaszyfrowanych próbek (ale wcześniej odtwarzanie nie zostało jeszcze w ogóle rozpoczęte). To zachowanie można wyłączyć za pomocą funkcji
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey
lubDefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
.
- Domyślnie odtwarzaj niezwłocznie nieszyfrowane próbki w treściach z DRM, nawet jeśli klucze do późniejszych zaszyfrowanych próbek nie są jeszcze gotowe. Może to spowodować zacinanie się odtwarzania, jeśli klucze nie będą jeszcze gotowe, gdy pozycja odtwarzania dotrze do zaszyfrowanych próbek (ale wcześniej odtwarzanie nie zostało jeszcze w ogóle rozpoczęte). To zachowanie można wyłączyć za pomocą funkcji
- Rozszerzenie IMA:
- Rozwiązanie problemu polegającego na tym, że reklamy DASH i HLS bez odpowiedniej rozszerzenia pliku nie mogą być odtwarzane.
- Sesja:
- Wyłącz wykrywanie dwukrotnego kliknięcia w aplikacjach TV (#962).
- Rozwiązanie problemu polegającego na tym, że między kontrolerami multimediów a sesjami obiekt
MediaItem.RequestMetadata
z tylko niepustymi dodatkami nie jest przesyłany. - Dodaj do
MediaLibrarySession.Builder
konstruktor, który wymaga tylkoContext
zamiastMediaLibraryService
.
- Rozszerzenie HLS:
- Zmniejsz widoczność
HlsMediaPeriod
do widoczności prywatnej pakietu. Ten typ nie powinien być bezpośrednio zależny od pakietu HLS. - Rozwiązanie skuteczniej przeszukuje początek segmentu (#1031).
- Zmniejsz widoczność
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Dekoder MIDI: ignoruj komunikaty o zdarzeniach SysEx (#710).
- Narzędzia testowe:
- Nie wstrzymywać odtwarzania w aplikacji
TestPlayerRunHelper.playUntilPosition
. Test utrzymuje odtwarzanie w stanie odtwarzania, ale wstrzymuje postępy, dopóki nie będzie można dodać stwierdzeń i dalszych działań.
- Nie wstrzymywać odtwarzania w aplikacji
- Aplikacja demonstracyjna:
- Dodaj krótki moduł demonstracyjny, aby zaprezentować zastosowanie
PreloadMediaSource
w przypadku użycia krótkich treści.
- Dodaj krótki moduł demonstracyjny, aby zaprezentować zastosowanie
Wersja 1.3.0-rc01
22 lutego 2024 r.
Użyj wersji stabilnej 1.3.0.
Wersja 1.3.0-beta01
7 lutego 2024 r.
Użyj wersji stabilnej 1.3.0.
Wersja 1.3.0-alpha01
15 stycznia 2024 r.
Użyj wersji stabilnej 1.3.0.
Wersja 1.2.0
Wersja 1.2.1
9 stycznia 2024 r.
- ExoPlayer:
- Rozwiązaliśmy problem, w którym ręczne przewijanie poza zakres
LiveConfiguration.min/maxOffset
powodowało przesunięcie z powrotem domin/maxOffset
. - Rozwiązanie problemu polegającego na tym, że układy kanałów OPUS i VORBIS są nieprawidłowe w przypadku 3, 5, 6, 7 i 8 kanałów (#8396).
- Rozwiązaliśmy problem, który powodował, że wybór ścieżki po przesunięciu do zera w transmisji na żywo nieprawidłowo pozwalał na rozpoczęcie transmisji od pozycji domyślnej (#9347).
- Rozwiązanie problemu, w którym nowe wystąpienia
CmcdData.Factory
otrzymywały ujemne wartości atrybutubufferedDurationUs
ze źródeł fragmentów, co powodowało błądIllegalArgumentException
(#888).
- Rozwiązaliśmy problem, w którym ręczne przewijanie poza zakres
- Transformator:
- Rozwiąż problem, który powodował, że koder wydłużył czas konfiguracji z powodu ustawienia wysokiej szybkości działania.
- Moduły wyodrębniania danych:
- Oznacz dodatkowe (nieodtwarzane) ścieżki HEVC w zdjęciach ruchomych JPEG jako
ROLE_FLAG_ALTERNATE
, aby uniemożliwić ich automatyczne odtwarzanie ze względu na wyższą rozdzielczość. - Poprawić wykrywanie nieprawidłowej klatki kluczowej w przypadku strumieni TS H264 (#864).
- Naprawiono szacowanie czasu trwania strumieni TS dłuższych niż 47721 sekund (#855).
- Oznacz dodatkowe (nieodtwarzane) ścieżki HEVC w zdjęciach ruchomych JPEG jako
- Dźwięk:
- Naprawa obsługi EOS w przypadku funkcji
SilenceSkippingAudioProcessor
w przypadku wielokrotnego wywoływania (#712).
- Naprawa obsługi EOS w przypadku funkcji
- 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óry powoduje, że strumienie AVC 60 kl./s są oznaczane jako nieobsługiwane (#693).
- Metadane:
- Naprawiono błąd, w którym
MediaMetadata
było wypełniane tylko z komentarzy Vorbis z kluczami w wielkiej literze (#876). - Wyłapywanie
OutOfMemoryError
podczas analizowania bardzo dużych ramek ID3, co oznacza, że odtwarzanie może być kontynuowane bez informacji o tagu, a nie zakończyć się całkowicie.
- Naprawiono błąd, w którym
- DRM:
- Rozszerzenie obejścia problemu dotyczącego nieprawidłowego adresu URL licencji ClearKey
https://default.url
do poziomu API 33 lub nowszego (wcześniej obejście działało tylko w przypadku poziomu API 33) (#837). - Napraw
ERROR_DRM_SESSION_NOT_OPENED
, jeśli przełączasz się z zaszyfrowanej na oczyszczoną treść bez przymocowanej powierzchni do odtwarzacza. Ten błąd wystąpił z powodu nieprawidłowego użycia bezpiecznego dekodera do odtwarzania treści bez szyfrowania.
- Rozszerzenie obejścia problemu dotyczącego nieprawidłowego adresu URL licencji ClearKey
- Sesja:
- Umieść klucze i wartości niestandardowe w wartościach
MediaMetadataCompat
doMediaMetadata.extras
iMediaMetadata.extras
doMediaMetadataCompat
(#756, #802). - Naprawiono problem z transmisją
notifyChildrenChanged
w przypadku starszych kontrolerów (#644). - Naprawiono błąd, który powodował, że ustawienie ujemnego czasu w przypadku wyłączonego minutnika
setWhen
powiadomienia powodowało awarię na niektórych urządzeniach (#903). - Naprawiono błąd
IllegalStateException
, gdy kontroler powiadomienia o multimediach nie ukończy połączenia po żądaniu aktualizacji pierwszego powiadomienia (#917).
- Umieść klucze i wartości niestandardowe w wartościach
- UI:
- Rozwiązanie problemu polegającego na tym, że przyciski przewijania do przodu i do tyłu nie są widoczne podczas korzystania z BottomSheetDialogFragment w ramach Material Design (#511).
- Rozwiązanie problemu polegającego na tym, że przyciski przewijania do przodu w
PlayerControlView
były nieprawidłowo wyrównane (#547).
- Rozszerzenie DASH:
- Przeanalizuj „f800” jako liczbę kanałów 5 dla Dolby w pliku manifestu DASH (#688).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Rozszerzenie Cast:
- Sanitize creation of a
Timeline
to not crash the app when loading media fails on the cast device (#708).
- Sanitize creation of a
Wersja 1.2.0
15 listopada 2023 r.
- Biblioteka wspólna:
- Dodaj parametr
@Nullable Throwable
do metod w interfejsieLog.Logger
. Parametrmessage
tych metod nie zawiera już żadnych informacji o parametryThrowable
przekazanych metodomLog.{d,i,w,e}()
, więc implementacje będą musiały ręcznie dołączać te informacje (np. za pomocąLogger.appendThrowableString(String, Throwable)
). - Rozwiązanie problemu ze zgodnością z Kotlin, w którym ogólne parametry typu ogólne i elementy tablicy z możliwością wartości null nie są wykrywane jako dopuszczające wartości null. Przykładami są parametry metody
TrackSelectorResult
iSimpleDecoder
(#6792). - Zmień domyślne zachowanie interfejsu i powiadomień w
Util.shouldShowPlayButton
, aby wyświetlić przycisk „odtwórz” podczas tymczasowego wstrzymania odtwarzania (np. z powodu chwilowego utraty skupienia na dźwięku). Aby zachować zachowanie zgodne ze starszymi wersjami, użyj opcjiPlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)
lubMediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)
(#11213). - Aby rozwiązać problem https://issuetracker.google.com/251172715, zaktualizuj wersję
androidx.annotation:annotation-experimental
na1.3.1
. - Przenieś
ExoPlayer.setAudioAttributes
do interfejsuPlayer
.
- Dodaj parametr
- ExoPlayer:
- Rozwiązanie problemów z przewijaniem w strumieniu AC4 spowodowanych nieprawidłowym rozpoznawaniem próbek przeznaczonych tylko do dekodowania (#11000).
- Dodaj blokowanie odtwarzania na nieodpowiednich urządzeniach wyjściowych audio (np. wbudowanym głośniku na urządzeniach z Wear OS), gdy ta funkcja jest włączona w
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput
. Jeśli podczas odtwarzania nie ma dostępnych odpowiednich wyjść audio lub wszystkie odpowiednie wyjścia zostaną odłączone podczas odtwarzania, przyczyna tłumienia odtwarzania zostanie zaktualizowana naPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
. Po podłączeniu odpowiedniego wyjścia przyczyna pominięcia zostanie usunięta. - Dodaj
MediaSource.canUpdateMediaItem
iMediaSource.updateMediaItem
, aby zaakceptować aktualizacje typuMediaItem
po utworzeniu wPlayer.replaceMediaItem(s)
. - Zezwalaj na aktualizacje
MediaItem
dla wszystkich klasMediaSource
udostępnianych przez bibliotekę za pomocąPlayer.replaceMediaItem(s)
(#33, #9978). - Zmień nazwę
MimeTypes.TEXT_EXOPLAYER_CUES
naMimeTypes.APPLICATION_MEDIA3_CUES
. - Dodaj
PngExtractor
, który wysyła i odczytuje cały plik PNG doTrackOutput
jako jedną próbkę. - Ulepszona metoda
SequenceableLoader.continueLoading(long)
w interfejsieSequenceableLoader
została zastąpiona metodąSequenceableLoader.continueLoading(LoadingInfo loadingInfo)
.LoadingInfo
zawiera dodatkowe parametry, w tymplaybackSpeed
ilastRebufferRealtimeMs
oprócz obecnychplaybackPositionUs
. - Ulepsz metodę
ChunkSource.getNextChunk(long, long, List, ChunkHolder)
w interfejsieChunkSource
do wersjiChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
. - Dodaj dodatkowe pola do rejestrowania danych klienta w ramach wspólnego interfejsu mediów (CMCD): buffer starvation (
bs
), deadline (dl
), playback rate (pr
) i startup (su
) (#8699). - Dodaj głębię bitową luminacji i chrominancji do
ColorInfo
(#491). - Dodaj dodatkowe pola do rejestrowania danych klienta w ramach wspólnego interfejsu mediów (CMCD): żądanie następnego obiektu (
nor
) i żądanie następnego zakresu (nrr
) (#8699). - Dodaj funkcję przesyłania danych klienta wspólnego multimediów (CMCD) za pomocą parametrów zapytania (#553).
- Napraw problem
ConcurrentModificationException
w sekcjiExperimentalBandwidthMeter
(#612). - Dodaj parametr
MediaPeriodId
doCompositeMediaSource.getMediaTimeForChildMediaTime
. - Obsługa
ClippingMediaSource
(i innych źródeł z przesunięciem czasowym okresu/okna) wConcatenatingMediaSource2
(#11226). - Zmień
BaseRenderer.onStreamChanged()
naMediaPeriodId
.
- Transformer:
- Przetwarzanie danych EXIF dotyczących obracania w przypadku danych wejściowych dotyczących obrazu.
- Usuń typ adnotacji
TransformationRequest.HdrMode
i powiązane z nim stałe. Zamiast niego używaj elementuComposition.HdrMode
i powiązanych z nim stałych. - Uprość
OverlaySettings
, aby rozwiązać problemy z rotacją. - Zmieniono parametry
frameRate
idurationUs
w kampaniiSampleConsumer.queueInputBitmap
naTimestampIterator
.
- Wybór ścieżki:
- Dodaj
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness
, aby wyraźnie zezwolić lub zabronić niepłynnej adaptacji. Domyślnie działanie pozostaje takie samo jak w przypadku wartościtrue
.
- Dodaj
- Wyodrębnianie:
- MPEG-TS: upewnij się, że ostatnia klatka została wyrenderowana, przekazując ostatnią jednostkę dostępu strumienia do kolejki przykładowej (#7909).
- Poprawiono literówkę w przypadku
rotationDegrees
. ZmienionoprojectionPosePitch
naprojectionPoseRoll
(#461). - Usuń założenie, że instancje
Extractor
można bezpośrednio przeglądać za pomocą funkcjiinstanceof
. Jeśli chcesz uzyskać dostęp w czasie działania do szczegółów implementacji obiektuExtractor
, musisz najpierw wywołaćExtractor.getUnderlyingInstance
. - Dodaj
BmpExtractor
. - Dodaj
WebpExtractor
. - Dodaj
HeifExtractor
. - Dodaj obsługę klasycznej wersji QuickTime do
Mp4Extractor
.
- Dźwięk:
- Dodano obsługę 24-/32-bitowego kodowania PCM w formacie big-endian w plikach MP4 i Matroska oraz zanalizowano kodowanie
lpcm
w formacie PCM w plikach MP4. - Dodano obsługę wyodrębniania dźwięku Vorbis w formacie MP4.
- Dodaj
AudioSink.getFormatOffloadSupport(Format)
, który pobiera poziom obsługi offloadu, który może zapewnić odbiornik dla formatu za pomocąDefaultAudioOffloadSupportProvider
. Zwraca nową kolumnęAudioOffloadSupport
zawierającą kolumnyisFormatSupported
,isGaplessSupported
iisSpeedChangeSupported
. - Dodaj
AudioSink.setOffloadMode()
, za pomocą którego konfigurowana jest konfiguracja przesyłania na ujściu na ujściu audio. Wartość domyślna toAudioSink.OFFLOAD_MODE_DISABLED
. - Przesyłanie danych można włączyć w sekcji
setAudioOffloadPreference
w ustawieniachTrackSelectionParameters
. Jeśli ustawione ustawienie to „Włącz”, urządzenie obsługuje przenoszenie danych dla danego formatu, a wybrana ścieżka to pojedyncza ścieżka audio, przenoszenie danych audio zostanie włączone. - Jeśli
audioOffloadModePreference
ma wartośćAUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED
,DefaultTrackSelector
wybiera ścieżkę audio tylko wtedy, gdy jej format jest obsługiwany przy odciążaniu. Jeśli przy odciążaniu nie jest obsługiwana żadna ścieżka audio, nie zostanie wybrana żadna ścieżka. - Wyłączenie obsługi bez przerw dla przenoszenia w przypadku interfejsu API w wersji wcześniejszej niż 33 ze względu na problem z pozycją odtwarzania po przejściu do następnego utworu.
- Usuń parametr
enableOffload
z podpisu metodyDefaultRenderersFactory.buildAudioSink
. - Usuń formę płatności
DefaultAudioSink.Builder.setOffloadMode
. - Usuń wartość nieokreśloną
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
. - Dodano obsługę metadanych Opus bez przerw podczas odtwarzania z pamięci zewnętrznej.
- Zezwalanie na odzyskanie przez renderowanie przez wyłączenie przesyłania, jeśli nie udało się podczas pierwszego zapisu (#627).
- Domyślnie włącz harmonogram przenoszenia danych na potrzeby odtwarzania tylko dźwięku.
- Usuń
ExoPlayer.experimentalSetOffloadSchedulingEnabled
iAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
. - Zmieniono nazwę
onExperimentalSleepingForOffloadChanged
naonSleepingForOffloadChanged
, aonExperimentalOffloadedPlayback
naonOffloadedPlayback
. - Przenieś powiązane interfejsy i definicje
TrackSelectionParameters
związane z trybem odciążania dźwięku do wewnętrznej klasyAudioOffloadPreferences
. - Dodaj wywołania zwrotne
onAudioTrackInitialized
ionAudioTrackReleased
do funkcjiAnalyticsListener
,AudioRendererEventListener
iAudioSink.Listener
. - Rozwiąż problem z niedostatecznym przepływem w buforze audio DTS Express (#650).
- Naprawiono błąd polegający na tym, że sprawdzanie możliwości E-AC3-JOC powoduje wyświetlenie błędu
IllegalArgumentException
(#677).
- Dodano obsługę 24-/32-bitowego kodowania PCM w formacie big-endian w plikach MP4 i Matroska oraz zanalizowano kodowanie
- Film:
- Zezwalaj aplikacji
MediaCodecVideoRenderer
na korzystanie z niestandardowejVideoFrameProcessor.Factory
. - Usunęliśmy błąd, który powodował, że pierwszy kadr nie był renderowany, jeśli strumień audio zaczyna się od ujemnych sygnatur czasowych (#291).
- Zezwalaj aplikacji
- Tekst:
- Usuń
ExoplayerCuesDecoder
. Ścieżki tekstowe zsampleMimeType = application/x-media3-cues
są teraz obsługiwane bezpośrednio przezTextRenderer
bez konieczności korzystania z instancjiSubtitleDecoder
.
- Usuń
- Metadane:
- Funkcja
MetadataDecoder.decode
nie będzie już wywoływana w przypadku przykładów „tylko dekodowanie”, ponieważ implementacja i tak musi zwracać wartość null.
- Funkcja
- Skutek:
- Dodaj
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)
ustawienie kolejki danych bitmapy według sygnatury czasowej. - Zmień
VideoFrameProcessor.registerInputStream()
na nieblokujący. Aplikacje muszą implementowaćVideoFrameProcessor.Listener#onInputStreamRegistered()
. - Zmieniono parametry
frameRate
idurationUs
w kampaniiVideoFrameProcessor.queueInputBitmap
naTimestampIterator
.
- Dodaj
- Rozszerzenie IMA:
- Naprawiono błąd polegający na tym, że wyjątkowa transmisja DASH z wieloma przedziałami czasu, która nie jest pierwszym elementem playlisty, (#571).
- Zanim wywołasz funkcję
AdsLoader.destroy()
, zwolnij StreamManagera - Zaktualizuj pakiet IMA SDK do wersji 3.31.0.
- Sesja:
- W pliku
DefaultMediaNotificationProvider
ustaw zachowanie usługi powiadomień na pierwszym planie naFOREGROUND_SERVICE_IMMEDIATE
(#167). - Aby uniknąć problemów z nieobsługiwanym interfejsem API na urządzeniach Samsung, używaj tylko wersji
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()
powyżej 31 (#167). - Użyj kontrolera powiadomień multimedialnych jako elementu pośredniczącego, aby ustawić dostępne polecenia i niestandardowy układ, który będzie używany do wypełniania powiadomienia i sesji platformy.
- Konwertuj zdarzenia przycisku multimediów otrzymywane przez
MediaSessionService.onStartCommand()
w Media3 zamiast kierować je do sesji platformy i z powrotem do Media3. Dzięki temu kontroler wywołujący jest zawsze kontrolerem powiadomień o multimediach, a aplikacje mogą w taki sam sposób rozpoznawać wywołania pochodzące z powiadomień w taki sam sposób na wszystkich obsługiwanych poziomach interfejsu API. - Usunęliśmy błąd, który powodował, że
MediaController.getCurrentPosition()
nie przewija się, gdy jest połączony ze starszą wersjąMediaSessionCompat
. - Dodaj
MediaLibrarySession.getSubscribedControllers(mediaId)
dla wygody. - Zastąp
MediaLibrarySession.Callback.onSubscribe()
, aby potwierdzić dostępność identyfikatora nadrzędnego, do którego subskrybuje kontroler. Jeśli operacja się uda, subskrypcja zostanie zaakceptowana, a funkcjanotifyChildrenChanged()
zostanie natychmiast wywołana z informacją o przeglądarce (#561). - Dodaj moduł demonstracyjny sesji dla systemu operacyjnego Automotive i włącz demonstrację sesji dla Androida Auto.
- Nie ustawiaj kolejki sesji platformy, gdy interfejs
COMMAND_GET_TIMELINE
jest niedostępny dla kontrolera powiadomień o multimediach. Gdy Android Auto jest kontrolerem klienta odczytującym dane z sesji platformy, przyciskqueue
w interfejsie Androida Auto nie jest wyświetlany (#339). - Domyślnie używaj parametru
DataSourceBitmapLoader
zamiastSimpleBitmapLoader
(#271, #327). - Dodaj
MediaSession.Callback.onMediaButtonEvent(Intent)
, który umożliwia aplikacjom zastąpienie domyślnego sposobu obsługi zdarzeń przycisku multimediów.
- W pliku
- UI:
- Dodaj implementację
Player.Listener
na urządzeniach z Wear OS, która obsługuje tłumienie odtwarzania z powoduPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
, uruchamiając okno systemowe, aby umożliwić użytkownikowi podłączenie odpowiedniego wyjścia audio (np. słuchawek Bluetooth). Odtwarzanie zostanie automatycznie wznowione, jeśli odpowiednie urządzenie zostanie połączone w określonym czasie (domyślnie 5 minut).
- Dodaj implementację
- Pobrane:
- Zadeklaruj typ usługi na pierwszym planie „synchronizacja danych” dla
DownloadService
, aby zapewnić zgodność z Androidem 14. Aby korzystać z tej usługi, aplikacja musi też dodaćdataSync
jakoforegroundServiceType
w pliku manifestu i dodać uprawnienieFOREGROUND_SERVICE_DATA_SYNC
(#11239).
- Zadeklaruj typ usługi na pierwszym planie „synchronizacja danych” dla
- Rozszerzenie HLS:
- Odświeżaj playlistę z transmisją na żywo HLS z interwałem obliczanym od ostatniego czasu rozpoczęcia wczytywania, a nie od ostatniego ukończonego wczytania (#663).
- Rozszerzenie DASH:
- Zezwalaj na wiele tego samego identyfikatora DASH w adresie URL szablonu segmentu.
- Dodanie eksperymentalnej obsługi analizowania napisów podczas wyodrębniania. Wprowadziliśmy też lepszą obsługę łączenia nakładających się napisów, w tym usunięcie migotania podczas przełączania między segmentami napisów. Możesz to włączyć za pomocą
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
(#288).
- Rozszerzenie RTSP:
- Usunięto warunek wyścigu, który mógł prowadzić do
IndexOutOfBoundsException
podczas korzystania z TCP lub zawieszania się odtwarzania w pewnych sytuacjach. - Sprawdzanie stanu w konfiguracji RTSP podczas zwracania stanu wczytywania
RtspMediaPeriod
(#577). - Ignorowanie niestandardowych metod żądania RTSP w nagłówku publicznym odpowiedzi opcji (#613).
- Użyj wartości czasu oczekiwania na odpowiedź konfiguracji RTSP w interwale czasu wysyłania próśb o opcje keep-alive RTSP (#662).
- Usunięto warunek wyścigu, który mógł prowadzić do
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Zwolnij moduł dekodera MIDI, który zapewnia obsługę odtwarzania standardowych plików MIDI za pomocą biblioteki Jsyn do syntezy dźwięku.
- Dodaj
DecoderOutputBuffer.shouldBeSkipped
, aby bezpośrednio oznaczyć bufory wyjściowe, które nie muszą być prezentowane. Jest to preferowane rozwiązanie w związku z tym, że funkcjaC.BUFFER_FLAG_DECODE_ONLY
zostanie wycofana. - Dodaj
Decoder.setOutputStartTimeUs
iSimpleDecoder.isAtLeastOutputStartTimeUs
, aby dekodery mogły odrzucić próbki tylko do dekodowania przed czasem rozpoczęcia. Należy używać tego parametru zamiast parametruBuffer.isDecodeOnly
, który zostanie wycofany. - Naprawiono błąd publikowania artefaktu dekodera MIDI w repozytorium Maven. Artefakt został przemianowany na
media3-exoplayer-midi
(#734).
- Rozszerzenie leanback:
- Naprawiono błąd, który powodował, że wyłączenie powierzchni mogło powodować błąd
ArithmeticException
w Leanback (#617).
- Naprawiono błąd, który powodował, że wyłączenie powierzchni mogło powodować błąd
- Narzędzia testowe:
- Zadbaj o to, aby
TestExoPlayerBuilder
iFakeClock
były zgodne z testami interfejsu Espresso oraz testami interfejsu Compose. Usunęliśmy błąd polegający na tym, że podczas interakcji w widoku Espresso lub Composer odtwarzanie przesuwało się w sposób niedeterministyczny.
- Zadbaj o to, aby
- Usuń symbole wycofane:
- Usuń
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)
iTransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)
. Zamiast tego użyj operatoraComposition.Builder.setHdrMode(int)
i przekaż parametrComposition
do funkcjiTransformer.start(Composition, String)
. - Usuń wycofaną metodę
DownloadNotificationHelper.buildProgressNotification
i zamiast niej użyj metody, która nie została wycofana i przyjmuje parametrnotMetRequirements
.
- Usuń
Wersja 1.2.0-rc01
1 listopada 2023 roku
Użyj wersji stabilnej 1.2.0.
Wersja 1.2.0-beta01
19 października 2023 r.
Użyj wersji stabilnej 1.2.0.
Wersja 1.2.0-alpha02
29 września 2023 r.
Użyj wersji stabilnej 1.2.0.
Wersja 1.2.0-alpha01
17 sierpnia 2023 r.
Użyj wersji stabilnej 1.2.0.
Wersja 1.1.0
Wersja 1.1.1
16 sierpnia 2023 r.
- Wspólna biblioteka:
- Usuń ze wszystkich modułów przypadkowo dodaną zależność
multidex
(#499).
- Usuń ze wszystkich modułów przypadkowo dodaną zależność
- ExoPlayer:
- Rozwiązaliśmy problem w
PlaybackStatsListener
, w którym po wyczyszczeniu playlisty tworzone są fałszywePlaybackStats
. - Dodaj do logowania danych Common Media Client Data (CMCD) dodatkowe pola: format strumieniowania (sf), typ strumienia (st), wersja (v), górna szybkość transmisji bitów (tb), czas trwania obiektu (d), zmierzona przepustowość (mtp) i typ obiektu (ot) (#8699).
- Rozwiązaliśmy problem w
- Dźwięk:
- Rozwiązanie błędu, który powodował, że
Player.getState()
nigdy nie przechodziło doSTATE_ENDED
podczas odtwarzania bardzo krótkich plików (#538).
- Rozwiązanie błędu, który powodował, że
- Przesyłanie dźwięku:
- Dodaj nagłówek identyfikatora Ogg i strony nagłówka komentarza do bitstreama w celu odtwarzania Opusa w trybie offloaded zgodnie ze standardem RFC 7845.
- Film:
- H.265/HEVC: poprawiono analizowanie informacji o krótkim i długim okresie referencyjnym obrazu SPS.
- Tekst:
- CEA-608: zmiana logiki skracania cue tak, aby uwzględniać tylko widoczny tekst. Wcześniej wcięcie i przesunięcie tabulacji były uwzględniane przy ograniczaniu długości cue do 32 znaków (co było technicznie zgodne ze specyfikacją) (#11019).
- Rozszerzenie IMA:
- Zmień wersję pakietu IMA SDK na 3.30.3.
- Sesja:
- Dodaj układ niestandardowy do stanu kontrolera i udostępnij obiekt pobierający, aby uzyskać do niego dostęp. Gdy układ niestandardowy ulegnie zmianie, zostanie wywołana funkcja
MediaController.Listener.onCustomLayoutChanged
. Aplikacje, które chcą wysyłać różne układy niestandardowe do różnych kontrolerów Media3, mogą to zrobić wMediaSession.Callback.onConnect
, używającAcceptedResultBuilder
, aby upewnić się, że układ niestandardowy jest dostępny dla kontrolera po zakończeniu procesu łączenia. - Rozwiązanie problemu, w którym
MediaLibraryServiceLegacyStub
wysyłał błąd doResult
, który tego nie obsługiwał, co powodowało błądUnsupportedOperationException
(#78). - Napraw sposób, w jaki
PlayerWrapper
tworzyVolumeProviderCompat
, określającvolumeControlType
za pomocą zarówno starszych poleceń (COMMAND_ADJUST_DEVICE_VOLUME
iCOMMAND_SET_DEVICE_VOLUME
), jak i nowych poleceń (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
iCOMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
) (#554).
- Dodaj układ niestandardowy do stanu kontrolera i udostępnij obiekt pobierający, aby uzyskać do niego dostęp. Gdy układ niestandardowy ulegnie zmianie, zostanie wywołana funkcja
Wersja 1.1.0
5 lipca 2023 r.
- Biblioteka wspólna:
- Dodaj przyczynę wstrzymania w przypadku nieodpowiedniej trasy audio i odtwarzaj, gdy gotowy powód zmiany jest zbyt długi. (#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 Playera przeciążone metody, które umożliwiają użytkownikom określanie flag głośności:
void setDeviceVolume(int, int)
void increaseDeviceVolume(int)
void decreaseDeviceVolume(int)
void setDeviceMuted(boolean, int)
- Dodaj
Builder
dlaDeviceInfo
i wycofaj istniejący konstruktor. - Dodaj
DeviceInfo.routingControllerId
, aby określić identyfikator kontrolera routingu na potrzeby odtwarzania zdalnego. - Dodaj
Player.replaceMediaItem(s)
jako skrót do dodawania i usuwania elementów w tej samej pozycji (#8046).
- ExoPlayer:
- Zezwalaj ExoPlayerowi na kontrolowanie głośności urządzenia tylko wtedy, gdy użytkownik wyraźnie wyrazi na to zgodę. Użyj
ExoPlayer.Builder.setDeviceVolumeControlEnabled
, aby uzyskać dostęp do:getDeviceVolume()
isDeviceMuted()
setDeviceVolume(int)
isetDeviceVolume(int, int)
increaseDeviceVolume(int)
iincreaseDeviceVolume(int, int)
decreaseDeviceVolume(int)
idecreaseDeviceVolume(int, int)
- Dodaj atrybut
FilteringMediaSource
, który umożliwia filtrowanie dostępnych typów ścieżek zMediaSource
. - Dodano obsługę uwzględniania danych Common Media Client Data (CMCD) w żądaniach wychodzących adaptacyjnych formatów strumieniowania DASH, HLS i SmoothStreaming. Pola
br
,bl
,cid
,rtp
isid
zostały uwzględnione (#8699). Struktura interfejsu API i metody API:- Rejestrowanie CMCD jest domyślnie wyłączone. Aby je włączyć, użyj polecenia
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory)
. - Domyślnie wszystkie klucze są włączone. Aby je odfiltrować, użyj opcji zastąpienia
CmcdConfiguration.RequestConfig.isKeyAllowed(String key)
. - Zastąp
CmcdConfiguration.RequestConfig.getCustomData()
, aby włączyć logowanie kluczy niestandardowych.
- Rejestrowanie CMCD jest domyślnie wyłączone. Aby je włączyć, użyj polecenia
- Dodaj dodatkową akcję do pliku manifestu głównej wersji demonstracyjnej, aby ułatwić uruchamianie aplikacji demonstracyjnej za pomocą niestandardowego pliku
*.exolist.json
(#439). - Dodaj
ExoPlayer.setVideoEffects()
, aby używaćEffect
podczas odtwarzania filmu. - Zaktualizuj
SampleQueue
, aby przechowywaćsourceId
jakolong
, a nieint
. Zmiana ta zmienia sygnatury publicznych metodSampleQueue.sourceId
iSampleQueue.peekSourceId
. - Dodaj do metod
LoadControl
shouldStartPlayback
ionTracksSelected
parametry, które umożliwiają powiązanie tych metod z odpowiednimiMediaPeriod
. - Zmień podpis
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)
, dodając parametr osi czasu zawierający okresy z identyfikatorami unikatowymi (UID) używanymi jako klucze na mapie. Jest to konieczne, aby uniknąć problemów z jednoczesnością w przypadku transmisji na żywo obejmujących wiele okresów. - Wycofaj funkcje
EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)
iBaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)
. Zamiast tego można wywołać wariant metody bez parametrumediaTimeOffsetUs
. Pamiętaj, że nawet w przypadku wycofanych wersji offset nie jest już dodawany do wartościstartTimeUs
iendTimeUs
obiektówMediaLoadData
, które są wysyłane przez moduł rozsyłający. - Zmień nazwę
ExoTrackSelection.blacklist
naexcludeTrack
, aisBlacklisted
naisTrackExcluded
. - Naprawiono niespójności między metodami
ExoPlayer.setMediaItem(s)
iaddMediaItem(s)
podczas wywołania pustej playlisty.
- Zezwalaj ExoPlayerowi na kontrolowanie głośności urządzenia tylko wtedy, gdy użytkownik wyraźnie wyrazi na to zgodę. Użyj
- Transformator:
- Usuń
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)
. Zamiast niej użyj zasadExoPlayerAssetLoader.Factory(MediaSource.Factory)
iTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)
. - Usuń
Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
. - Usunęliśmy błąd, który powodował zawieszanie się przekształcenia (co prowadziło do przekroczenia limitu czasu muxera), jeśli koniec strumienia wideo był sygnalizowany w momencie, gdy ramka wejściowa oczekiwała na przetworzenie.
- Aby zwiększyć obsługę, zapytaj o kodeki za pomocą
MediaCodecList
zamiast używać narzędzifindDecoder/EncoderForFormat
. - Usuń konfigurację ramek B w
DefaultEncoderFactory
, ponieważ nie działa na niektórych urządzeniach.
- Usuń
- Wybór ścieżki:
- Dodaj
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange
który jest domyślnie wyłączony. Po włączeniu opcjaDefaultTrackSelector
wywołuje wybór nowego utworu, gdy zmienią się możliwości renderera.
- Dodaj
- Wyodrębnianie:
- Dźwięk:
- Naprawiono błąd, który powodował, że niektóre odtwarzania nie działały, gdy tunelowanie było włączone, a
AudioProcessors
były aktywne, np. w przypadku przycinania bez przerw (#10847). - Umieszczaj ramki Opus w pakietach Ogg podczas odtwarzania bezpośredniego (odciążania).
- ekstrapolowanie bieżącej pozycji podczas uśpienia za pomocą harmonogramu przenoszenia;
- Dodaj
Renderer.release()
iAudioSink.release()
, aby uwolnić zasoby na końcu cyklu życia odtwarzacza. - Posłuchaj zmian funkcji audio w usłudze
DefaultAudioSink
. Do konstruktora klasyDefaultAudioSink
dodaj parametr wymaganycontext
, za pomocą którego klasaDefaultAudioSink
zarejestruje się jako odbiorca zdarzeń w klasieAudioCapabilitiesReceiver
i zaktualizuje swoją właściwośćaudioCapabilities
, gdy zostanie poinformowana o zmianie możliwości. - Rozpowszechnianie zmian w możliwościach dotyczących dźwięku za pomocą nowego zdarzenia
onAudioCapabilitiesChanged
w interfejsieAudioSink.Listener
oraz nowego interfejsuRendererCapabilities.Listener
, który uruchamia zdarzeniaonRendererCapabilitiesChanged
. - Dodaj
ChannelMixingAudioProcessor
, aby zastosować skalowanie/miksowanie do kanałów audio. - Dodaj nową wartość int
DISCARD_REASON_AUDIO_BYPASS_POSSIBLE
doDecoderDiscardReasons
, aby odrzucić dekoder audio, gdy tryb obejścia jest możliwy po zmianie możliwości audio. - Dodano obsługę bezpośredniego odtwarzania dla DTS Express i DTS:X (#335).
- Naprawiono błąd, który powodował, że niektóre odtwarzania nie działały, gdy tunelowanie było włączone, a
- Film:
- Gdy renderowanie jest wyłączone, element
MediaCodecVideoRenderer
powinien raportować elementVideoSize
o szerokości i wysokości 0. FunkcjaPlayer.Listener.onVideoSizeChanged
jest wywoływana odpowiednio, gdy zmienia się wartość parametruPlayer.getVideoSize()
. Dzięki tej zmianie rozmiar wideo ExoPlayera zMediaCodecVideoRenderer
ma szerokość i wysokość 0, gdyPlayer.getCurrentTracks
nie obsługuje wideo lub gdy rozmiar obsługiwanej ścieżki wideo nie został jeszcze określony.
- Gdy renderowanie jest wyłączone, element
- DRM:
- Ogranicz widoczność kilku metod przeznaczonych tylko do użytku wewnętrznego w
DefaultDrmSession
, których nie należy wywoływać spoza pakietu DRM:void onMediaDrmEvent(int)
void provision()
void onProvisionCompleted()
onProvisionError(Exception, boolean)
- Ogranicz widoczność kilku metod przeznaczonych tylko do użytku wewnętrznego w
- Muxer:
- Dodaj nową bibliotekę muxera, która może służyć do tworzenia plików kontenera MP4.
- Rozszerzenie IMA:
- Włącz transmisje na żywo DASH z wieloma przedziałami czasu na potrzeby dynamicznego wstawiania reklam. Pamiętaj, że obecna implementacja nie obsługuje jeszcze przewijania w transmisjach na żywo (#10912).
- Naprawiono błąd, który powodował wstawianie nowej grupy reklam w transmisjach na żywo z powodu niewielkich różnic w obliczonej pozycji treści na kolejnych liniach czasowych.
- Sesja:
- Dodaj pomocniczą metodę
MediaSession.getControllerForCurrentRequest
, aby uzyskać informacje o kontrolerze, który obecnie wywołuje metodęPlayer
. - Dodaj
androidx.media3.session.MediaButtonReceiver
, aby umożliwić aplikacjom wdrażanie wznawiania odtwarzania ze zdarzeniami dotyczącymi przycisku multimediów wysyłanymi na przykład przez zestaw słuchawkowy Bluetooth (#167). - Dodaj domyślną implementację do
MediaSession.Callback.onAddMediaItems
, aby umożliwić przekazywanie żądańMediaItems
doPlayer
, jeśli mają oneLocalConfiguration
(np. identyfikator URI) (#282). - Dodaj przyciski poleceń „przewinąć do poprzedniego” i „przewinąć do następnego” w kompaktowym widoku powiadomienia o mediach domyślnie w Androidzie 12 i starszych (#410).
- Dodaj domyślną implementację do
MediaSession.Callback.onAddMediaItems
, aby umożliwić przekazywanie żądańMediaItems
doPlayer
, jeśli mają oneLocalConfiguration
(np. identyfikator URI) (#282). - Dodaj przyciski poleceń „przewinąć do poprzedniego” i „przewinąć do następnego” w kompaktowym widoku powiadomienia o mediach domyślnie w Androidzie 12 i starszych (#410).
- Dodaj pomocniczą metodę
- UI:
- Dodaj metody Util
shouldShowPlayButton
ihandlePlayPauseButtonAction
, aby pisać niestandardowe elementy interfejsu z przyciskiem odtwarzania/pauzowania.
- Dodaj metody Util
- Rozszerzenie RTSP:
- Rozszerzenie DASH:
- Usuń przesunięcie czasu multimediów z
MediaLoadData.startTimeMs
iMediaLoadData.endTimeMs
w przypadku strumieni DASH z wieloma przedziałami czasu. - Usunęliśmy błąd, który powodował, że ponowne przygotowanie źródła multi-period live Dash media powodowało błąd
IndexOutOfBoundsException
(#10838).
- Usuń przesunięcie czasu multimediów z
- Rozszerzenie HLS:
- Dodaj
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)
, aby ustawić limit czasu dla wątku ładowania, który ma czekać na zainicjowanie funkcjiTimestampAdjuster
. Jeśli inicjowanie nie zakończy się przed upływem czasu oczekiwania, generowany jest żądaniePlaybackException
, aby uniknąć niekończącego się procesu odtwarzania. Domyślnie czas oczekiwania jest ustawiony na 0 (#323).
- Dodaj
- Narzędzia testowe:
- Sprawdź, czy w
DataSourceContractTest
schemat adresu URL jest niezależny od wielkości liter.
- Sprawdź, czy w
- Usuń wycofane symbole:
- Usuń konstruktory
DefaultAudioSink
, zamiast nich użyjDefaultAudioSink.Builder
. - Usuń kolumnę
HlsMasterPlaylist
. Zamiast niej użyj zasadyHlsMultivariantPlaylist
. - Usuń
Player.stop(boolean)
. Zamiast nich użyj właściwościPlayer.stop()
iPlayer.clearMediaItems()
(jeślireset
totrue
). - Usuń 2 wycofane konstruktory
SimpleCache
i zamiast nich użyj konstruktora, który przyjmuje parametrDatabaseProvider
, aby uzyskać lepszą wydajność. - Usuń konstruktor
DefaultBandwidthMeter
i zamiast niego użyj konstruktoraDefaultBandwidthMeter.Builder
. - Usuń konstruktory
DefaultDrmSessionManager
, zamiast nich użyjDefaultDrmSessionManager.Builder
. - Usuń 2 nieaktualne konstruktory
HttpDataSource.InvalidResponseCodeException
. Użyj konstruktora, który nie jest nieaktualny i akceptuje dodatkowe pola(cause
,responseBody
), aby zwiększyć możliwości rejestrowania błędów. - Usuń zasady
DownloadHelper.forProgressive
,DownloadHelper.forHls
,DownloadHelper.forDash
iDownloadHelper.forSmoothStreaming
, a zamiast nich użyj zasadyDownloadHelper.forMediaItem
. - Usuń przestarzały konstruktor
DownloadService
i użyj konstruktora, który nie został wycofany i zawiera opcję podania parametruchannelDescriptionResourceId
. - Usuń wycofane stałe ciągu znaków dla kodowania (
ASCII_NAME
,UTF8_NAME
,ISO88591_NAME
,UTF16_NAME
iUTF16LE_NAME
). Zamiast tego użyj kodowania Kotlin z pakietukotlin.text
,java.nio.charset.StandardCharsets
lubcom.google.common.base.Charsets
. - Usuń wycofany konstruktor
WorkManagerScheduler
i zamiast niego użyj konstruktora, który nie został wycofany i zawiera opcję przekazywania parametruContext
. - Usuń przestarzałe metody
createVideoSampleFormat
,createAudioSampleFormat
,createContainerFormat
icreateSampleFormat
, które były używane do tworzenia instancji klasyFormat
. Zamiast tego do tworzenia instancjiFormat
użyjFormat.Builder
. - Usuń przestarzałe metody
copyWithMaxInputSize
,copyWithSubsampleOffsetUs
,copyWithLabel
,copyWithManifestFormatInfo
,copyWithGaplessInfo
,copyWithFrameRate
,copyWithDrmInitData
,copyWithMetadata
,copyWithBitrate
icopyWithVideoSize
. Zamiast nich użyj metodyFormat.buildUpon()
i setter. - Usuń wycofany tag
ExoPlayer.retry()
i użyj zamiast niego taguprepare()
. - Usuń wycofany konstruktor
DefaultTrackSelector
z argumentem o wartości zerowej. Zamiast niego użyj konstruktoraDefaultTrackSelector(Context)
. - Usuń wycofany konstruktor
OfflineLicenseHelper
i użyj zamiast niego konstruktoraOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
. - Usuń wycofany konstruktor
DownloadManager
i zamiast niego użyj konstruktora, który przyjmuje parametrExecutor
. - Usuń wycofane konstruktory
Cue
i zamiast nich używaj konstruktoraCue.Builder
. - Usuń wycofany konstruktor
OfflineLicenseHelper
i użyj zamiast niego konstruktoraOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
. - Usuń 4 wycofane metody
AnalyticsListener
:onDecoderEnabled
, użyj zamiast niej zasadonAudioEnabled
lubonVideoEnabled
.onDecoderInitialized
, użyj zamiast niej zasadonAudioDecoderInitialized
lubonVideoDecoderInitialized
.onDecoderInputFormatChanged
, użyj zamiast niej zasadonAudioInputFormatChanged
lubonVideoInputFormatChanged
.onDecoderDisabled
, użyj właściwościonAudioDisabled
lubonVideoDisabled
.
- Usuń wycofane polecenia
Player.Listener.onSeekProcessed
iAnalyticsListener.onSeekProcessed
. Zamiast nich używaj poleceniaonPositionDiscontinuity
z opcjąDISCONTINUITY_REASON_SEEK
. - Usuń polecenie
ExoPlayer.setHandleWakeLock(boolean)
i użyj zamiast niego poleceniasetWakeMode(int)
. - Usuń wycofany atrybut
DefaultLoadControl.Builder.createDefaultLoadControl()
, zamiast niego użyj zasadybuild()
. - Usuń wycofany tag
MediaItem.PlaybackProperties
i użyj zamiast niego taguMediaItem.LocalConfiguration
. Wycofane poleMediaItem.playbackProperties
ma teraz typMediaItem.LocalConfiguration
.
- Usuń konstruktory
Wersja 1.1.0-rc01
21 czerwca 2023 r.
Użyj wersji stabilnej 1.1.0.
Wersja 1.1.0-beta01
7 czerwca 2023 r.
Użyj wersji stabilnej 1.1.0.
Wersja 1.1.0-alpha01
10 maja 2023 r.
Użyj wersji stabilnej 1.1.0.
Wersja 1.0.0
Wersja 1.0.2
18 maja 2023 r.
androidx.media3:media3-*:1.0.2
został zwolniony.
Wersja 1.0.2 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayer 2.18.7.
Od wersji 1.0.1 w tej wersji wprowadzono te zmiany:
- Podstawowa biblioteka:
- Dodaj
Buffer.isLastSample()
, który oznacza, czyBuffer
zawiera flagęC.BUFFER_FLAG_LAST_SAMPLE
. - Rozwiązaliśmy problem, który powodował, że ostatnia klatka mogła nie zostać wyświetlona, jeśli ostatnia próbka z ramkami została usunięta z kolejki bez odczytania próbki „końca strumienia”. (#11079).
- Dodaj
- Moduły wyodrębniania danych:
- Napraw analizę składni H.265 SPS w plikach MPEG-TS, ponownie korzystając z logiki analizy używanej już przez moduły wyodrębniania RTSP i MP4 (#303).
- Tekst:
- SSA: dodano obsługę plików UTF-16, jeśli zaczynają się od oznaczenia kolejności bajtów (#319).
- Sesja:
- Rozwiązanie problemu polegającego na tym, że
MediaController
nie aktualizuje dostępnych poleceń po połączeniu ze starszą wersjąMediaSessionCompat
, która aktualizuje swoje działania. - Naprawiono błąd, który uniemożliwiał wywołaniu
MediaLibraryService
zwracanie wartości null w przypadku wywołaniaCallback.onGetLibraryRoot
z interfejsu System UI z parametremparams.isRecent == true
w interfejsie API 30 (#355). - Naprawiono wyciek pamięci w programach
MediaSessionService
iMediaLibraryService
(#346). - Naprawiono błąd, w którym połączona aktualizacja
Timeline
i pozycji w funkcjiMediaSession
mogła spowodować wygenerowanie przez funkcjęMediaController
błęduIllegalStateException
.
- Rozwiązanie problemu polegającego na tym, że
Wersja 1.0.1
18 kwietnia 2023 r.
androidx.media3:media3-*:1.0.1
został zwolniony.
Wersja 1.0.1 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayer 2.18.6.
- Podstawowa biblioteka:
- Resetowanie zastąpienia docelowej transmisji na żywo podczas przewijania do pozycji domyślnej (#11051).
- Naprawiono błąd, który powodował, że puste strumienie próbek w mediach mogły powodować zablokowanie odtwarzania.
- Sesja:
- Naprawiliśmy błąd polegający na tym, że wiele identycznych elementów kolejki opublikowanych przez starszy program
MediaSessionCompat
powodowało wyjątek wMediaController
(#290). - Dodanie brakującego przekierowania
MediaSession.broadcastCustomCommand
do starszegoMediaControllerCompat.Callback.onSessionEvent
(#293). - Naprawiono błąd polegający na tym, że wywołanie
MediaSession.setPlayer
nie aktualizowało dostępnych poleceń. - Rozwiązanie problemu polegającego na tym, że instancje
TrackSelectionOverride
wysłane z interfejsuMediaController
są ignorowane, jeśli odwołują się do grupyFormat.metadata
(#296). - Rozwiązanie problemu, w którym
Player.COMMAND_GET_CURRENT_MEDIA_ITEM
musi być dostępna, aby uzyskać dostęp do metadanych za pomocą starszej wersjiMediaSessionCompat
. - Rozwiązano problem, który powodował awarie instancji
MediaSession
na wątku tle podczas używania w funkcjiMediaSessionService
(#318). - Rozwiązanie problemu polegającego na tym, że biblioteka zadeklarowała odbiornik przycisku multimediów bez zamiaru aplikacji (#314).
- Naprawiliśmy błąd polegający na tym, że wiele identycznych elementów kolejki opublikowanych przez starszy program
- DASH:
- Poprawiono obsługę pustych linii czasu segmentów (#11014).
- RTSP:
- Jeśli konfiguracja RTSP z UDP zakończy się niepowodzeniem z błędem RTSP 461 UnsupportedTransport (#11069), spróbuj ponownie użyć protokołu TCP.
Wersja 1.0.0
22 marca 2023 r.
androidx.media3:media3-*:1.0.0
został zwolniony.
Wersja 1.0.0 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayer 2.18.5.
Brak zmian od wersji 1.0.0-rc02.
Wersja 1.0.0-rc02
2 marca 2023 r.
Usługa 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.
- Podstawowa biblioteka:
- Pobrane:
- Zastosuj maksymalną różnicę w czasie rozpoczęcia w przypadku 2 segmentów, które można skonfigurować do scalania w klasach
SegmentDownloader
i podklasach (#248).
- Zastosuj maksymalną różnicę w czasie rozpoczęcia w przypadku 2 segmentów, które można skonfigurować do scalania w klasach
- Dźwięk:
- Film:
- Zamiast
HEVCProfileMain10
mapuj format HEVC HDR10 naHEVCProfileMain10HDR10
. - Dodaj obejście problemu z urządzeniem Chromecast z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie AVC z częstotliwością 60 FPS są oznaczane jako niedostępne (#10898).
- Rozwiązanie problemów z wydajnością podczas uwalniania klatek podczas odtwarzania multimediów z częstotliwością klatek znacznie wyższą niż częstotliwość odświeżania ekranu.
- Zamiast
- Przesyłanie:
- Popraw przejściowe
STATE_IDLE
podczas przechodzenia między elementami multimedialnymi (#245).
- Popraw przejściowe
- RTSP:
- Przechwyć IllegalArgumentException rzucony podczas analizowania nieprawidłowego RTSP. Opisz komunikaty odpowiedzi (#10971).
- Sesja:
- Naprawiono błąd, który powodował, że przycisk odtwarzania/wstrzymywania powiadomienia nie aktualizuje się wraz ze stanem odtwarzacza (#192).
- Rozszerzenie IMA:
- Naprawiliśmy błąd, który uniemożliwiał uruchomienie strumieni z dynamicznym wstawianiem reklam bez reklam, ponieważ nie odebrano pierwszego (i w przypadku bez reklam jedynego) zdarzenia
LOADED
.
- Naprawiliśmy błąd, który uniemożliwiał uruchomienie strumieni z dynamicznym wstawianiem reklam bez reklam, ponieważ nie odebrano pierwszego (i w przypadku bez reklam jedynego) zdarzenia
Wersja 1.0.0-rc01
16 lutego 2023 r.
androidx.media3:media3-*:1.0.0-rc01
został zwolniony.
Wersja 1.0.0-rc01 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayer 2.18.3.
- Podstawowa biblioteka:
- Dostosuj logikę kolejkowania dekodera w rendererze, aby zachować preferencje
MediaCodecSelector
, nawet jeśli dekoder zgłosi, że nie może odtworzyć multimediów z odpowiednią wydajnością. Na przykład w przypadku domyślnego selektora dekoder sprzętowy z ograniczonym wsparciem będzie preferowany od dekodera oprogramowania, który w pełni obsługuje format (#10604). - Dodaj
ExoPlayer.Builder.setPlaybackLooper
, który ustawia istniejący wątek odtwarzania dla nowej instancji ExoPlayer. - Zezwalaj na czyszczenie pomocniczych menedżera pobierania (#10776).
- Dodaj parametr do
BasePlayer.seekTo
, aby wskazać polecenie używane do przewijania. - Używanie motywu podczas wczytywania plików drawable w wersji interfejsu API 21 lub nowszej (#220).
- Dodaj
ConcatenatingMediaSource2
, który umożliwia łączenie wielu elementów multimediów w jednym oknie (#247).
- Dostosuj logikę kolejkowania dekodera w rendererze, aby zachować preferencje
- Wyodrębnianie:
- Zgłoś
ParserException
zamiastNullPointerException
, jeśli w tabeli przykładowej (STB) brakuje wymaganego opisu próbki (stsd) podczas analizowania atomów trak. - Prawidłowo pomijać próbki podczas przechodzenia bezpośrednio do synchronizowanej klatki w pliku fMP4 (#10941).
- Zgłoś
- Dźwięk:
- Użyj bitrate’u skompresowanego formatu audio, aby obliczyć minimalny rozmiar bufora dla
AudioTrack
w przypadku bezpośredniego odtwarzania (przepuszczania).
- Użyj bitrate’u skompresowanego formatu audio, aby obliczyć minimalny rozmiar bufora dla
- Tekst:
- Naprawiono błąd polegający na przekazywaniu przez
TextRenderer
nieprawidłowego (ujemnego) indeksu do funkcjiSubtitle.getEventTime
, jeśli plik napisów nie zawiera żadnych cue. - SubRip: dodaj obsługę plików UTF-16, jeśli zaczynają się od znaku kolejności bajtów.
- Naprawiono błąd polegający na przekazywaniu przez
- Metadane:
- Parsowanie wielu wartości rozdzielonych znakiem null z ramek ID3 zgodnie z zaleceniami ID3 w wersji 2.4.
- Dodaj
MediaMetadata.mediaType
, aby wskazać typ treści lub typ folderu opisany przez metadane. - Dodaj
MediaMetadata.isBrowsable
jako zamiennikMediaMetadata.folderType
. Ten typ folderu zostanie wycofany w następnej wersji.
- DASH:
- Dodano pełne parsowanie zestawów dostosowań obrazu, w tym liczby kafelków (#3752).
- UI:
- Napraw przestarzały kod
PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener)
aby upewnić się, że zmiany widoczności są przekazywane do zarejestrowanego słuchacza (#229). - Poprawić kolejność elementów sterujących odtwarzaczem w
PlayerView
w przypadku układu od prawej do lewej (#227).
- Napraw przestarzały kod
- Sesja:
- Dodaj abstrakcyjny
SimpleBasePlayer
, aby ułatwić implementację interfejsuPlayer
w odtwarzaczach niestandardowych. - Dodaj metodę pomocniczą do konwertowania tokenu sesji platformy na Media3
SessionToken
(#171). - Użyj polecenia
onMediaMetadataChanged
, aby aktywować aktualizacje sesji multimediów na platformie (#219). - Dodaj sesję multimediów jako argument funkcji
getMediaButtons()
wDefaultMediaNotificationProvider
i użyj list stałych, aby zwiększyć przejrzystość (#216). - Dodaj detektor wywołania zwrotnego
onSetMediaItems
, aby określić sposoby modyfikowania/ustawiania listyMediaItem
, początkowy indeks i pozycja według sesji przed ustawieniem dla odtwarzacza (#156). - Unikaj wykrywania dwukrotnego dotknięcia w przypadku zdarzeń przycisku multimediów innych niż Bluetooth (#233).
- Spraw, aby
QueueTimeline
był bardziej niezawodny w przypadku niejasnego stanu sesji w starszej wersji (#241).
- Dodaj abstrakcyjny
- Metadane:
- Parsowanie wielu wartości rozdzielonych znakiem null z ramek ID3 zgodnie z zaleceniami ID3 w wersji 2.4.
- Dodaj
MediaMetadata.mediaType
, aby wskazać typ treści lub typ folderu opisany przez metadane. - Dodaj
MediaMetadata.isBrowsable
jako zamiennikMediaMetadata.folderType
. W następnej wersji wycofamy ten typ folderu.
- Rozszerzenie Cast:
- Zmień wersję pakietu SDK Cast na 21.2.0.
- Rozszerzenie IMA:
- Usuń detektor odtwarzacza
ImaServerSideAdInsertionMediaSource
z wątku aplikacji, aby uniknąć problemów z wątkami. - Dodaj do obiektu
ImaServerSideAdInsertionMediaSource.AdsLoader.Builder
właściwośćfocusSkipButtonWhenAvailable
, aby wskazać, że przycisk pomijania jest ustawiony na telewizorach, i domyślnie ustaw tę wartość na prawda. - Dodaj metodę
focusSkipButton()
do klasyImaServerSideAdInsertionMediaSource.AdsLoader
, aby programowo poprosić o skupienie się na przycisku pominięcia. - Zaktualizuj pakiet IMA SDK do wersji 3.29.0.
- Usuń detektor odtwarzacza
- Aplikacja demonstracyjna:
- Proś o przyznanie uprawnień do wysyłania powiadomień o pobieraniu w czasie działania aplikacji (#10884).
Wersja 1.0.0-beta03
22 listopada 2022 r.
androidx.media3:media3-*:1.0.0-beta03
został zwolniony.
Wersja 1.0.0-beta03 zawiera te komitowane zmiany.
Ta wersja odpowiada wersji ExoPlayer 2.18.2.
- Biblioteka podstawowa:
- Dodaj
ExoPlayer.isTunnelingEnabled
, aby sprawdzić, czy tunelowanie jest włączone dla wybranych ścieżek (#2518). - Dodaj
WrappingMediaSource
, aby uprościć pakowanie pojedynczegoMediaSource
(#7279). - Wyczyść bufor wsteczny, zanim odtwarzanie się zatrzyma z powodu niewystarczającej ilości dostępnej pamięci.
- Zamknij blok kodu śledzenia „doSomeWork” po włączeniu przenoszenia.
- Rozwiąż problem ze śledzeniem sesji z szybkimi przewijaniem w trybie
PlaybackStatsListener
(#180). - Wysyłanie brakującego wywołania zwrotnego
onMediaItemTransition
podczas wywoływania funkcjiseekToNext
lubseekToPrevious
na playliście z 1 elementem (#10667). - Dodaj funkcję
Player.getSurfaceSize
, która zwraca rozmiar powierzchni, na której renderowany jest film. - Naprawiono błąd, który powodował, że usuwanie słuchaczy podczas odtwarzania mogło spowodować błąd
IllegalStateException
(#10758).
- Dodaj
- Kompilacja:
- Wymuś minimalną wartość
compileSdkVersion
, aby uniknąć błędów kompilacji (#10684). - Unikaj publikowania bloku, gdy jest on uwzględniony w innej kompilacji Gradle.
- Wymuś minimalną wartość
- Wybór ścieżki:
- Preferuj inne ścieżki do Dolby Vision, jeśli wyświetlacz go nie obsługuje. (#8944).
- Pobrane pliki:
- Naprawiono potencjalną nieskończoną pętlę w
ProgressiveDownloader
spowodowaną jednoczesnym pobieraniem i odtwarzaniem tego samegoPriorityTaskManager
(#10570). - Aby powiadomienie o pobieraniu pojawiało się natychmiast (#183).
- Ogranicz liczbę równoczesnych usuwania plików do 1, aby uniknąć nadmiernego tworzenia wątków (#10458).
- Naprawiono potencjalną nieskończoną pętlę w
- Film:
- Jeśli wyświetlacz nie obsługuje Dolby Vision, spróbuj użyć alternatywnego dekodera. (#9794).
- Dźwięk:
- Aby uniknąć błędów OutOfMemory podczas uwalniania wielu odtwarzaczy w tym samym czasie (#10057), używaj funkcji
SingleThreadExecutor
do uwalniania instancjiAudioTrack
. - Dodaje
AudioOffloadListener.onExperimentalOffloadedPlayback
do stanu przenoszenia ścieżki audio. (#134). - Ustaw
AudioTrackBufferSizeProvider
jako interfejs publiczny. - Dodaj
ExoPlayer.setPreferredAudioDevice
, aby ustawić preferowane urządzenie wyjściowe audio (#135). - Zmień nazwę
androidx.media3.exoplayer.audio.AudioProcessor
naandroidx.media3.common.audio.AudioProcessor
. - Mapowanie 8-kanałowego i 12-kanałowego dźwięku na maski kanałów 7.1 i 7.1.4 odpowiednio we wszystkich wersjach Androida (#10701).
- Aby uniknąć błędów OutOfMemory podczas uwalniania wielu odtwarzaczy w tym samym czasie (#10057), używaj funkcji
- Metadane:
MetadataRenderer
można teraz skonfigurować tak, aby renderowało metadane, gdy tylko będą dostępne. Utwórz instancję za pomocą parametruMetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean)
, aby określić, czy renderowanie ma się odbywać z wczesnym wyprowadzeniem metadanych czy z synchronizacją z pozycją odtwarzacza.
- DRM:
- obejście błędu w implementacji ClearKey w Androidzie 13, który zwraca nieprawidłowy adres URL licencji, ale nie pusty;
- Naprawiono błąd
setMediaDrmSession failed: session not opened
podczas przełączania się między schematami DRM w liście odtwarzania (np. z Widevine na ClearKey).
- Tekst:
- CEA-608: upewnij się, że polecenie przełączenia usługi w polu 2 jest obsługiwane prawidłowo (#10666).
- DASH:
- Analizowanie wartości
EventStream.presentationTimeOffset
z plików manifestu (#10460).
- Analizowanie wartości
- UI:
- Używanie bieżących zastąpień odtwarzacza jako wstępnie ustawionych w
TrackSelectionDialogBuilder
(#10429).
- Używanie bieżących zastąpień odtwarzacza jako wstępnie ustawionych w
- Sesja:
- Zadbaj o to, aby polecenia były zawsze wykonywane we właściwej kolejności, nawet jeśli niektóre z nich wymagają asynchronicznego rozwiązania (#85).
- Dodaj
DefaultMediaNotificationProvider.Builder
, aby utworzyć instancjeDefaultMediaNotificationProvider
. Kreator może skonfigurować identyfikator powiadomień, identyfikator kanału powiadomień i nazwę kanału powiadomień używaną przez dostawcę. Dodaj też metodęDefaultMediaNotificationProvider.setSmallIcon(int)
, aby ustawić małą ikonę powiadomień. (#104). - Sprawdź, czy polecenia wysłane przed
MediaController.release()
nie są pomijane (#99). SimpleBitmapLoader
może wczytywać bitmapy z identyfikatorów URIfile://
(#108).- Napraw problem, który uniemożliwia usłudze
MediaController
przewinięcie reklamy w danym okresie (#122). - Po zakończeniu odtwarzania element
MediaSessionService
jest zatrzymywany 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ącym zamiarem wstrzymania (#167).
- Ręczne ukrywanie „plakietki” powiązanej z powiadomieniem utworzonym przez
DefaultNotificationProvider
w interfejsach API 26 i 27 (w interfejsach API 28 i nowszych plakietka jest ukryta automatycznie) (#131). - Naprawiono błąd, który powodował, że drugie połączenie bindera z starszego obiektu MediaSession z obiektem Media3 MediaController powodowało wyjątek IllegalStateException (#49).
- RTSP:
- IMA:
- Dodaj limit czasu na wczytywanie informacji o reklamach, aby rozwiązać problemy, w których pakiet IMA SDK zawiesza się podczas wczytywania reklamy (#10510).
- Zapobieganie pomijaniu reklam w trakcie filmu podczas przewijania do końca treści (#10685).
- Prawidłowo obliczać czas trwania okna w przypadku transmisji na żywo z reklamami wstawianymi po stronie serwera, na przykład IMA DAI (#10764).
- Rozszerzenie FFmpeg:
- Dodaj nowe wymagane flagi, aby połączyć biblioteki FFmpeg z NDK 23.1.7779620 i nowszymi (#9933).
- Rozszerzenie AV1:
- Zaktualizuj wersję CMake, aby uniknąć niezgodności z najnowszymi wersjami Android Studio (#9933).
- Rozszerzenie przesyłania:
- Wdrożyć
getDeviceInfo()
, aby można było zidentyfikowaćCastPlayer
podczas sterowania odtwarzaniem za pomocąMediaController
(#142).
- Wdrożyć
- Transformator:
- Dodaj licznik czasu muxera, aby wykrywać zbyt wolne generowanie próbki wyjściowej.
- Usuń symbole wycofane:
- Usuń
Transformer.Builder.setOutputMimeType(String)
. Ta funkcja została usunięta. Gdy używany jest domyślny muxer, typ MIME będzie zawsze MP4.
- Usuń
Wersja 1.0.0-beta02
21 lipca 2022 r.
androidx.media3:media3-*:1.0.0-beta02
został zwolniony.
Wersja 1.0.0-beta02 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayer 2.18.1.
- Podstawowa biblioteka:
- Upewnij się, że zmiana
ShuffleOrder
za pomocąExoPlayer.setShuffleOrder
skutkuje wywołaniemPlayer.Listener#onTimelineChanged
zreason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED
(#9889). - W przypadku mediów progresywnych uwzględnij tylko wybrane utwory w pozycji buforowanej (#10361).
- Zezwalanie na niestandardowy rejestrator dla wszystkich danych wyjściowych ExoPlayer (#9752).
- Naprawiono implementację funkcji
setDataSourceFactory
w funkcjiDefaultMediaSourceFactory
, która w niektórych przypadkach nie działała (#116).
- Upewnij się, że zmiana
- Moduły wyodrębniania danych:
- DASH:
- Parsowanie adresu URL licencji ClearKey z plików manifestu (#10246).
- Interfejs:
- Sprawdzanie, czy TalkBack ogłasza aktualnie aktywną opcję szybkości w menu elementów sterujących odtwarzaniem (#10298).
- RTSP:
- Dodaj obsługę fragmentowanych pakietów VP8 (#110).
- Rozszerzenie leanback:
- Posłuchaj zmian w
playWhenReady
wLeanbackAdapter
(10420).
- Posłuchaj zmian w
- Przesyłanie:
Wersja 1.0.0-beta01
16 czerwca 2022 r.
androidx.media3:media3-*:1.0.0-beta01
został zwolniony.
Wersja 1.0.0-beta01 zawiera te zatwierdzenia.
Odpowiada to wersji ExoPlayer 2.18.0.
- Podstawowa biblioteka:
- Włącz obsługę diagnostyki platformy Android za pomocą
MediaMetricsManager
. ExoPlayer przekaże zdarzenia odtwarzania i dane dotyczące wydajności do platformy, co pomoże w dostarczaniu informacji o wydajności systemu i debugowaniu na urządzeniu. Te dane mogą być też gromadzone przez Google, jeśli użytkownik urządzenia włączył udostępnianie danych o użyciu i diagnostyce. Aplikacje mogą zrezygnować z udostępniania danych do diagnostyki platformy ExoPlayer za pomocą parametruExoPlayer.Builder.setUsePlatformDiagnostics(false)
. - Rozwiązanie problemu polegającego na zbyt częstym resetowaniu ścieżek podczas korzystania z funkcji
MergingMediaSource
, na przykład podczas wczytywania napisów i zmiany wybranych napisów w trakcie odtwarzania (#10248). - Przestań wykrywać typ sieci 5G-NSA w interfejsach API 29 i 30. Odtwarzanie będzie odbywać się w sieci 4G.
- Nie zezwalaj na przekazywanie
null
doMediaSource.Factory.setDrmSessionManagerProvider
iMediaSource.Factory.setLoadErrorHandlingPolicy
. W razie potrzeby można jawnie przekazywać instancje funkcjiDefaultDrmSessionManagerProvider
iDefaultLoadErrorHandlingPolicy
. - Dodaj element
MediaItem.RequestMetadata
reprezentujący metadane potrzebne do odtwarzania multimediów, gdy dokładna wartośćLocalConfiguration
nie jest znana. Usuń teżMediaMetadata.mediaUrl
, ponieważ jest ono teraz uwzględnione wRequestMetadata
. - Dodaj
Player.Command.COMMAND_SET_MEDIA_ITEM
, aby umożliwić graczom ustawianie pojedynczego elementu.
- Włącz obsługę diagnostyki platformy Android za pomocą
- Wybór ścieżki:
- Spłaszcz zajęcia
TrackSelectionOverrides
do poziomu zajęćTrackSelectionParameters
i przenieś zajęciaTrackSelectionOverride
na najwyższy poziom. - Zmień nazwę
TracksInfo
naTracks
, aTracksInfo.TrackGroupInfo
naTracks.Group
. NazwaPlayer.getCurrentTracksInfo
iPlayer.Listener.onTracksInfoChanged
została zmieniona odpowiednio naPlayer.getCurrentTracks
iPlayer.Listener.onTracksChanged
. Obejmuje to wycofanie nazwy metodyPlayer.Listener.onTracksChanged
, ale z użyciem innych typów parametrów. - Zmień operatory
DefaultTrackSelector.buildUponParameters
iDefaultTrackSelector.Parameters.buildUpon
, aby zwracały wartośćDefaultTrackSelector.Parameters.Builder
zamiast przestarzałego operatoraDefaultTrackSelector.ParametersBuilder
. - Dodaj
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities
, które jest domyślnie włączone. Po włączeniuDefaultTrackSelector
będzie preferować ścieżki audio, których liczba kanałów nie przekracza możliwości wyjściowych urządzenia. Na urządzeniach przenośnychDefaultTrackSelector
będzie preferować dźwięk stereo lub mono zamiast formatów dźwięku wielokanałowego, chyba że format wielokanałowy może być przestrzenny (Android 12L+) lub jest formatem dźwięku przestrzennego Dolby. Dodatkowo na urządzeniach obsługujących przestrzenne odtwarzanie dźwiękuDefaultTrackSelector
będzie sprawdzać zmiany w właściwościach Spatializer i uruchamiać wybór nowego utworu. Urządzenia ztelevision
trybem interfejsu użytkownika są wykluczone z tych ograniczeń, a preferowany będzie format z największą liczbą kanałów. Aby włączyć tę funkcję, instancjaDefaultTrackSelector
musi być utworzona za pomocąContext
.
- Spłaszcz zajęcia
- Film:
- Zmień nazwę
DummySurface
naPlaceholderSurface
. - Dodaj obsługę AV1 do
MediaCodecVideoRenderer.getCodecMaxInputSize
.
- Zmień nazwę
- Dźwięk:
- Użyj dekodera audio LG AC3, który reklamuje niestandardowy typ MIME.
- Zmień typ zwrotu
AudioAttributes.getAudioAttributesV21()
zandroid.media.AudioAttributes
na nową klasę otokiAudioAttributesV21
, aby zapobiec powolnej weryfikacji ART w interfejsie API < 21. - Wyślij zapytanie do platformy (API w wersji 29 lub nowszej) lub załóż, że liczba kanałów kodowania audio na potrzeby przekazywania dźwięku jest nieskonfigurowana, gdy liczba kanałów audio nie jest określona, co ma miejsce w przypadku przygotowania bezfragmentowego protokołu HLS (10204).
- Skonfiguruj
AudioTrack
z maską kanałuAudioFormat.CHANNEL_OUT_7POINT1POINT4
, jeśli dekoder wyprowadza 12-kanałowe audio PCM (#10322).
- DRM
- Upewnij się, że sesja DRM jest zawsze prawidłowo aktualizowana podczas przewijania bezpośrednio po zmianie formatu (10274).
- Tekst:
- Zmień
Player.getCurrentCues()
, aby zwracała wartośćCueGroup
zamiastList<Cue>
. - SSA: obsługa ustawienia stylu
OutlineColour
, gdyBorderStyle == 3
(tzn.OutlineColour
ustawia tło cue) (#8435). - CEA-708: Przeanalizuj dane w wiele bloki usług i ignoruj bloki niezwiązane z obecnie wybranym numerem usługi.
- Usuń
RawCcExtractor
, który był używany tylko do obsługi formatu napisów wewnętrznych Google.
- Zmień
- Moduły wyodrębniania danych:
- UI:
- Naprawić przesyłanie zdarzeń do
OnClickListener
s ustawionych wPlayerView
w przypadkuuseController=false
(#9605). Poprawiono też wyświetlanie zdarzeń doOnLongClickListener
we wszystkich konfiguracjach widoku. - Rozwiązanie problemu polegającego na nieprawidłowym traktowaniu sekwencji zdarzeń dotyku, które wychodzą poza granice
PlayerView
przedACTION_UP
, jako kliknięcia (#9861). - Rozwiązaliśmy problem z ułatwieniami dostępu
PlayerView
, który polegał na tym, że kliknięcie może przełączyć odtwarzanie zamiast ukryć elementy sterujące (#8627). - Zmodyfikuj polecenia
TrackSelectionView
iTrackSelectionDialogBuilder
, aby działały z interfejsemPlayer
, a nieExoPlayer
. Dzięki temu widoki można używać z innymi implementacjamiPlayer
, a także usunąć zależność modułu interfejsu od modułu ExoPlayer. To jest zmiana zasadnicza. - Nie pokazuj wymuszonych ścieżek tekstowych w selektorze ścieżek
PlayerView
i pozostaw wybraną odpowiednią ścieżkę tekstową, jeśli wybrano opcję „Brak” (#9432).
- Naprawić przesyłanie zdarzeń do
- DASH:
- Przeanalizuj liczbę kanałów z elementów DTS
AudioChannelConfiguration
. Spowoduje to ponowne włączenie przekazywania dźwięku w strumieniach DTS (#10159). - Nie zezwalaj na przekazywanie danych
null
doDashMediaSource.Factory.setCompositeSequenceableLoaderFactory
. W razie potrzeby instancjeDefaultCompositeSequenceableLoaderFactory
można przekazywać wprost.
- Przeanalizuj liczbę kanałów z elementów DTS
- HLS:
- Przejście na przygotowanie w kawałkach, jeśli atrybut CODECS playlisty nie zawiera kodeka audio (#10065).
- Nie zezwalaj na przekazywanie komunikatów
null
doHlsMediaSource.Factory.setCompositeSequenceableLoaderFactory
,HlsMediaSource.Factory.setPlaylistParserFactory
iHlsMediaSource.Factory.setPlaylistTrackerFactory
. WystąpieniaDefaultCompositeSequenceableLoaderFactory
,DefaultHlsPlaylistParserFactory
lub odniesienie doDefaultHlsPlaylistTracker.FACTORY
mogą być w razie potrzeby przekazywane bezpośrednio.
- Wygładzanie strumieniowego przesyłania danych:
- Nie zezwalaj na przekazywanie wartości
null
doSsMediaSource.Factory.setCompositeSequenceableLoaderFactory
. W razie potrzeby instancjeDefaultCompositeSequenceableLoaderFactory
można przekazywać wprost.
- Nie zezwalaj na przekazywanie wartości
- RTSP:
- Dodaj czytnik RTP dla H263 (#63).
- Dodaj czytnik RTP dla MPEG4 (#35).
- Dodaj czytnik RTP dla HEVC (#36).
- Dodaj czytnik RTP dla AMR. Obecnie obsługiwane są tylko monokanałowe strumienie AMR bez przeplotu. Złożony ładunek RTP AMR nie jest obsługiwany. (#46)
- Dodaj czytnik RTP dla VP8 (#47).
- Dodaj czytnik RTP na potrzeby WAV (#56).
- Popraw nagłówek autoryzacji podstawowej RTSP. (#9544).
- Zatrzymaj sprawdzanie pól SDP, ponieważ ExoPlayer ich nie potrzebuje (#10049).
- Podczas analizy czasu RTSP (#10165) zgłaszaj wyjątek zaznaczony.
- Dodaj czytnik RTP dla VP9 (#47).
- Dodaj czytnik RTP dla OPUS (#53).
- Źródła danych:
- Zmień nazwę
DummyDataSource
naPlaceholderDataSource
. - Sposób obejścia problemu z przerwaniem wywołania OkHttp.
- Zmień nazwę
- Sesja:
- Zastąp
MediaSession.MediaItemFiller
wartościąMediaSession.Callback.onAddMediaItems
, aby umożliwić asynchroniczne przetwarzanie żądań. - Obsługuj metody
setMediaItems(s)
, gdyMediaController
łączy się ze starszą sesją multimediów. - Usuń
MediaController.setMediaUri
iMediaSession.Callback.onSetMediaUri
. Tę samą funkcję można uzyskać, używając pólMediaController.setMediaItem
iMediaSession.Callback.onAddMediaItems
. - Przekierowuj połączenia z usług
MediaController
, które odtwarzają treści multimedialne, doMediaSession.Callback.onAddMediaItems
zamiast doonSetMediaUri
. - Dodaj atrybuty
MediaNotification.Provider
iDefaultMediaNotificationProvider
, aby dostosować powiadomienie. - Dodaj
BitmapLoader
iSimpleBitmapLoader
do pobierania obrazów z elementami graficznymi. - Dodaj
MediaSession.setCustomLayout()
, aby zapewnić zgodność wsteczną ze starszą sesją. - Dodaj
MediaSession.setSessionExtras()
, aby zapewnić spójność funkcji ze starszą sesją. - Zmień nazwę
MediaSession.MediaSessionCallback
naMediaSession.Callback
,MediaLibrarySession.MediaLibrarySessionCallback
naMediaLibrarySession.Callback
, aMediaSession.Builder.setSessionCallback
nasetCallback
. - Naprawić NPE w
MediaControllerImplLegacy
(#59). - Zaktualizuj informacje o pozycji sesji na osi czasu(#51).
- Napraw NPE w
MediaControllerImplBase
po zwolnieniu kontrolera (#74).
- Zastąp
- Odtwarzanie reklamy / interaktywnych reklam multimedialnych:
- Zmniejsz częstotliwość sprawdzania reklam z co 100 ms na co 200 ms, aby dostosować się do zaleceń Media Rating Council (MRC).
- Rozszerzenie FFmpeg:
- Zaktualizuj wersję CMake do wersji
3.21.0+
, aby uniknąć błędu CMake, który powodował niepowodzenie synchronizacji narzędzia Gradle w Android Studio (#9933).
- Zaktualizuj wersję CMake do wersji
- Usuń symbole wycofane:
- Usuń
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
. Użyj w zamian zasadyPlayer.Listener.onTracksChanged(Tracks)
. - Usuń
Player.getCurrentTrackGroups
iPlayer.getCurrentTrackSelections
. Zamiast tego użyj polaPlayer.getCurrentTracks
. Możesz też nadal używać metodExoPlayer.getCurrentTrackGroups
iExoPlayer.getCurrentTrackSelections
, chociaż są one nadal wycofywane. - Usuń stałe
DownloadHelper
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
iDEFAULT_TRACK_SELECTOR_PARAMETERS
. W miarę możliwości używaj parametrugetDefaultTrackSelectorParameters(Context)
, a w przeciwnym razie –DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT
. - Usuń konstruktor
DefaultTrackSelector(ExoTrackSelection.Factory)
. Zamiast tego użyj polaDefaultTrackSelector(Context, ExoTrackSelection.Factory)
. - Usuń
Transformer.Builder.setContext
. Zamiast tego parametrContext
powinien być przekazywany do konstruktoraTransformer.Builder
.
- Usuń
Wersja 1.0.0-alpha03
14 marca 2022 r.
Usługa androidx.media3:media3-*:1.0.0-alpha03
została zwolniona.
Wersja 1.0.0-alpha03 zawiera te commity.
Odpowiada ona wersji ExoPlayer 2.17.1.
- Dźwięk:
- Usunęliśmy błąd podczas sprawdzania funkcji audio Dolby Atmos (E-AC3-JOC) w HLS.
- Wyodrębnianie:
- FMP4: usunięto problem, który powodował, że przykładowe metadane emsg w niewłaściwej kolejności w przypadku strumieni zawierających atomy emsg w wersjach v0 i v1 (#9996).
- Tekst:
- Napraw interfejs
SingleSampleMediaSource.Factory.setTrackId
iMediaItem.SubtitleConfiguration.Builder.setId
, aby nadać priorytet poluSubtitleConfiguration
i użyć wartościFactory
, jeśli nie jest ono ustawione (#10016).
- Napraw interfejs
- Odtwarzanie reklam:
- Napraw przerwy w odtwarzaniu dźwięku między okresami reklamowymi w transmisjach HLS SSAI na żywo.
Wersja 1.0.0-alpha02
2 marca 2022 r.
androidx.media3:media3-*:1.0.0-alpha02
został zwolniony.
Wersja 1.0.0-alfa02 zawiera te zatwierdzenia.
Odpowiada to wersji ExoPlayer 2.17.0.
- Podstawowa biblioteka:
- Dodaj metodę
DefaultRenderersFactory.getCodecAdapterFactory()
chronioną przed modyfikacją, aby podklasy klasyDefaultRenderersFactory
, które zastępują metodębuildVideoRenderers()
lubbuildAudioRenderers()
, mogły uzyskać dostęp do fabryki adaptera kodeka i przekazać ją do tworzonych przez siebie wystąpieńMediaCodecRenderer
. - Przeprowadź pola nagłówka ICY
name
igenre
odpowiednio do pólMediaMetadata.station
iMediaMetadata.genre
, aby dotarły do aplikacji przez polePlayer.Listener.onMediaMetadataChanged()
(#9677). - Usuń klucze null z
DefaultHttpDataSource#getResponseHeaders
. - Uśpienie i ponowienie próby, jeśli nie uda się utworzyć instancji
MediaCodec
. Rozwiązanie to pozwala obejść problem, który występuje na niektórych urządzeniach podczas przełączania powierzchni z bezpiecznego kodeka na inny (#8696). - Dodaj
MediaCodecAdapter.getMetrics()
, aby umożliwić użytkownikom uzyskiwanie danych pomiarowych zMediaCodec
. (#9766). - Naprawiono rozwiązanie zależności Maven (#8353).
- Wyłącz automatyczną korektę szybkości w przypadku transmisji na żywo, które nie mają funkcji małego opóźnienia ani nie mają ustawienia szybkości na żądanie użytkownika (#9329).
- Zmień nazwę
DecoderCounters#inputBufferCount
naqueuedInputBufferCount
. - Ustaw
SimpleExoPlayer.renderers
jako prywatne. Do renderowania można uzyskać dostęp za pomocąExoPlayer.getRenderer
. - Zaktualizowano niektóre wartości stałych
AnalyticsListener.EventFlags
, aby pasowały do wartości w plikuPlayer.EventFlags
. - Podziel
AnalyticsCollector
na interfejs i domyślną implementację, aby umożliwić usunięcie go przez R8, jeśli aplikacja go nie potrzebuje.
- Dodaj metodę
- Wybór ścieżki:
- Obsługa flag preferowanych ról wideo w wyborze ścieżki (#9402).
- Zaktualizowano logikę wyboru ścieżki wideo, aby uwzględniać preferowane typy MIME i flagi ról podczas wybierania wielu ścieżek wideo do adaptacji (#9519).
- Zaktualizowano logikę wyboru ścieżki wideo i ścieżki audio, aby wybierać tylko formaty dla opcji dostosowanych, które mają ten sam poziom obsługi dekodera i sprzętu (#9565).
- Zaktualizuj logikę wyboru ścieżki wideo, aby preferować bardziej wydajne kodeki, jeśli główne dekodery z akceleracją sprzętową obsługują wiele kodeków (#4835).
- Preferuj ustawienia treści audio (np. „domyślny” ścieżka audio lub ścieżka dopasowana do języka systemu) zamiast ograniczeń technicznych dotyczących wyboru ścieżki (np. preferowany typ MIME lub maksymalna liczba kanałów).
- Rozwiązanie problemu z wyborem ścieżki, w którym zastąpienie jednej grupy ścieżek nie wyłączało innych grup ścieżek tego samego typu (#9675).
- Rozwiązanie problemu z wyborem utworu, w którym nie można prawidłowo zastąpić zarówno niepustego, jak i pustego utworu (#9649).
- Zabrania zduplikowanych
TrackGroup
w ramachTrackGroupArray
. ElementyTrackGroup
można zawsze odróżnić, ustawiając elementid
w konstruktorzeTrackGroup
. Rozwiązuje to problem z zawieszaniem się aplikacji podczas wznawiania odtwarzania po przełączeniu aplikacji na tło z aktywnym zastąpieniem ścieżki (#9718). - Zmień zasady w
AdaptiveTrackSelection
, aby zapewnić wzrost jakości przy wystarczającej przepustowości sieci nawet wtedy, gdy odtwarzanie odbywa się bardzo blisko brzegu transmisji na żywo (#9784).
- Film:
- Popraw logikę dekodera zapasowego dla Dolby Vision, aby w razie potrzeby używać zgodnego dekodera H264/H265.
- Dźwięk:
- Popraw logikę dekodera zapasowego w przypadku Dolby Atmos (E-AC3-JOC), aby w razie potrzeby użyć zgodnego dekodera E-AC3.
- Zmień interfejsy API
AudioCapabilities
, aby wymagały przekazywania wartościAudioCapabilities.DEFAULT_AUDIO_CAPABILITIES
zamiastnull
. - Umożliw dostosowanie obliczeń rozmiaru bufora
AudioTrack
przez wstrzyknięcie wartościAudioTrackBufferSizeProvider
doDefaultAudioSink
. (#8891). - Ponownie utwórz
AudioTrack
, jeśli żądany rozmiar bufora wynosił > 1 MB. (#9712).
- Moduły wyodrębniania danych:
- Tekst:
- Dodaj pole
MediaItem.SubtitleConfiguration.id
, które zostanie przekazane do polaFormat.id
ścieżki z napisami utworzonej na podstawie konfiguracji (#9673). - Dodanie podstawowej obsługi napisów WebVTT w kontenerach Matroska (#9886).
- Zapobieganie odczytywaniu przez
Cea708Decoder
większej ilości danych niż zadeklarowany rozmiar bloku usługi.
- Dodaj pole
- DRM:
- Usuń
playbackLooper
z kontaDrmSessionManager.(pre)acquireSession
. Gdy aplikacja używa elementuDrmSessionManager
w niestandardowym elemencieMediaSource
,playbackLooper
musi zostać przekazany do elementuDrmSessionManager.setPlayer
.
- Usuń
- Odtwarzanie reklamy / interaktywnych reklam multimedialnych:
- Dodano obsługę dynamicznego wstawiania reklam IMA (DAI) (#8213).
- Dodaj do
AdPlaybackState
metodę, która umożliwi zresetowanie grupy reklam, aby można było ją odtworzyć ponownie (#9615). - Egzekwuj szybkość odtwarzania wynoszącą 1,0 podczas odtwarzania reklamy (#9018).
- Rozwiązanie problemu, który powodował natychmiastowe zresetowanie odtwarzania, gdy nie udało się załadować grupy reklam (#9929).
- UI:
- DASH:
- Dodaj przeanalizowane podstawowe i dodatkowe właściwości do
Representation
(#9579). - Obsługuj rolę śledzenia
forced-subtitle
(#9727). - Zatrzymaj interpretowanie roli ścieżki
main
jakoC.SELECTION_FLAG_DEFAULT
. - Poprawiono logikę wykluczania adresów URL podstawowych w przypadku manifestów, które nie deklarują przestrzeni nazw DVB (#9856).
- Obsługa względnych adresów URL
MPD.Location
(#9939).
- Dodaj przeanalizowane podstawowe i dodatkowe właściwości do
- HLS:
- Prawidłowo wypełnij
Format.label
w przypadku strumieni HLS zawierających tylko dźwięk (#9608). - Domyślnie używaj przygotowywania bez fragmentów, aby skrócić czas uruchamiania. Jeśli Twoje wypożyczenia zawierają powielone ścieżki napisów, które nie są zadeklarowane na playliście reklamy nadrzędnej, dodaj je do playlisty reklamy nadrzędnej, aby umożliwić odtwarzanie, lub wyłącz przygotowywanie bez fragmentów, korzystając z usługi
HlsMediaSource.Factory.setAllowChunklessPreparation(false)
. - Obsługa dokładnego przewijania do kluczowych klatek w HLS (#2882).
- Prawidłowo wypełnij
- RTSP:
- Dostarczyć interfejs API klienta, aby zastąpić wartość
SocketFactory
używaną dla dowolnego połączenia z serwerem (#9606). - Jeśli dostępne są obie metody, preferuj DIGEST zamiast BASIC (#9800).
- Obsługa, gdy czas ścieżki RTSP jest niedostępny (#9775).
- Ignoruj nieprawidłowe wartości nagłówka RTP-Info (#9619).
- Dostarczyć interfejs API klienta, aby zastąpić wartość
- Transformator:
- Zwiększ wymaganą minimalną wersję interfejsu API do 21.
- Wartość
TransformationException
służy teraz do opisywania błędów występujących podczas przekształcenia. - Dodaj
TransformationRequest
, aby określić opcje przekształcania. - Zezwalanie na rejestrację wielu słuchaczy.
- Rozwiązanie problemu z zablokowaniem się Transformera, gdy kodek jest częściowo odczytywany.
- Napraw potencjalny NPE w
Transformer.getProgress
podczas zwalniania muxer throws. - Dodaj aplikację w wersji demonstracyjnej do stosowania przekształceń.
- Rozszerzenie MediaSession:
- Domyślnie
MediaSessionConnector
teraz czyści 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 narzędzi bin LLVM, a nie GNU (#9933).
- Spraw, aby funkcja
- Zgodność z Androidem 12:
- Uaktualnij rozszerzenie Cast, by korzystać z interfejsu
com.google.android.gms:play-services-cast-framework:20.1.0
. Wcześniejsze wersjeplay-services-cast-framework
nie są zgodne z aplikacjami kierowanymi na Androida 12 i spowodują błądIllegalArgumentException
podczas tworzeniaPendingIntent
(#9528).
- Uaktualnij rozszerzenie Cast, by korzystać z interfejsu
- Usuń wycofane symbole:
- Usuń
Player.EventListener
. Zamiast tego użyj polaPlayer.Listener
. - Usuń
MediaSourceFactory#setDrmSessionManager
,MediaSourceFactory#setDrmHttpDataSourceFactory
iMediaSourceFactory#setDrmUserAgent
. Zamiast tego użyj atrybutuMediaSourceFactory#setDrmSessionManagerProvider
. - Usuń
MediaSourceFactory#setStreamKeys
. Zamiast tego użyj atrybutuMediaItem.Builder#setStreamKeys
. - Usuń
MediaSourceFactory#createMediaSource(Uri)
. Zamiast tego użyj atrybutuMediaSourceFactory#createMediaSource(MediaItem)
. - Usuń
setTag
z kontDashMediaSource
,HlsMediaSource
iSsMediaSource
. Użyj w zamian zasadyMediaItem.Builder#setTag
. - Usuń
DashMediaSource#setLivePresentationDelayMs(long, boolean)
. Użyj parametrówMediaItem.Builder#setLiveConfiguration
iMediaItem.LiveConfiguration.Builder#setTargetOffsetMs
, aby zastąpić instrukcje wyświetlane w pliku manifestu, lubDashMediaSource#setFallbackTargetLiveOffsetMs
, aby podać wartość zastępczą. - Usuń
(Simple)ExoPlayer.setThrowsWhenUsingWrongThread
. Wycofanie się z przestrzegania zasad dotyczących wątków nie jest już możliwe. - Usuń
ActionFile
iActionFileUpgradeUtil
. Użyj rozszerzenia ExoPlayer w wersji 2.16.1 lub starszej, aby za pomocąActionFileUpgradeUtil
scalać starsze pliki działań wDefaultDownloadIndex
. - Usuń
ProgressiveMediaSource#setExtractorsFactory
. Zamiast tego użyj konstruktoraProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)
. - Usuń
ProgressiveMediaSource.Factory#setTag
iProgressiveMediaSource.Factory#setCustomCacheKey
. Zamiast niej użyj właściwościMediaItem.Builder#setTag
iMediaItem.Builder#setCustomCacheKey
. - Usuń konstruktory
DefaultRenderersFactory(Context, @ExtensionRendererMode int)
iDefaultRenderersFactory(Context, @ExtensionRendererMode int, long)
. Zamiast tego użyj konstruktoraDefaultRenderersFactory(Context)
, funkcjiDefaultRenderersFactory#setExtensionRendererMode
i funkcjiDefaultRenderersFactory#setAllowedVideoJoiningTimeMs
. - Usuń wszystkich publicznych konstruktorów
CronetDataSource
. Zamiast tego użyj atrybutuCronetDataSource.Factory
.
- Usuń
- Zmień te
IntDefs
na@Target(TYPE_USE)
. Może to spowodować błąd kompilacji w Kotlinie, który można naprawić, przenosząc adnotację, aby oznaczyć typ (Int
).@AacAudioObjectType
@Ac3Util.SyncFrameInfo.StreamType
@AdLoadException.Type
@AdtsExtractor.Flags
@AmrExtractor.Flags
@AspectRatioFrameLayout.ResizeMode
@AudioFocusManager.PlayerCommand
@AudioSink.SinkFormatSupport
@BinarySearchSeeker.TimestampSearchResult.Type
@BufferReplacementMode
@C.BufferFlags
@C.ColorRange
@C.ColorSpace
@C.ColorTransfer
@C.CryptoMode
@C.Encoding
@C.PcmEncoding
@C.Projection
@C.SelectionReason
@C.StereoMode
@C.VideoOutputMode
@CacheDataSource.Flags
@CaptionStyleCompat.EdgeType
@DataSpec.Flags
@DataSpec.HttpMethods
@DecoderDiscardReasons
@DecoderReuseResult
@DefaultAudioSink.OutputMode
@DefaultDrmSessionManager.Mode
@DefaultTrackSelector.SelectionEligibility
@DefaultTsPayloadReaderFactory.Flags
@EGLSurfaceTexture.SecureMode
@EbmlProcessor.ElementType
@ExoMediaDrm.KeyRequest.RequestType
@ExtensionRendererMode
@Extractor.ReadResult
@FileTypes.Type
@FlacExtractor.Flags
(w pakieciecom.google.android.exoplayer2.ext.flac
)@FlacExtractor.Flags
(w pakieciecom.google.android.exoplayer2.extractor.flac
)@FragmentedMp4Extractor.Flags
@HlsMediaPlaylist.PlaylistType
@HttpDataSourceException.Type
@IllegalClippingException.Reason
@IllegalMergeException.Reason
@LoadErrorHandlingPolicy.FallbackType
@MatroskaExtractor.Flags
@Mp3Extractor.Flags
@Mp4Extractor.Flags
@NotificationUtil.Importance
@PlaybackException.FieldNumber
@PlayerNotificationManager.Priority
@PlayerNotificationManager.Visibility
@PlayerView.ShowBuffering
@Renderer.State
@RendererCapabilities.AdaptiveSupport
@RendererCapabilities.Capabilities
@RendererCapabilities.DecoderSupport
@RendererCapabilities.FormatSupport
@RendererCapabilities.HardwareAccelerationSupport
@RendererCapabilities.TunnelingSupport
@SampleStream.ReadDataResult
@SampleStream.ReadFlags
@StyledPlayerView.ShowBuffering
@SubtitleView.ViewType
@TextAnnotation.Position
@TextEmphasisSpan.MarkFill
@TextEmphasisSpan.MarkShape
@Track.Transformation
@TrackOutput.SampleDataPart
@Transformer.ProgressState
@TsExtractor.Mode
@TsPayloadReader.Flags
@WebvttCssStyle.FontSizeUnit
Wersja 1.0.0-alpha01
27 października 2021 roku
androidx.media3:media3-*:1.0.0-alpha01
został zwolniony.
Wersja 1.0.0-alpha01 zawiera te commity.
Nowe funkcje
Media3 to nowe miejsce, w którym znajdziesz biblioteki obsługujące multimedia, w tym ExoPlayer. Pierwsza wersja alfa obejmuje wczesne, funkcjonalne implementacje bibliotek do implementacji przypadków użycia multimediów, w tym:
- ExoPlayer – odtwarzacz multimediów na poziomie aplikacji na Androida, który jest łatwy do dostosowania i rozszerzania.
- Funkcja sesji multimediów, aby pokazać i kontrolować odtwarzanie. Ten nowy moduł sesji używa tego samego interfejsu
Player
co ExoPlayer. - Komponenty UI do tworzenia interfejsów odtwarzania multimediów.
- moduły otaczające funkcje w innych bibliotekach na potrzeby ExoPlayera, na przykład wstawianie reklam za pomocą pakietu IMA SDK;
Więcej informacji znajdziesz w projekcie Media3 na GitHubie.
Oprogramowanie ExoPlayer było wcześniej hostowane w oddzielnym projekcie GitHub. W Media3 jego nazwa to androidx.media3.exoplayer
. Planujemy jeszcze przez jakiś czas utrzymywać i publikować projekt ExoPlayer na GitHubie, aby dać aplikacjom czas na migrację do Media3. Media3 zawiera zamienniki wszystkich modułów ExoPlayera, z wyjątkiem starszych rozszerzeń media2 i mediasession, które zostały zastąpione nowym modułem media3-session
. Umożliwia to bezpośrednią integrację odtwarzaczy z sesjami multimediów bez konieczności korzystania z klasy adaptera lub złącza.