Media3

Biblioteki pomocnicze do zastosowań multimediów.
Najnowsza aktualizacja Wersja stabilna Kandydat do publikacji Wersja Beta Wersja alfa
12 kwietnia 2024 r. 1.3.1 - - 1.4.0-alfa01

Deklarowanie zależności

Aby dodać zależność od Media3, musisz dodać do projektu repozytorium Google Maven. Więcej informacji znajdziesz w repozytorium Google Maven.

W pliku build.gradle aplikacji lub modułu dodaj zależności artefaktów, których potrzebujesz:

Odlotowy

dependencies {
    def media3_version = "1.3.1"

    // For media playback using ExoPlayer
    implementation "androidx.media3:media3-exoplayer:$media3_version"

    // For DASH playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-dash:$media3_version"
    // For HLS playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
    // For SmoothStreaming playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version"
    // For RTSP playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version"
    // For MIDI playback support with ExoPlayer (see additional dependency requirements in
    // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md)
    implementation "androidx.media3:media3-exoplayer-midi:$media3_version"
    // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-ima:$media3_version"

    // For loading data using the Cronet network stack
    implementation "androidx.media3:media3-datasource-cronet:$media3_version"
    // For loading data using the OkHttp network stack
    implementation "androidx.media3:media3-datasource-okhttp:$media3_version"
    // For loading data using librtmp
    implementation "androidx.media3:media3-datasource-rtmp:$media3_version"

    // For building media playback UIs
    implementation "androidx.media3:media3-ui:$media3_version"
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation "androidx.media3:media3-ui-leanback:$media3_version"

    // For exposing and controlling media sessions
    implementation "androidx.media3:media3-session:$media3_version"

    // For extracting data from media containers
    implementation "androidx.media3:media3-extractor:$media3_version"

    // For integrating with Cast
    implementation "androidx.media3:media3-cast:$media3_version"

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version"

    // For transforming media files
    implementation "androidx.media3:media3-transformer:$media3_version"

    // For applying effects on video frames
    implementation "androidx.media3:media3-effect:$media3_version"

    // For muxing media files
    implementation "androidx.media3:media3-muxer:$media3_version"

    // Utilities for testing media components (including ExoPlayer components)
    implementation "androidx.media3:media3-test-utils:$media3_version"
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation "androidx.media3:media3-test-utils-robolectric:$media3_version"

    // Common functionality for reading and writing media containers
    implementation "androidx.media3:media3-container:$media3_version"
    // Common functionality for media database components
    implementation "androidx.media3:media3-database:$media3_version"
    // Common functionality for media decoders
    implementation "androidx.media3:media3-decoder:$media3_version"
    // Common functionality for loading data
    implementation "androidx.media3:media3-datasource:$media3_version"
    // Common functionality used across multiple media libraries
    implementation "androidx.media3:media3-common:$media3_version"
}

Kotlin

dependencies {
    val media3_version = "1.3.1"

    // For media playback using ExoPlayer
    implementation("androidx.media3:media3-exoplayer:$media3_version")

    // For DASH playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-dash:$media3_version")
    // For HLS playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-hls:$media3_version")
    // For SmoothStreaming playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version")
    // For RTSP playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version")
    // For MIDI playback support with ExoPlayer (see additional dependency requirements in
    // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md)
    implementation("androidx.media3:media3-exoplayer-midi:$media3_version")
    // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-ima:$media3_version")

    // For loading data using the Cronet network stack
    implementation("androidx.media3:media3-datasource-cronet:$media3_version")
    // For loading data using the OkHttp network stack
    implementation("androidx.media3:media3-datasource-okhttp:$media3_version")
    // For loading data using librtmp
    implementation("androidx.media3:media3-datasource-rtmp:$media3_version")

    // For building media playback UIs
    implementation("androidx.media3:media3-ui:$media3_version")
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation("androidx.media3:media3-ui-leanback:$media3_version")

    // For exposing and controlling media sessions
    implementation("androidx.media3:media3-session:$media3_version")

    // For extracting data from media containers
    implementation("androidx.media3:media3-extractor:$media3_version")

    // For integrating with Cast
    implementation("androidx.media3:media3-cast:$media3_version")

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version")

    // For transforming media files
    implementation("androidx.media3:media3-transformer:$media3_version")

    // For applying effects on video frames
    implementation("androidx.media3:media3-effect:$media3_version")

    // For muxing media files
    implementation("androidx.media3:media3-muxer:$media3_version")

    // Utilities for testing media components (including ExoPlayer components)
    implementation("androidx.media3:media3-test-utils:$media3_version")
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation("androidx.media3:media3-test-utils-robolectric:$media3_version")

    // Common functionality for reading and writing media containers
    implementation("androidx.media3:media3-container:$media3_version")
    // Common functionality for media database components
    implementation("androidx.media3:media3-database:$media3_version")
    // Common functionality for media decoders
    implementation("androidx.media3:media3-decoder:$media3_version")
    // Common functionality for loading data
    implementation("androidx.media3:media3-datasource:$media3_version")
    // Common functionality used across multiple media libraries
    implementation("androidx.media3:media3-common:$media3_version")
}

Więcej informacji o zależnościach znajdziesz w artykule Dodawanie zależności kompilacji.

Opinia

Twoja opinia pomoże nam ulepszyć Jetpack. Możesz użyć narzędzia do śledzenia problemów z Media3, aby znaleźć odpowiedzi na pytania, znane problemy i prośby o dodanie funkcji, a także zgłosić nowe problemy.

Wersja 1.4.0

Wersja 1.4.0-alfa01

17 kwietnia 2024 r.

Aplikacja androidx.media3:media3-*:1.4.0-alpha01 została zwolniona. Wersja 1.4.0-alpha01 zawiera te zatwierdzenia.

  • ExoPlayer:
    • Dodaj element BasePreloadManager, który koordynuje wstępne wczytywanie wielu źródeł na podstawie priorytetów określonych przez parametr rankingData. Rozszerzanie tej klasy jest możliwe, aby można było je dostosowywać. Dodaj funkcję DefaultPreloadManager, która używa metody PreloadMediaSource do wstępnego wczytywania próbek multimediów ze źródeł do pamięci, oraz liczby całkowitej rankingData, która wskazuje indeks elementu w interfejsie.
    • Dodaj PlayerId do większości metod LoadControl, aby umożliwić implementacje LoadControl obsługujące wiele odtwarzaczy.
    • Usuń użytkowników Buffer.isDecodeOnly() i C.BUFFER_FLAG_DECODE_ONLY. Nie trzeba ustawiać tej flagi, ponieważ mechanizmy renderowania i dekoderów będą decydować o pomijaniu buforów na podstawie sygnatury czasowej. Niestandardowe implementacje Renderer powinny sprawdzać, czy czas buforowania wynosi co najmniej BaseRenderer.getLastResetPositionUs(), aby określić, czy należy wyświetlić próbkę. Niestandardowe implementacje SimpleDecoder mogą w razie potrzeby sprawdzać parametr isAtLeastOutputStartTimeUs lub oznaczyć inne bufory za pomocą parametru DecoderOutputBuffer.shouldBeSkipped, aby je pominąć.
    • Zezwalaj na zwracanie przez TargetPreloadStatusControl.getTargetPreloadStatus(T) wartości null, aby wskazać, że nie ma być wstępnie ładowane MediaSource z określonym rankingData.
    • Dodaj remove(MediaSource) do BasePreloadManager.
  • Transformer:
    • Dodaj audioConversionProcess i videoConversionProcess do ExportResult, by określić sposób utworzenia odpowiedniej ścieżki w pliku wyjściowym.
    • Rozluźnij się z kontrolą optymalizacji przycięcia H.264.
    • Dodano obsługę przełączania między multimediami wejściowymi SDR i HDR w sekwencji.
    • Dodano obsługę efektów dźwiękowych na poziomie kompozycji.
    • Dodaj obsługę transkodowania obrazów ultra HDR do filmów HDR.
    • Rozwiązaliśmy problem polegający na tym, że po zresetowaniu i ponownym użyciu DefaultAudioMixer nie zwraca prawidłowej liczby bajtów.
  • Film:
    • Rozwiązanie problemu polegającego na tym, że Listener.onRenderedFirstFrame() pojawia się zbyt wcześnie podczas przełączania platform w trakcie odtwarzania.
  • Źródło danych:
    • Zaimplementuj obsługę identyfikatorów URI nieprzetworzonych zasobów android.resource://package/id, gdzie package różni się od pakietu bieżącej aplikacji. Do tej pory nie było to udokumentowane, ale jest to skuteczniejszy sposób uzyskiwania dostępu do zasobów w innym pakiecie niż nazwa.
    • Starannie sprawdź parametr url w konstruktorach DataSpec, który nie ma wartości null. Ten parametr został już dodany do adnotacji nie ma wartości null.
  • Efekt:
    • Obsługuj wiele zmian prędkości w obrębie tego samego atrybutu EditedMediaItem lub Composition w SpeedChangeEffect.
    • Obsługa wyjściowego formatu HLG i PQ z wejścia bitmapy ultra HDR.
    • Dodano obsługę klasy EGL_GL_COLORSPACE_BT2020_HLG_EXT, która poprawia jakość danych wyjściowych HLG w plikach ExoPlayer.setVideoEffect i Debuger SurfaceView.
    • Zaktualizuj implementację macierzy nakładki, aby była zgodna z dokumentacją, odwracając wartości x i y stosowane w setOverlayFrameAnchor(). Jeśli używasz funkcji OverlaySettings.Builder.setOverlayFrameAnchor(), odwróć ich wartości x i y, mnożąc je przez -1.
  • Sesja:
    • Zmień wartość domyślną z CommandButton.enabled na true i upewnij się, że w przypadku kontrolerów ta wartość może pozostać nieskonfigurowana, nawet jeśli powiązane polecenie jest dostępne.
    • Dodaj stałe ikony dla elementu CommandButton, które powinny być używane zamiast zasobów ikon niestandardowych.
    • Dodaj MediaSessionService.isPlaybackOngoing(), aby umożliwić aplikacjom zapytania o to, czy usługa musi zostać zatrzymana w komponencie onTaskRemoved() (#1219).
    • Dodaj funkcję MediaSessionService.pauseAllPlayersAndStopSelf(), która w wygodny sposób wstrzyma odtwarzanie wszystkich sesji, i wywołaj metodę stopSelf, aby zakończyć cykl życia MediaSessionService.
    • Zastąp MediaSessionService.onTaskRemoved(Intent), aby zapewnić bezpieczną implementację domyślną, która utrzymuje usługę na pierwszym planie, jeśli odtwarzanie trwa, lub zatrzymuje ją w inny sposób.
  • Pobrane pliki:
    • Upewnij się, że DownloadHelper nie ujawnia nieopublikowanych instancji Renderer, co może doprowadzić do awarii aplikacji IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224).
  • Narzędzia testowe:
    • Zaimplementuj onInit() i onRelease() w aplikacji FakeRenderer.
    • Zmień metody TestPlayerRunHelper.runUntil/playUntil, aby nie wykonywały błędów niekrytycznych (np. tych zgłoszonych do AnalyticsListener.onVideoCodecError). Użyj nowego łańcucha metod TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX(), aby wyłączyć takie zachowanie.
  • Aplikacja w wersji demonstracyjnej:
    • Użyj DefaultPreloadManager w krótkiej aplikacji demonstracyjnej.
  • Usuń wycofane symbole:
    • Usuń CronetDataSourceFactory. Użyj w zamian zasady CronetDataSource.Factory.
    • Usuń niektóre konstruktory DataSpec. Użyj w zamian zasady DataSpec.Builder.

Wersja 1.3.0

Wersja 1.3.1

11 kwietnia 2024 r.

Aplikacja androidx.media3:media3-*:1.3.1 została zwolniona. Wersja 1.3.1 zawiera te zatwierdzenia.

  • Wspólna biblioteka:
    • Dodaj Format.labels, aby zezwolić na etykiety zlokalizowane i inne.
  • ExoPlayer:
    • Rozwiązanie problemu polegającego na tym, że PreloadMediaPeriod nie może zachowywać strumieni po ponownym wczytaniu.
    • Zastosuj prawidłową wartość TrackSelectionResult do okresu odtwarzania podczas ponownego wyboru utworu.
    • Renderowanie z wcześniejszym włączeniem należy rozpocząć dopiero po zakończeniu okresu odtwarzania podczas przechodzenia między elementami multimedialnymi (#1017).
    • Dodaj brakujący typ zwracany do reguły -keepclasseswithmembers ProPard dla DefaultVideoFrameProcessor.Factory.Builder.build() (#1187).
  • Transformer:
    • Dodaj obejście zgłoszonego wyjątku, ponieważ element MediaMuxer nie obsługuje wykluczonych sygnatur czasowych prezentacji przed interfejsem API 30.
  • Wybór ścieżki:
    • DefaultTrackSelector: wolę ścieżki wideo z „rozsądną” liczbą klatek (>=10 kl./s) niż te z mniejszą lub nieskonfigurowaną liczbą klatek. Dzięki temu odtwarzacz wybiera „prawdziwą” ścieżkę wideo w pliku MP4 wyodrębnionym ze zdjęć ruchomych, które mogą zawierać 2 ścieżki HEVC, z których jedna ma wyższą rozdzielczość, ale bardzo małą liczbę klatek (#1051).
  • Moduły wyodrębniania:
    • Rozwiązano problem, który powodował, że dopełnienie nie było pomijane podczas odczytu fragmentów plików WAV o nietypowych rozmiarach (#1117).
    • MP3: wypełniaj pole Format.averageBitrate z ramek metadanych, takich jak XING i VBRI.
    • MPEG-TS: wycofywanie zmiany, która ma na celu wyrenderowanie ostatniej klatki przez przekazanie ostatniej jednostki dostępu do strumienia do kolejki próbki (#7909). Wynika to z zmiany, która powoduje nowe problemy ze strumieniami HLS typu I-frame tylko ze strumieniami HLS (#1150) i strumieniami HLS H.262 (#1126).
  • Dźwięk:
    • Zezwól na przywracanie mechanizmu renderowania przez wyłączenie obciążenia, jeśli nie uda się zainicjować ścieżki audio w trybie przeładowywania.
  • Film:
    • Dodaj obejście problemu z urządzeniem na urządzeniach Galaxy Tab S7 FE, Chromecast z Google TV i Lenovo M10 FHD Plus, które powoduje, że strumienie H265 z 60 kl./s są oznaczane jako nieobsługiwane
    • Dodaj obejście, które zapewni, że pierwsza klatka będzie zawsze renderowana podczas tunelowania, nawet jeśli urządzenie nie robi tego automatycznie zgodnie z wymaganiami interfejsu API (#1169). (#966).
    • Rozwiązaliśmy problem polegający na tym, że obsługa informacji o kolorach HDR powoduje nieprawidłowe działanie kodeka i uniemożliwia adaptacyjne przełączanie formatu na ścieżkach wideo SDR (#1158).
  • Tekst:
    • WebVTT: zapobiega tworzeniu fałszywych dodatkowych instancji CuesWithTiming bezpośrednio z rzędu WebvttParser.parse(#1177).
  • DRM:
    • Obejście problemu NoSuchMethodError, który może być wywoływany przez platformę MediaDrm zamiast ResourceBusyException lub NotProvisionedException na niektórych urządzeniach z Androidem 14 (#1145).
  • Efekt:
    • Ulepszono mapowanie tonów PQ na SDR dzięki konwertowaniu przestrzeni kolorów.
  • Sesja:
    • Rozwiązaliśmy problem polegający na tym, że bieżąca pozycja cofa się, gdy kontroler zastępuje bieżący element (#951).
    • Rozwiązanie problemu polegającego na tym, że żądanie MediaMetadata z samym wartością inną niż null extras nie jest przesyłane między kontrolerami multimediów a sesjami (#1176).
  • Interfejs:
    • Jeśli Locale nie może rozpoznać wyświetlanej nazwy, dodaj nazwę języka ścieżki audio (#988).
  • Rozszerzenie DASH:
    • Wypełnij wszystkie elementy Label z pliku manifestu w elemencie Format.labels (#1054).
  • Rozszerzenie RTSP:
    • Pomiń puste wartości informacji o sesji (tagi i) podczas analizy SDP (#1087).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • Domyślnie wyłącz rozszerzenie MIDI jako zależność lokalną, ponieważ wymaga ono skonfigurowania dodatkowego repozytorium Maven. Użytkownicy, którzy potrzebują tego modułu w zależności lokalnej, mogą go ponownie włączyć.

Wersja 1.3.0

6 marca 2024 roku

Aplikacja androidx.media3:media3-*:1.3.0 została zwolniona. Wersja 1.3.0 zawiera te zatwierdzenia.

  • Wspólna biblioteka:
    • Zaimplementuj obsługę identyfikatorów URI nieprzetworzonych zasobów android.resource://package/[type/]name, gdzie package różni się od pakietu bieżącej aplikacji. Zawsze było to udokumentowane, ale do tej pory nie udało się tego wprowadzić.
    • Normalizuj typy MIME ustawione przez kod aplikacji lub odczytywane z multimediów, aby zapisywać je w całości małymi literami.
    • Zdefiniuj reklamy, używając w polu AdPlaybackState pełnej wartości MediaItem zamiast pojedynczego Uri.
    • Zwiększ minSdk do 19 (Android KitKat). Jest on spójny ze wszystkimi pozostałymi bibliotekami AndroidaX i jest wymagany do uaktualnienia do najnowszych wersji zależności AndroidX.
    • Jeśli co najmniej 1 z nich nie ma wartości null (#964), wypełnij pola artworkUri i artworkData w polu MediaMetadata.Builder.populate(MediaMetadata).
  • ExoPlayer:
    • Dodaj zasady PreloadMediaSource i PreloadMediaPeriod, które umożliwiają aplikacjom wstępne wczytywanie źródła multimediów z określoną pozycją początkową przed odtworzeniem treści. PreloadMediaSource przygotowuje źródło multimediów do odbioru Timeline, przygotowuje okres do buforowania w danej pozycji początkowej oraz wybiera ścieżki i wczytuje dane multimediów z tego okresu. Aplikacje kontrolują postęp wstępnego wczytywania, implementując PreloadMediaSource.PreloadControl i konfigurując wstępnie wczytane źródło jako odtwarzacz do odtwarzania.
    • Dodaj właściwość ExoPlayer.setImageOutput, która zezwala aplikacjom na ustawienie ImageRenderer.ImageOutput.
    • DefaultRenderersFactory domyślnie udostępnia graczowi ImageRenderer z wartościami null ImageOutput i ImageDecoder.Factory.DEFAULT.
    • emituj zdarzenie Player.Listener.onPositionDiscontinuity, gdy cisza jest pominięta (#765).
    • Dodaj eksperymentalną obsługę analizy napisów podczas wyodrębniania. Możesz to włączyć za pomocą MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • Obsługuj adaptacyjne źródła multimediów za pomocą PreloadMediaSource.
    • Zaimplementuj HttpEngineDataSource (HttpDataSource) za pomocą interfejsu API HttpEngine.
    • Zapobiegaj podklasyfikacji CompositeSequenceableLoader. Ten komponent został wcześniej rozszerzany, ale nigdy nie został dodany do podklasy w bibliotece. Dostosowanie można dostosować, pakując instancję za pomocą wzorca dekoratora i wdrażając niestandardowy parametr CompositeSequenceableLoaderFactory.
    • Rozwiązaliśmy problem polegający na tym, że powtarzanie tej samej godziny powoduje wyczyszczenie metadanych z tego elementu (#1007).
    • Zmień nazwy metod experimentalSetSubtitleParserFactory w BundledChunkExtractor.Factory i DefaultHlsExtractorFactory na setSubtitleParserFactory i nie zezwalaj na przekazywanie null. Użyj nowych metod experimentalParseSubtitlesDuringExtraction(boolean), aby kontrolować analizowanie zachowania.
    • Dodano obsługę dostosowywania elementu SubtitleParser.Factory używanego podczas wyodrębniania. Można to osiągnąć za pomocą funkcji MediaSource.Factory.setSubtitleParserFactory().
    • Dodaj prefiks źródła do wszystkich pól Format.id wygenerowanych z MergingMediaSource. Pomaga to określić, które źródło wygenerowało Format (#883).
    • Popraw wyrażenie regularne używane do weryfikacji nazw kluczy niestandardowych danych klienta Common Media Client Data (CMCD), modyfikując je tak, aby sprawdzały tylko łącznik (#1028).
    • Zatrzymaj podwójne kodowanie parametrów zapytania CMCD (#1075).
  • Transformer:
    • Dodano obsługę spłaszczenia filmów w zwolnionym tempie H.265/HEVC SEF.
    • Zwiększ szybkość transmiksowania, zwłaszcza w przypadku opcji „usuwanie filmu”.
    • Dodaj interfejs API, aby mieć pewność, że plik wyjściowy rozpoczyna się od klatki wideo. Dzięki temu dane wyjściowe operacji przycinania mogą być bardziej zgodne z implementacjami odtwarzacza, które nie pokazują pierwszej klatki filmu aż do sygnatury czasowej prezentacji (#829).
    • Dodaj obsługę optymalizacji operacji przycinania pojedynczego zasobu w formacie MP4.
    • Dodaj obsługę, aby klatka wideo miała w pliku wyjściowym pierwszą sygnaturę czasową. Poprawia pliki wyjściowe rozpoczynające się od czarnej ramki w odtwarzaczach opartych na iOS (#829).
  • Wybór ścieżki:
    • Dodaj DefaultTrackSelector.selectImageTrack, aby włączyć wybór ścieżki obrazu.
    • Dodaj TrackSelectionParameters.isPrioritizeImageOverVideoEnabled, aby określić, czy chcesz wybrać ścieżkę obrazu, jeśli dostępna jest zarówno ścieżka graficzna, jak i wideo. Wartością domyślną jest false, co oznacza, że wybór ścieżki wideo jest priorytetem.
  • Moduły wyodrębniania:
    • Dodaj dodatkową analizę AV1C do wyodrębniania MP4, aby pobrać wartości ColorInfo.colorSpace, ColorInfo.colorTransfer i ColorInfo.colorRange (#692).
    • MP3: użyj wyszukiwania ze stałą szybkością transmisji bitów (CBR) w przypadku plików z nagłówkiem Info (odpowiednik CBR nagłówka Xing). Wcześniej używaliśmy tabeli wyszukiwania z nagłówka Info, ale wyniki wyszukiwania są mniej dokładne niż w przypadku zignorowania jej i założenia, że plik to CBR.
    • MPEG2-TS: dodaj obsługę DTS, DTS-LBR i DTS:X Profile2 (#275).
    • Wyodrębnianie typów audio z deskryptorów zadań i mapowanie ich na flagi ról, co umożliwia użytkownikom podejmowanie bardziej świadomych decyzji dotyczących ścieżek audio (#973).
  • Dźwięk:
    • Ulepsz algorytm pomijania ciszy dzięki płynnej regulacji głośności; zachowana jest minimalna cisza i bardziej naturalny czas ciszy (#7423).
    • Raportuj pominiętą ciszę w bardziej deterministyczny sposób (#1035).
  • Film:
    • Zmień konstruktor MediaCodecVideoRenderer, który przyjmuje argument VideoFrameProcessor.Factory i zastąp go konstruktorem, który przyjmuje argument VideoSinkProvider. Aplikacje, które chcą wstrzykiwać niestandardowy VideoFrameProcessor.Factory, mogą utworzyć instancję CompositingVideoSinkProvider, która korzysta z niestandardowego elementu VideoFrameProcessor.Factory, i przekazać dostawcę ujścia wideo do MediaCodecVideoRenderer.
  • Tekst:
    • Popraw serializację wskazówek bitmapy, aby naprawić błąd Tried to marshall a Parcel that contained Binder objects podczas korzystania z DefaultExtractorsFactory.setTextTrackTranscodingEnabled(#836).
    • CEA-708: ignoruj wartość rowLock. Zgodnie ze specyfikacją CEA-708-E S-2023 obie funkcje rowLock i columnLock powinny być traktowane jako prawdziwe niezależnie od wartości w strumieniu (obsługa parametru columnLock nie jest zaimplementowana, więc w praktyce przyjmuje się, że zawsze ma wartość fałsz).
  • Obraz:
    • Dodano obsługę miniatur DASH. Obrazy siatki są przycinane, a pojedyncze miniatury są wyświetlane ImageOutput w czasie zbliżonym do czasu prezentacji.
  • DRM:
  • Rozszerzenie IMA:
    • Rozwiązanie problemu, który powodował, że nie można było odtwarzać reklam DASH i HLS bez odpowiedniego rozszerzenia pliku.
  • Sesja:
    • Wyłącz wykrywanie dwukrotnego kliknięcia w przypadku aplikacji na telewizory (#962).
    • Rozwiązanie problemu polegającego na tym, że funkcja MediaItem.RequestMetadata z samymi dodatkami niezerowymi nie była przesyłana między kontrolerami multimediów a sesjami.
    • Dodaj do MediaLibrarySession.Builder konstruktor, który wymaga tylko Context zamiast MediaLibraryService.
  • Rozszerzenie HLS:
    • Ogranicz HlsMediaPeriod, aby uzyskać widoczność pakietów. Ten typ nie powinien zależeć od źródła spoza pakietu HLS.
    • Rozwiąż powoduje efektywniejsze rozpoczynanie segmentu (#1031).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • Dekoder MIDI: ignoruj komunikaty o zdarzeniach SysEx (#710).
  • Narzędzia testowe:
    • Nie wstrzymuj odtwarzania w TestPlayerRunHelper.playUntilPosition. Test zachowuje odtwarzanie w stanie odtwarzania, ale zawiesza postęp do czasu, aż będzie w stanie dodać asercje i kolejne działania.
  • Aplikacja w wersji demonstracyjnej:
    • Dodaj krótki moduł demonstracyjny, aby zademonstrować użycie elementu PreloadMediaSource w przypadku użycia krótkich treści.

Wersja 1.3.0-rc01

22 lutego 2024 r.

Używaj wersji stabilnej 1.3.0.

Wersja 1.3.0-beta01

7 lutego 2024 r.

Używaj wersji stabilnej 1.3.0.

Wersja 1.3.0-alfa01

15 stycznia 2024 r.

Używaj wersji stabilnej 1.3.0.

Wersja 1.2.0

Wersja 1.2.1

Styczeń 9, 2024

  • ExoPlayer:
    • Rozwiąż problem polegający na tym, że ręczne wyszukiwanie wykraczające poza zakres LiveConfiguration.min/maxOffset powoduje ponowne dostosowywanie przesunięcia do min/maxOffset.
    • Rozwiązano problem z nieprawidłowym układem kanałów OPUS i VORBIS na 3, 5, 6, 7 i 8 kanałach (#8396).
    • Rozwiązanie problemu polegającego na tym, że wybór utworu po przesunięciu na zero w transmisji na żywo uniemożliwiał nieprawidłowe rozpoczęcie transmisji od pozycji domyślnej (#9347).
    • Rozwiąż problem, który powodował, że nowe wystąpienia parametru CmcdData.Factory otrzymywały wartości ujemne dla parametru bufferedDurationUs ze źródeł fragmentarycznych, czego wynikiem był IllegalArgumentException (#888).
  • Transformer:
    • Obejmij problem, który powoduje wystąpienie błędu przez koder w czasie konfiguracji z powodu ustawienia wysokiej szybkości działania.
  • Moduły wyodrębniania:
    • Oznacz dodatkowe (nieodtwarzane) ścieżki HEVC na zdjęciach ruchomych JPEG jako ROLE_FLAG_ALTERNATE, aby nie były automatycznie wybierane do odtwarzania ze względu na ich wyższą rozdzielczość.
    • Naprawianie nieprawidłowego wykrywania klatek kluczowych w przypadku strumieni TS H264 (#864).
    • Popraw szacowany czas trwania strumieni TS dłuższych niż 47 721 sekund (#855).
  • Dźwięk:
    • Poprawiono obsługę EOS dla elementu SilenceSkippingAudioProcessor przy wielokrotnym wywołaniu (#712).
  • Film:
    • Dodaj obejście problemu z urządzeniem na urządzeniu Galaxy Tab S7 FE, Chromecast z Google TV i Lenovo M10 FHD Plus, które powoduje oznaczenie strumieni AVC 60 kl./s jako nieobsługiwanego (#693).
  • Metadane:
    • Poprawiono błąd, w którym pole MediaMetadata było wypełniane tylko z komentarzy Vorbis wielkimi literami (#876).
    • Przechwytuj OutOfMemoryError podczas analizowania bardzo dużych klatek ID3, co oznacza, że odtwarzanie może być kontynuowane bez informacji o tagu, zamiast zakończyć się niepowodzeniem.
  • DRM:
    • Rozszerz obejście fałszywie adresu URL licencji ClearKey https://default.url do interfejsu API na poziomie 33 lub wyższym (wcześniej było to rozwiązanie stosowane dokładnie tylko w interfejsie API 33) (#837).
    • Naprawa ERROR_DRM_SESSION_NOT_OPENED przy przechodzeniu z zaszyfrowanej treści na usunięcie treści bez platformy z odtwarzaczem. Błąd wynikał z nieprawidłowego użycia bezpiecznego dekodera do odtwarzania wyraźnych treści.
  • Sesja:
    • Umieść niestandardowe klucze i wartości w zakresie MediaMetadataCompat w MediaMetadata.extras, a MediaMetadata.extras do MediaMetadataCompat (#756, #802).
    • Napraw przesyłanie obrazu notifyChildrenChanged w przypadku starszych kontrolerów (#644).
    • Poprawiono błąd polegający na tym, że ustawienie negatywnego czasu wyłączenia licznika czasu powiadomienia setWhen powodowało awarię na niektórych urządzeniach (#903).
    • Napraw błąd IllegalStateException, jeśli kontroler powiadomień o multimediach nie został dokończony w chwili wysłania prośby o pierwszą aktualizację powiadomienia (#917).
  • Interfejs:
    • Rozwiązanie problemu polegającego na tym, że przyciski przewijania do przodu i do tyłu były niewidoczne w przypadku użycia interfejsu Material Design w elemencie bottomSheetDialogFragment (#511).
    • Rozwiąż problem z niewłaściwie wyrównanymi liczbami w przycisku szybkiego przewijania w elemencie PlayerControlView (nr 547).
  • Rozszerzenie DASH:
    • Przeanalizuj „f800” jako liczbę kanałów Dolby wynoszącą 5 w pliku manifestu DASH (#688).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • MIDI: rozwiąż problem, który powoduje, że przewijanie do przodu pomija zdarzenia zmiany programu (#704).
    • Przejdź na FFmpeg 6.0 i zaktualizuj obsługiwany NDK do wersji r26b (#707, #867).
  • Rozszerzenie Cast:
    • Ponownie przeprowadź proces tworzenia obiektu Timeline, aby nie dopuścić do awarii aplikacji w przypadku niepowodzenia wczytywania multimediów na urządzeniu przesyłającym (#708).

Wersja 1.2.0

15 listopada 2023 r.

  • Wspólna biblioteka:
    • Dodaj parametr @Nullable Throwable do metod w interfejsie Log.Logger. Parametr message w tych metodach nie zawiera już żadnych informacji o elementach Throwable przekazywanych do metod Log.{d,i,w,e}(), więc w razie potrzeby implementacje będą musiały dołączać te informacje ręcznie (np. z użyciem Logger.appendThrowableString(String, Throwable)).
    • Rozwiązanie problemu ze zgodnością z Kotlinem, który polegał na tym, że ogólne parametry typu z wartością null i typy elementów tablicy z wartością null nie są wykrywane jako null. Przykładami są parametry metody TrackSelectorResult i SimpleDecoder (#6792).
    • Zmień domyślny interfejs i działanie powiadomień w Util.shouldShowPlayButton, by wyświetlać przycisk odtwarzania, gdy odtwarzanie jest tymczasowo wyłączone (np. z powodu chwilowej utraty ostrości dźwięku). Starszą wersję można zachować, używając instrukcji PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) lub MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
    • Uaktualnij androidx.annotation:annotation-experimental do 1.3.1, by naprawić problem https://issuetracker.google.com/251172715.
    • Przenieś aplikację ExoPlayer.setAudioAttributes do interfejsu Player.
  • ExoPlayer:
    • Rozwiązanie problemów z wyszukiwaniem w strumieniach AC4 spowodowanych nieprawidłowym identyfikacją próbek tylko do dekodowania (#11000).
    • Dodaj blokowanie odtwarzania na nieodpowiednich urządzeniach wyjściowych audio (np. we wbudowanym głośniku w urządzeniach z Wear OS), gdy ta funkcja jest włączona w ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. Przyczyna wstrzymania odtwarzania zostanie zaktualizowana jako Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT, jeśli próba odtwarzania zostanie podjęta, gdy odpowiednie wyjścia audio nie będą dostępne lub jeśli wszystkie odpowiednie wyjścia zostaną odłączone podczas odtwarzania. Przyczyna pominięcia zostanie usunięta po podłączeniu odpowiedniego wyjścia.
    • Dodaj MediaSource.canUpdateMediaItem i MediaSource.updateMediaItem, aby zaakceptować MediaItem aktualizacje po ich utworzeniu w Player.replaceMediaItem(s).
    • Zezwalaj na aktualizacje MediaItem we wszystkich klasach MediaSource udostępnianych przez bibliotekę za pomocą Player.replaceMediaItem(s) (#33, #9978).
    • Zmień nazwę MimeTypes.TEXT_EXOPLAYER_CUES na MimeTypes.APPLICATION_MEDIA3_CUES.
    • Dodaj do TrackOutput plik PngExtractor, który wysyła i odczytuje cały plik PNG, jako jeden przykładowy plik.
    • Ulepsz metodę SequenceableLoader.continueLoading(long) w interfejsie SequenceableLoader do SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo zawiera dodatkowe parametry, m.in. playbackSpeed i lastRebufferRealtimeMs, oprócz obecnego parametru playbackPositionUs.
    • Ulepsz metodę ChunkSource.getNextChunk(long, long, List, ChunkHolder) w interfejsie ChunkSource do ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder).
    • Dodaj do rejestrowania Common Media Client Data (CMCD) dodatkowe pola: brak buforowania (bs), termin (dl), szybkość odtwarzania (pr) i uruchomienie (su) (#8699).
    • Dodaj Luma i głębię kolorów chroma do wartości ColorInfo (#491).
    • Dodaj kolejne pola do rejestrowania CMCD: żądanie następnego obiektu (nor) i żądanie następnego zakresu (nrr) (#8699).
    • Dodaj funkcje umożliwiające przesyłanie danych CMCD za pomocą parametrów zapytania (#553).
    • Napraw ConcurrentModificationException w ExperimentalBandwidthMeter (#612).
    • Dodaj parametr MediaPeriodId do parametru CompositeMediaSource.getMediaTimeForChildMediaTime.
    • Obsługują funkcję ClippingMediaSource (i inne źródła z przesunięciem przedziału czasu i okresu) w elemencie ConcatenatingMediaSource2 (#11226).
    • Zmień BaseRenderer.onStreamChanged(), aby otrzymywał też argument MediaPeriodId.
  • Transformer:
    • Analizuj dane EXIF o obrotach pod kątem zdjęć wejściowych.
    • Usuń typ adnotacji TransformationRequest.HdrMode i powiązane z nim stałe. Użyj zamiast niego parametru Composition.HdrMode i powiązanych z nim stałych.
    • Aby rozwiązać problemy z rotacją, uprość atrybut OverlaySettings.
    • Zmieniono parametry frameRate i durationUs w przypadku SampleConsumer.queueInputBitmap na TimestampIterator.
  • Wybór ścieżki:
    • Dodaj element DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness, aby jednoznacznie zezwolić na nie płynną adaptację lub go zabronić. Domyślnie ustawiona jest wartość true.
  • Moduły wyodrębniania:
    • MPEG-TS: upewnij się, że ostatnia klatka jest renderowana, przekazując ostatnią jednostkę dostępu do strumienia do kolejki próbki (#7909).
    • Popraw literówkę przy określaniu rotationDegrees. Zmieniono projectionPosePitch na projectionPoseRoll (#461).
    • Odejmij założenie, że instancje Extractor można zbadać bezpośrednio za pomocą metody instanceof. Jeśli chcesz mieć dostęp w czasie działania do szczegółów implementacji obiektu Extractor, musisz najpierw wywołać metodę Extractor.getUnderlyingInstance.
    • Dodaj BmpExtractor.
    • Dodaj WebpExtractor.
    • Dodaj HeifExtractor.
    • Dodaj obsługę klasycznej wersji QuickTime do pliku Mp4Extractor.
  • Dźwięk:
    • Dodaj obsługę 24-/32-bitowego typu big-endian PCM w formatach MP4 i Matroska oraz analizuj kodowanie PCM dla lpcm w formacie MP4.
    • Dodano obsługę wyodrębniania dźwięku z Vorbis w formacie MP4.
    • Dodaj atrybut AudioSink.getFormatOffloadSupport(Format), który pobiera poziom odciążenia, który umożliwia ujście dla formatu za pomocą DefaultAudioOffloadSupportProvider. Zwraca nowy AudioOffloadSupport, który zawiera isFormatSupported, isGaplessSupported i isSpeedChangeSupported.
    • Dodaj AudioSink.setOffloadMode(), za pomocą którego skonfigurowana jest konfiguracja odciążania w ujściem audio. Wartość domyślna to AudioSink.OFFLOAD_MODE_DISABLED.
    • Odciążanie można włączyć za pomocą funkcji setAudioOffloadPreference w narzędziu TrackSelectionParameters. Jeśli ustawienie jest włączone, urządzenie będzie obsługiwać odrzucanie formatu, a wybrana ścieżka to pojedyncza ścieżka dźwiękowa.
    • Jeśli audioOffloadModePreference ma wartość AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, DefaultTrackSelector wybierze tylko ścieżkę audio i tylko wtedy, gdy jej format jest obsługiwany w przenoszeniu. Jeśli nie obsługujemy żadnej ścieżki audio, nie zostanie wybrana żadna ścieżka audio.
    • Wyłączenie obsługi braku przerw w odtwarzaniu na poziomie 33 przed interfejsem API z powodu problemu z pozycją odtwarzania po przejściu ścieżki.
    • Usuń parametr enableOffload z podpisu metody DefaultRenderersFactory.buildAudioSink.
    • Usuń metodę DefaultAudioSink.Builder.setOffloadMode.
    • Usuń wartość nieoznaczoną jako DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
    • Dodano obsługę metadanych Opus bez luk w odtwarzaniu.
    • Zezwalaj na przywracanie mechanizmu renderowania przez wyłączenie przeciążenia w przypadku niepowodzenia przy pierwszym zapisie (#627).
    • W przypadku odtwarzania z wyłączonym dźwiękiem włącz domyślnie harmonogram odciążania.
    • Usuń ExoPlayer.experimentalSetOffloadSchedulingEnabled i AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • Zmieniono nazwę onExperimentalSleepingForOffloadChanged na onSleepingForOffloadChanged, a onExperimentalOffloadedPlayback na onOffloadedPlayback.
    • Przenieś interfejsy i definicje związane z trybem odciążania dźwięku TrackSelectionParameters do wewnętrznej klasy AudioOffloadPreferences.
    • Dodaj wywołania zwrotne (onAudioTrackInitialized i onAudioTrackReleased) do metod AnalyticsListener, AudioRendererEventListener i AudioSink.Listener.
    • Rozwiązano problem z niedostatecznym przepływem danych w buforze audio DTS Express (#650).
    • Naprawa błędu, który powodował, że kontrola możliwości E-AC3-JOC powoduje błąd IllegalArgumentException(#677).
  • Film:
    • Zezwól przeglądarce MediaCodecVideoRenderer na używanie niestandardowego elementu VideoFrameProcessor.Factory.
    • Naprawa błędu polegającego na tym, że nie można było wyrenderować pierwszej klatki, gdy strumień audio rozpoczyna się od ujemnych sygnatur czasowych (#291).
  • Tekst:
    • Usuń ExoplayerCuesDecoder. Ścieżki tekstowe z atrybutem sampleMimeType = application/x-media3-cues są teraz obsługiwane bezpośrednio przez usługę TextRenderer bez konieczności użycia instancji SubtitleDecoder.
  • Metadane:
    • Funkcja MetadataDecoder.decode nie będzie już wywoływana w przypadku przykładów „tylko do dekodowania”, ponieważ implementacja i tak musi zwracać wartość null.
  • Efekt:
    • Dodaj dane wejściowe bitmapy VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>) według sygnatury czasowej.
    • Zmień VideoFrameProcessor.registerInputStream() na nieblokujący. Aplikacje muszą implementować VideoFrameProcessor.Listener#onInputStreamRegistered().
    • Zmieniono parametry frameRate i durationUs w przypadku VideoFrameProcessor.queueInputBitmap na TimestampIterator.
  • Rozszerzenie IMA:
    • Poprawka błędu, który powodował, że transmisja na żywo DASH z wieloma przedziałami czasu, która nie jest pierwszym elementem playlisty, może zgłaszać wyjątek (#571).
    • Zwolnij StreamManagera, zanim zadzwonisz do: AdsLoader.destroy()
    • Uaktualnij pakiet IMA SDK do wersji 3.31.0.
  • Sesja:
    • Ustaw działanie usługi powiadomień na pierwszym planie na FOREGROUND_SERVICE_IMMEDIATE w: DefaultMediaNotificationProvider (#167).
    • Używaj tylko interfejsu android.media.session.MediaSession.setMediaButtonBroadcastReceiver() powyżej interfejsu API 31, aby uniknąć problemów z wycofanym interfejsem API na urządzeniach Samsung (nr 167).
    • Używaj kontrolera powiadomień o multimediach jako serwera proxy, aby ustawiać dostępne polecenia i niestandardowy układ służący do wypełniania powiadomienia i sesji na platformie.
    • Konwertuj zdarzenia przycisku multimediów odbierane przez usługę MediaSessionService.onStartCommand() w Media3, zamiast przekierowywać je do sesji na platformie i z powrotem do Media3. Dzięki temu element wywołujący jest zawsze kontrolerem powiadomień multimedialnych, a aplikacje mogą łatwo rozpoznawać wywołania pochodzące z powiadomień w taki sam sposób na wszystkich obsługiwanych poziomach API.
    • Napraw błąd, który sprawia, że interfejs MediaController.getCurrentPosition() nie jest awansowany po połączeniu ze starszą wersją systemu MediaSessionCompat.
    • Dla wygody dodaj: MediaLibrarySession.getSubscribedControllers(mediaId).
    • Zastąp MediaLibrarySession.Callback.onSubscribe(), aby potwierdzić dostępność identyfikatora nadrzędnego, który subskrybuje kontroler. Jeśli subskrypcja się powiedzie, subskrypcja zostanie zaakceptowana i notifyChildrenChanged()zostanie natychmiast wywołana w celu przekazania informacji do przeglądarki (#561).
    • Dodaj moduł demonstracyjny sesji dla systemu operacyjnego Automotive i włącz demonstrację sesji w Androidzie Auto.
    • Nie ustawiaj kolejki sesji platformy, gdy kontroler powiadomień o multimediach nie ma dostępu do COMMAND_GET_TIMELINE. Gdy Android Auto jako kontroler klienta odczytuje dane z sesji platformy, przycisk queue w interfejsie Androida Auto nie jest wyświetlany (nr 339).
    • Zamiast SimpleBitmapLoader używaj domyślnie pola DataSourceBitmapLoader (#271, #327).
    • Dodaj MediaSession.Callback.onMediaButtonEvent(Intent), który pozwoli aplikacjom na zastępowanie domyślnej obsługi zdarzeń przycisku multimediów.
  • Interfejs:
    • Dodaj implementację Player.Listener na urządzeniach z Wear OS, które obsługują blokowanie odtwarzania z powodu Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT.W tym celu uruchom okno systemowe, aby umożliwić użytkownikowi podłączenie odpowiedniego wyjścia audio (np. słuchawek Bluetooth). Detektor automatycznie wznowi odtwarzanie, jeśli odpowiednie urządzenie zostanie podłączone w konfigurowanym czasie oczekiwania (domyślnie wynosi 5 minut).
  • Pobrane pliki:
    • Zadeklaruj typ usługi na pierwszym planie typu „synchronizacja danych” na potrzeby DownloadService, aby zapewnić zgodność z Androidem 14. Podczas korzystania z tej usługi aplikacja musi też dodać dataSync jako foregroundServiceType w pliku manifestu oraz dodać uprawnienie FOREGROUND_SERVICE_DATA_SYNC (#11239).
  • Rozszerzenie HLS:
    • Odśwież playlistę na żywo HLS, podając odstęp obliczony na podstawie czasu rozpoczęcia ostatniego wczytywania, a nie czasu ostatniego wczytywania (#663).
  • Rozszerzenie DASH:
    • Zezwalaj na używanie wielu takich samych identyfikatorów DASH w adresie URL szablonu segmentu.
    • Dodaj eksperymentalną obsługę analizy napisów podczas wyodrębniania. Lepsza obsługa scalania nakładających się napisów, w tym rozwiązanie migotania podczas przechodzenia między segmentami napisów. Aby to zrobić, użyj parametru DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • Rozszerzenie RTSP:
    • Napraw warunek wyścigu, który może powodować występowanie błędu IndexOutOfBoundsException przy powrocie do TCP lub zawieszanie odtwarzania w niektórych sytuacjach.
    • Sprawdź stan w konfiguracji RTSP po zwróceniu stanu wczytywania RtspMediaPeriod (#577).
    • Ignoruj niestandardowe metody żądań Rtsp w nagłówku publicznym odpowiedzi w opcjach (#613).
    • Używaj wartości limitu czasu na konfigurację protokołu RTSP w przedziale czasu wysyłania żądań dotyczących opcji utrzymywania aktywności RTSP (#662).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • Opublikuj moduł dekodera MIDI, który obsługuje odtwarzanie standardowych plików MIDI przy użyciu biblioteki Jsyn do syntezy dźwięku.
    • Dodaj DecoderOutputBuffer.shouldBeSkipped, aby bezpośrednio oznaczyć bufory danych wyjściowych, których nie trzeba prezentować. Jest to preferowane rozwiązanie do zasobów C.BUFFER_FLAG_DECODE_ONLY, które zostaną wycofane.
    • Dodaj Decoder.setOutputStartTimeUs i SimpleDecoder.isAtLeastOutputStartTimeUs, aby umożliwić dekoderom pomijanie próbek tylko do dekodowania przed czasem rozpoczęcia. Używaj go zamiast właściwości Buffer.isDecodeOnly, które zostaną wycofane.
    • Naprawiono błąd publikowania artefaktu dekodera MIDI w repozytorium Maven. Nazwa artefaktu to media3-exoplayer-midi (#734).
  • Rozszerzenie BeyondCorp:
    • Napraw błąd, który powodował, że wyłączenie platformy mogło spowodować pojawienie się błędu ArithmeticException w kodzie Leanback (#617).
  • Narzędzia testowe:
    • Zadbaj o zgodność TestExoPlayerBuilder i FakeClock z testami interfejsu Espresso i testami interfejsu Compose. Naprawiliśmy błąd polegający na tym, że odtwarzanie przesuwa się niedeterminalnie podczas interakcji z widokiem Espresso lub Compose.
  • Usuń wycofane symbole:
    • Usuń TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean) i TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). Użyj Composition.Builder.setHdrMode(int) i przekaż Composition zamiast tego do Transformer.start(Composition, String).
    • Usuń wycofaną metodę DownloadNotificationHelper.buildProgressNotification. Użyj niewycofywanej metody, która przyjmuje parametr notMetRequirements.

Wersja 1.2.0-rc01

1 listopada 2023 roku

Używaj wersji stabilnej 1.2.0.

Wersja 1.2.0-beta01

19 października 2023 r.

Używaj wersji stabilnej 1.2.0.

Wersja 1.2.0-alfa02

29 września 2023 r.

Używaj wersji stabilnej 1.2.0.

Wersja 1.2.0-alfa01

17 sierpnia 2023 r.

Używaj wersji stabilnej 1.2.0.

Wersja 1.1.0

Wersja 1.1.1

16 sierpnia 2023 r.

  • Wspólna biblioteka:
    • Usuń przypadkowo dodaną zależność multidex ze wszystkich modułów (#499).
  • ExoPlayer:
    • Naprawiono błąd w elemencie PlaybackStatsListener, który powodował, że po wyczyszczeniu playlisty tworzone są fałszywe PlaybackStats.
    • Dodaj do rejestrowania Common Media Client Data (CMCD) dodatkowe pola: format strumieniowania (sf), typ strumienia (st), wersja (v), górny szybkość transmisji bitów (tb), czas trwania obiektu (d), zmierzoną przepustowość (mtp) i typ obiektu (#8699).
  • Dźwięk:
    • Poprawiono błąd, który powodował, że usługa Player.getState() nigdy nie była uaktualniana do STATE_ENDED podczas odtwarzania bardzo krótkich plików (#538).
  • Obciążenie dźwiękiem:
    • Dołącz strony nagłówka identyfikatora Ogg na początku i nagłówki komentarzy do strumienia bitów, aby zmniejszyć obciążenie odtwarzania Opus zgodnie ze standardem RFC 7845.
  • Film:
    • H.265/HEVC: naprawiono analizowanie krótko- i długoterminowych informacji referencyjnych dotyczących obrazów w SPS.
  • Tekst:
    • CEA-608: zmień zasady obcinania wskazówek tak, by uwzględniały tylko widoczny tekst. Dotychczasowe wcięcie i przesunięcie tabulatora były uwzględniane przy ograniczaniu długości wstawienia do 32 znaków (co było technicznie poprawne w specyfikacji) (#11019).
  • Rozszerzenie IMA:
    • Uaktualnij pakiet IMA SDK do wersji 3.30.3.
  • Sesja:
    • Dodaj układ niestandardowy do stanu kontrolera i udostępnij obiekt pobierający, który zapewnia do niego dostęp. W przypadku zmiany układu niestandardowego wywoływana jest właściwość MediaController.Listener.onCustomLayoutChanged. Aplikacje, które chcą wysyłać różne układy niestandardowe do różnych kontrolerów Media3, mogą to zrobić w MediaSession.Callback.onConnect za pomocą AcceptedResultBuilder, aby mieć pewność, że po zakończeniu połączenia ten układ będzie dostępny dla kontrolera.
    • Naprawiono przypadki, w których MediaLibraryServiceLegacyStub wysyłał błąd do interfejsu Result, który nie obsługiwał tej czynności, co spowodowało błąd UnsupportedOperationException(78).
    • Rozwiąż problem ze sposobem, w jaki PlayerWrapper tworzy VolumeProviderCompat, wskazując typ volumeControlType za pomocą zarówno starszych poleceń (COMMAND_ADJUST_DEVICE_VOLUME i COMMAND_SET_DEVICE_VOLUME), jak i nowych poleceń (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS i COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554).

Wersja 1.1.0

5 lipca 2023 r.

  • Wspólna biblioteka:
    • Dodaj przyczynę pominięć w przypadku nieodpowiedniej trasy audio i odtwarzaj w przypadku gotowej zmiany jako przyczyna zbyt długiego wstrzymania odtwarzania. (#15).
    • Dodaj polecenia do odtwarzacza:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Dodaj do odtwarzacza przeciążone metody, które pozwalają użytkownikom określać flagi głośności:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Dodaj element Builder do elementu DeviceInfo i wycofaj istniejący konstruktor.
    • Dodaj DeviceInfo.routingControllerId, aby określić identyfikator kontrolera routingu na potrzeby odtwarzania zdalnego.
    • Dodaj Player.replaceMediaItem(s) jako skrót do dodawania i usuwania elementów na tej samej pozycji (#8046).
  • ExoPlayer:
    • Zezwól ExoPlayer na sterowanie metodami głośności urządzenia tylko po uzyskaniu wyraźnej zgody. ExoPlayer.Builder.setDeviceVolumeControlEnabled umożliwia dostęp do:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int)setDeviceVolume(int, int)
      • increaseDeviceVolume(int)increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int)decreaseDeviceVolume(int, int)
    • Dodaj atrybut FilteringMediaSource, który pozwoli filtrować dostępne typy ścieżek z tabeli MediaSource.
    • Dodano obsługę uwzględniania danych klienta Common Media Client Data (CMCD) w żądaniach wychodzących adaptacyjnych formatów strumieniowania DASH, HLS i SmoothStream. Te pola br, bl, cid, rtp i sid zostały uwzględnione (#8699). Struktura interfejsów API i metody API:
      • Logowanie CMCD jest domyślnie wyłączone. Aby je włączyć, użyj MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory).
      • Wszystkie klucze są domyślnie włączone. Zastąp CmcdConfiguration.RequestConfig.isKeyAllowed(String key), aby odfiltrować zarejestrowane klucze.
      • Zastąp CmcdConfiguration.RequestConfig.getCustomData(), aby włączyć logowanie niestandardowych kluczy.
    • Dodaj do pliku manifestu głównej wersji demonstracyjnej dodatkowe działanie, aby ułatwić uruchamianie aplikacji demonstracyjnej z użyciem niestandardowego pliku *.exolist.json (#439).
    • Dodaj ExoPlayer.setVideoEffects() za użycie Effect podczas odtwarzania filmu.
    • Zaktualizuj SampleQueue, aby przechowywać sourceId jako long, a nie int. Spowoduje to zmianę podpisów metod publicznych SampleQueue.sourceId i SampleQueue.peekSourceId.
    • Dodaj do metod LoadControl shouldStartPlayback i onTracksSelected parametry, które pozwolą powiązać te metody z odpowiednimi właściwościami MediaPeriod.
    • Zmień podpis obiektu ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>), dodając parametr osi czasu zawierający okresy z identyfikatorami UID używanymi jako klucze na mapie. Jest to wymagane, aby uniknąć problemów z równoczesnością transmisji na żywo obejmujących kilka okresów.
    • Wycofaj EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) i BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). Zamiast tego można wywołać wariant metod bez parametru mediaTimeOffsetUs. Pamiętaj, że nawet w przypadku wycofanych wersji przesunięcie nie będzie już dodawane do wartości startTimeUs i endTimeUs obiektów MediaLoadData wysyłanych przez dyspozytora.
    • Zmień nazwę ExoTrackSelection.blacklist na excludeTrack i isBlacklisted na isTrackExcluded.
    • Rozwiąż problem z niespójnością działania funkcji ExoPlayer.setMediaItem(s) i addMediaItem(s) w przypadku wywołania pustej playlisty.
  • Transformer:
    • Usuń Transformer.Builder.setMediaSourceFactory(MediaSource.Factory). Zamiast nich użyj ExoPlayerAssetLoader.Factory(MediaSource.Factory) i Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory).
    • Usuń Transformer.startTransformation(MediaItem, ParcelFileDescriptor).
    • Naprawa błędu, który uniemożliwiał transformację (co prowadziło do przekroczenia limitu czasu miksera), jeśli sygnalizowany był koniec strumienia wideo w momencie, gdy klatka wejściowa oczekiwała na przetworzenie.
    • Aby zwiększyć obsługę, wysyłaj zapytania o kodeki za pomocą MediaCodecList zamiast korzystać z narzędzi findDecoder/EncoderForFormat.
    • Usuń konfigurację klatki B z DefaultEncoderFactory, ponieważ nie działa na niektórych urządzeniach.
  • Wybór ścieżki:
    • Dodaj element DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange, który jest domyślnie wyłączony. Gdy ta opcja jest włączona, DefaultTrackSelector aktywuje nowy wybór ścieżki w przypadku zmiany możliwości mechanizmu renderowania.
  • Moduły wyodrębniania:
    • Ogg: napraw błąd podczas wyszukiwania plików o długim czasie trwania (#391).
    • FMP4: rozwiązanie problemu polegającego na tym, że TimestampAdjuster inicjuje nieprawidłowe przesunięcie sygnatury czasowej z czasem próbkowania metadanych z emsg atom (#356).
  • Dźwięk:
    • Naprawa błędu, który powodował, że niektóre odtworzenia kończyły się niepowodzeniem, gdy włączone jest tunelowanie, a plik AudioProcessors jest aktywny (np. w przypadku przycinania bez przerw (#10847).
    • Herbaty Opus w pakietach Ogg w ramach odtwarzania bezpośredniego (przeciążenia).
    • Dzięki harmonogramowi przeciążenia możesz oszacować bieżącą pozycję podczas snu.
    • Dodaj Renderer.release() i AudioSink.release(), aby zwolnić zasoby na koniec cyklu życia gracza.
    • Słuchaj zmian w funkcjach audio w aplikacji DefaultAudioSink. Dodaj w konstruktorze elementu DefaultAudioSink wymagany parametr context, za pomocą którego DefaultAudioSink zarejestruje się jako odbiornik AudioCapabilitiesReceiver i zaktualizuje swoją właściwość audioCapabilities, gdy pojawi się informacja o zmianie możliwości.
    • Promuj zmiany możliwości audio za pomocą nowego zdarzenia onAudioCapabilitiesChanged w interfejsie AudioSink.Listener i nowego interfejsu RendererCapabilities.Listener, który uruchamia zdarzenia onRendererCapabilitiesChanged.
    • Dodaj ChannelMixingAudioProcessor, aby zastosować skalowanie/miksowanie do kanałów audio.
    • Dodaj nową wartość int DISCARD_REASON_AUDIO_BYPASS_POSSIBLE do DecoderDiscardReasons, aby odrzucić dekoder dźwięku, gdy po zmianie możliwości audio możliwe jest korzystanie z trybu omijania.
    • Dodano obsługę odtwarzania bezpośredniego w przypadku DTS Express i DTS:X (#335).
  • Film:
    • Ustaw w MediaCodecVideoRenderer raportowanie VideoSize o szerokości i wysokości 0, gdy mechanizm renderowania jest wyłączony. Po zmianie elementu Player.getVideoSize() parametr Player.Listener.onVideoSizeChanged jest odpowiednio wywoływany. Po tej zmianie rozmiar filmu w systemie ExoPlayer (MediaCodecVideoRenderer) będzie miał szerokość i wysokość 0, jeśli system Player.getCurrentTracks nie obsługuje wideo lub rozmiar obsługiwanej ścieżki wideo nie został jeszcze określony.
  • DRM:
    • Ogranicz widoczność kilku metod używanych tylko do użytku wewnętrznego w DefaultDrmSession, które nie powinny być wywoływane spoza pakietu DRM:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer:
    • Dodaj nową bibliotekę Muxer, której można używać do tworzenia pliku kontenera MP4.
  • Rozszerzenie IMA:
    • Włącz transmisje DASH na żywo z wielu okresów na potrzeby DAI. Pamiętaj, że obecna implementacja nie obsługuje jeszcze przewijania w transmisjach na żywo (#10912).
    • Popraw błąd polegający na wstawieniu w transmisjach na żywo nowej grupy reklam, ponieważ obliczona pozycja treści na kolejnych osiach czasu nieco się różni.
  • Sesja:
    • Dodaj metodę pomocniczą MediaSession.getControllerForCurrentRequest, aby uzyskać informacje o kontrolerze, który obecnie wywołuje metodę Player.
    • Dodaj androidx.media3.session.MediaButtonReceiver, aby umożliwić w aplikacjach implementowanie wznawiania odtwarzania za pomocą zdarzeń przycisku multimediów wysyłanych np. przez zestaw słuchawkowy Bluetooth (#167).
    • Dodaj domyślną implementację do elementu MediaSession.Callback.onAddMediaItems, aby umożliwić przekazywanie żądanej wartości MediaItems do elementu Player, jeśli zawiera on tag LocalConfiguration (np. identyfikator URI) (#282).
    • Domyślnie w Androidzie 12 i starszych wersjach z Androidem 12 i starszymi przyciskami poleceń „przewiń do poprzedniego” i „przewiń do następnego” w kompaktowym widoku powiadomień o multimediach są one domyślnie dodawane.
    • Dodaj domyślną implementację do elementu MediaSession.Callback.onAddMediaItems, aby umożliwić przekazywanie żądanej wartości MediaItems do elementu Player, jeśli zawiera on tag LocalConfiguration (np. identyfikator URI) (#282).
    • Domyślnie w Androidzie 12 i starszych wersjach z Androidem 12 i starszymi przyciskami poleceń „przewiń do poprzedniego” i „przewiń do następnego” w kompaktowym widoku powiadomień o multimediach są one domyślnie dodawane.
  • Interfejs:
    • Dodaj metody używane shouldShowPlayButton i handlePlayPauseButtonAction, aby pisać niestandardowe elementy interfejsu za pomocą przycisku odtwarzania/wstrzymywania.
  • Rozszerzenie RTSP:
    • W przypadku MPEG4-LATM użyj domyślnej wartości identyfikatora na poziomie profilu, jeśli jej nie ma w wiadomości SDP opisu odpowiedzi (#302).
    • Używaj podstawowego identyfikatora URI do względnego rozpoznawania ścieżek z sesji RTSP, jeśli znajduje się w nagłówku odpowiedzi DESCRIBE (#11160).
  • Rozszerzenie DASH:
    • Usuń przesunięcie czasu odtwarzania multimediów z MediaLoadData.startTimeMs i MediaLoadData.endTimeMs w przypadku wielookresowych transmisji DASH.
    • Naprawiliśmy błąd, który powodował, że ponowne przygotowywanie źródła multimediów Dashi w internecie z wieloma przedziałami czasu spowodowało wygenerowanie parametru IndexOutOfBoundsException (#10838).
  • Rozszerzenie HLS:
    • Dodaj HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long), aby ustawić czas oczekiwania wątku wczytywania na zainicjowanie TimestampAdjuster. Jeśli inicjowanie nie zakończy się przed upływem limitu czasu oczekiwania, zostanie zgłoszony PlaybackException, aby uniknąć nieskończonego wstrzymania odtwarzania. Limit czasu jest domyślnie ustawiony na zero (#323).
  • Narzędzia testowe:
    • Sprawdź niewrażliwość wielkości liter w schemacie URI w pliku DataSourceContractTest.
  • Usuń wycofane symbole:
    • Usuń konstruktory DefaultAudioSink, użyj zamiast tego elementu DefaultAudioSink.Builder.
    • Usuń typ HlsMasterPlaylist, zamiast tego użyj elementu HlsMultivariantPlaylist.
    • Usuń Player.stop(boolean). Użyj zamiast niej Player.stop() i Player.clearMediaItems() (jeśli reset to true).
    • Usuń 2 wycofane konstruktory SimpleCache. Użyj niewycofanego konstruktora, który zamiast tego używa konstruktora DatabaseProvider, aby zwiększyć wydajność.
    • Usuń konstruktor DefaultBandwidthMeter, zamiast tego użyj DefaultBandwidthMeter.Builder.
    • Usuń konstruktory DefaultDrmSessionManager, zamiast tego użyj DefaultDrmSessionManager.Builder.
    • Usuń 2 wycofane konstruktory HttpDataSource.InvalidResponseCodeException. Użyj niewycofanego konstruktora, który akceptuje dodatkowe pola(cause, responseBody), aby usprawnić logowanie błędów.
    • Usuń zasady DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDash i DownloadHelper.forSmoothStreaming, a zamiast nich użyj elementu DownloadHelper.forMediaItem.
    • Usuń wycofany konstruktor DownloadService, użyj niewycofanego konstruktora, który zawiera opcję podawania parametru channelDescriptionResourceId.
    • Usuń wycofane stałe ciągi znaków dla zestawów znaków (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAME i UTF16LE_NAME). Użyj zamiast nich Kotlin Charsets z pakietu kotlin.text, java.nio.charset.StandardCharsets lub com.google.common.base.Charsets.
    • Usuń wycofany konstruktor WorkManagerScheduler. Użyj niewycofanego konstruktora, który zawiera opcję podania parametru Context.
    • Usuń wycofane metody createVideoSampleFormat, createAudioSampleFormat, createContainerFormat i createSampleFormat, które były używane do utworzenia instancji klasy Format. Do tworzenia instancji Format zamiast tego użyj polecenia Format.Builder.
    • Usuń wycofane metody copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata,copyWithBitrate i copyWithVideoSize. Użyj zamiast tego metod Format.buildUpon() i setter.
    • Usuń wycofaną zasadę ExoPlayer.retry(). Zamiast niej użyj parametru prepare().
    • Usuń wycofany konstruktor DefaultTrackSelector z zerowym argumentem, a zamiast niego użyj DefaultTrackSelector(Context).
    • Usuń wycofany konstruktor OfflineLicenseHelper, użyj zamiast niego OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Usuń wycofany konstruktor DownloadManager. Użyj konstruktora, który przyjmuje Executor.
    • Usuń wycofane konstruktory Cue. Zamiast nich użyj Cue.Builder.
    • Usuń wycofany konstruktor OfflineLicenseHelper, użyj zamiast niego OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Usuń 4 wycofane metody AnalyticsListener:
      • onDecoderEnabled użyj zamiast niego onAudioEnabled lub onVideoEnabled.
      • onDecoderInitialized, użyj zamiast niego onAudioDecoderInitialized lub onVideoDecoderInitialized.
      • onDecoderInputFormatChanged, użyj zamiast niego onAudioInputFormatChanged lub onVideoInputFormatChanged.
      • onDecoderDisabled użyj zamiast niego onAudioDisabled lub onVideoDisabled.
    • Usuń wycofane funkcje Player.Listener.onSeekProcessed i AnalyticsListener.onSeekProcessed. Zamiast nich użyj właściwości onPositionDiscontinuity z parametrem DISCONTINUITY_REASON_SEEK.
    • Usuń regułę ExoPlayer.setHandleWakeLock(boolean), użyj zamiast niej elementu setWakeMode(int).
    • Usuń wycofywaną właściwość DefaultLoadControl.Builder.createDefaultLoadControl(), użyj w zamian parametru build().
    • Usuń wycofaną zasadę MediaItem.PlaybackProperties. Zamiast niej użyj parametru MediaItem.LocalConfiguration. Wycofane pole MediaItem.playbackProperties jest teraz typu MediaItem.LocalConfiguration.

Wersja 1.1.0-rc01

21 czerwca 2023 r.

Używaj wersji stabilnej 1.1.0.

Wersja 1.1.0-beta01

7 czerwca 2023 r.

Używaj wersji stabilnej 1.1.0.

Wersja 1.1.0-alfa01

10 maja 2023 r.

Używaj wersji stabilnej 1.1.0.

Wersja 1.0.0

Wersja 1.0.2

18 maja 2023 r.

Aplikacja androidx.media3:media3-*:1.0.2 została zwolniona. Wersja 1.0.2 zawiera te zatwierdzenia.

Ta wersja jest powiązana z wersją ExoPlayer 2.18.7.

Ta wersja zawiera następujące zmiany od wersji 1.0.1:

  • Biblioteka główna:
    • Dodaj atrybut Buffer.isLastSample(), który wskazuje, czy element Buffer zawiera flagę C.BUFFER_FLAG_LAST_SAMPLE.
    • Rozwiązanie problemu polegającego na tym, że ostatnia klatka mogła nie zostać wyrenderowana, jeśli ostatnia próbka z ramkami została usunięta z kolejki bez odczytania próbki z końca strumienia. (#11079).
  • Moduły wyodrębniania:
    • Naprawa analizowania składni H.265 SPS w plikach MPEG-TS, ponownie wykorzystując logikę analizy używaną już przez moduły wyodrębniania RTSP i MP4 (#303).
  • Tekst:
    • SSA: dodaj obsługę plików UTF-16, jeśli zaczynają się od znaku kolejności bajtów (#319).
  • Sesja:
    • Rozwiązanie problemu polegającego na tym, że MediaController nie aktualizuje dostępnych poleceń po połączeniu ze starszą wersją systemu MediaSessionCompat, która aktualizuje swoje działania.
    • Popraw błąd, który uniemożliwiał usłudze MediaLibraryService zwracanie wartości null w przypadku wywołania interfejsu systemowego Callback.onGetLibraryRoot z opisem params.isRecent == true w interfejsie API 30 (#355).
    • Napraw wyciek pamięci w systemie MediaSessionService lub MediaLibraryService (#346).
    • Napraw błąd, w wyniku którego połączenie Timeline i aktualizacji pozycji w funkcji MediaSession mogło powodować, że MediaController zwrócił(a) IllegalStateException.

Wersja 1.0.1

18 kwietnia 2023 r.

Aplikacja androidx.media3:media3-*:1.0.1 została zwolniona. Wersja 1.0.1 zawiera te zatwierdzenia.

Ta wersja odpowiada wersji ExoPlayer 2.18.6.

  • Biblioteka główna:
    • Przy przewijaniu do pozycji domyślnej resetujesz zastąpienie docelowej transmisji na żywo (#11051).
    • Naprawiono błąd polegający na tym, że puste strumienie próbek w multimediach mogły powodować zatrzymanie odtwarzania.
  • Sesja:
    • Poprawiono błąd, który powodował, że wiele identycznych elementów kolejki opublikowanych przez starszą wersję MediaSessionCompat spowodowało wyjątek w regule MediaController (#290).
    • Dodaj brakujące przekierowanie MediaSession.broadcastCustomCommand do starszej wersji MediaControllerCompat.Callback.onSessionEvent (#293).
    • Naprawiono błąd, który powodował, że wywołanie metody MediaSession.setPlayer nie aktualizuje dostępnych poleceń.
    • Rozwiązanie problemu polegającego na tym, że TrackSelectionOverride instancje wysłane z elementu MediaController są ignorowane, jeśli odwołują się do grupy z identyfikatorem Format.metadata (#296).
    • Rozwiąż problem, który powodował, że aby uzyskać dostęp do metadanych za pomocą starszej wersji MediaSessionCompat, musisz mieć dostęp do Player.COMMAND_GET_CURRENT_MEDIA_ITEM.
    • Rozwiązano problem, który powodował, że wystąpienia MediaSession w wątku w tle powodowały awarie, gdy jest używana w zasadzie MediaSessionService (#318).
    • Rozwiązaliśmy problem polegający na tym, że odbiornik przycisku multimediów był zadeklarowany przez bibliotekę, ale aplikacja tego nie zadeklarowała (#314).
  • DASH:
    • Napraw obsługę pustych osi czasu segmentów (#11014).
  • RTSP:
    • Spróbuj użyć protokołu TCP, jeśli konfiguracja protokołu RTSP z UDP nie powiedzie się i wystąpi błąd RTSP 461 supportedTransport (#11069).

Wersja 1.0.0

22 marca 2023 r.

Aplikacja androidx.media3:media3-*:1.0.0 została zwolniona. Wersja 1.0.0 zawiera te zatwierdzenia.

Ta wersja jest powiązana z wersją ExoPlayer 2.18.5.

Nie wprowadzono żadnych zmian od wersji 1.0.0-rc02.

Wersja 1.0.0-rc02

2 marca 2023 r.

Aplikacja androidx.media3:media3-*:1.0.0-rc02 została zwolniona. Wersja 1.0.0-rc02 zawiera te zatwierdzenia.

Ta wersja odpowiada wersji ExoPlayer 2.18.4.

  • Biblioteka główna:
    • Napraw wykrywanie typu sieci w interfejsie API 33 (#10970).
    • Napraw błąd NullPointerException podczas nawiązywania połączenia z usługą ExoPlayer.isTunnelingEnabled (#10977).
  • Pobrane pliki:
    • Zadbaj o to, aby maksymalna różnica czasu rozpoczęcia 2 segmentów była możliwa do skonfigurowania w klasach SegmentDownloader i podklasach (#248).
  • Dźwięk:
    • Naprawa uszkodzonego odtwarzania MP3 bez przerw na urządzeniach Samsung (#8594).
    • Naprawiono błąd, przez który prędkości odtwarzania ustawione bezpośrednio po wyłączeniu dźwięku mogły zostać zastąpione przez poprzednią zmianę szybkości (#10882).
  • Film:
    • Zmapuj format HEVC HDR10 na HEVCProfileMain10HDR10 zamiast HEVCProfileMain10.
    • Dodaj obejście problemu z urządzeniem Chromecast z Google TV i Lenovo M10 FHD Plus, które powoduje oznaczenie strumieni AVC 60 kl./s jako nieobsługiwanego (#10898).
    • Napraw problemy z wydajnością wyświetlania klatek podczas odtwarzania multimediów z liczbą klatek znacznie większą niż częstotliwość odświeżania ekranu.
  • Obsada:
    • Popraw tymczasowy STATE_IDLE podczas przechodzenia między elementami multimedialnymi (#245).
  • RTSP:
    • Przechwytuje wyjątek IllegalArgumentException zgłoszony podczas analizowania nieprawidłowych wiadomości z opisu odpowiedzi RTSP (#10971).
  • Sesja:
    • Poprawiono błąd, który powodował, że przycisk odtwarzania/wstrzymywania powiadomień nie aktualizował się na podstawie stanu odtwarzacza (#192).
  • Rozszerzenie IMA:
    • Naprawiliśmy błąd, który uniemożliwiał strumieniowanie z dynamicznym wstawianiem reklam bez reklam, ponieważ pierwsze zdarzenie LOADED (i w przypadku pozostałych reklam) nie zostało odebrane.

Wersja 1.0.0-rc01

16 lutego 2023 r.

Aplikacja androidx.media3:media3-*:1.0.0-rc01 została zwolniona. Wersja 1.0.0-rc01 zawiera te zatwierdzenia.

Ta wersja jest powiązana z wersją ExoPlayer 2.18.3.

  • Biblioteka główna:
    • Zmodyfikuj logikę kolejności dekodera w mechanizmie renderowania, aby zachować preferencje MediaCodecSelector, nawet jeśli dekoder zgłosi, że może nie być w stanie odtworzyć multimediów z wydajnością. Na przykład w przypadku selektora domyślnego dekoder sprzętowy z tylko funkcjonalną obsługą będzie preferowany od dekodera programowego, który w pełni obsługuje ten format (#10604).
    • Dodaj obiekt ExoPlayer.Builder.setPlaybackLooper, który ustawi istniejący wątek odtwarzania dla nowej instancji ExoPlayer.
    • Zezwalaj na wyczyszczenie pomocników menedżera pobierania (#10776).
    • Dodaj do BasePlayer.seekTo parametr, aby wskazać polecenie używane do przewijania.
    • Używaj motywu podczas wczytywania elementów rysowalnych w interfejsie API 21 i nowszych (#220).
    • Dodawanie elementu ConcatenatingMediaSource2, który umożliwia łączenie wielu elementów multimedialnych w jednym oknie (#247).
  • Moduły wyodrębniania:
    • Jeśli podczas analizowania atomów Traak w tabeli przykładowej (stbl) brakuje wymaganego opisu (stsd), zamiast elementu NullPointerException użyj wywołania ParserException.
    • Prawidłowo pomijaj próbki podczas przechodzenia bezpośrednio do ramki synchronizacji w fMP4 (#10941).
  • Dźwięk:
    • Użyj szybkości transmisji skompresowanego formatu audio do obliczenia minimalnego rozmiaru bufora w przypadku odtwarzania bezpośredniego (przekazywania) w przypadku funkcji AudioTrack.
  • Tekst:
    • Popraw atrybut TextRenderer, przekazując nieprawidłowy indeks (ujemny) do Subtitle.getEventTime, jeśli plik z napisami nie zawiera żadnych wskazówek.
    • SubRip: dodaj obsługę plików UTF-16, jeśli zaczynają się od znacznika kolejności bajtów.
  • Metadane:
    • Analizuj wiele wartości oddzielonych null z ramek ID3, zgodnie z zasadami ID3 w wersji 2.4.
    • Dodaj MediaMetadata.mediaType, aby wskazać typ treści lub typ folderu opisany w metadanych.
    • Dodaj MediaMetadata.isBrowsable jako zamiennik MediaMetadata.folderType. Ten typ folderu zostanie wycofany w następnej wersji.
  • DASH:
    • Dodaj pełną analizę zestawów do adaptacji obrazów, w tym liczbę kafelków (#3752).
  • Interfejs:
    • Napraw wycofywaną właściwość PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener), aby mieć pewność, że zmiany dotyczące widoczności są przekazywane do zarejestrowanego detektora (#229).
    • Popraw kolejność elementów sterujących odtwarzacza środkowego w układzie PlayerView w układzie od prawej do lewej (nr 227).
  • Sesja:
    • Dodaj abstrakcję SimpleBasePlayer, by ułatwić implementację interfejsu Player w odtwarzaczach niestandardowych.
    • Dodaj metodę pomocniczą, aby przekonwertować token sesji platformy na Media3 SessionToken (#171).
    • Użyj polecenia onMediaMetadataChanged, aby aktywować aktualizacje sesji mediów na platformie (#219).
    • Dodaj sesję multimediów jako argument getMediaButtons() elementu DefaultMediaNotificationProvider i użyj stałych list, aby zwiększyć przejrzystość (#216).
    • Dodaj detektor wywołania zwrotnego onSetMediaItems, aby zapewnić sposoby modyfikowania i ustawiania listy MediaItem, początkowego indeksu i pozycji według sesji przed ustawieniem dla odtwarzacza (#156).
    • Unikaj wykrywania dwukrotnego kliknięcia w przypadku zdarzeń przycisków multimediów innych niż Bluetooth (#233).
    • Zwiększ działanie QueueTimeline w przypadku podejrzanego stanu starszej sesji (#241).
  • Metadane:
    • Analizuj wiele wartości oddzielonych null z ramek ID3, zgodnie z zasadami ID3 w wersji 2.4.
    • Dodaj MediaMetadata.mediaType, aby wskazać typ treści lub typ folderu opisany w metadanych.
    • Dodaj MediaMetadata.isBrowsable jako zamiennik MediaMetadata.folderType. Ten typ folderu zostanie wycofany w następnej wersji.
  • Rozszerzenie Cast:
    • Zmień wersję pakietu SDK Cast na 21.2.0.
  • Rozszerzenie IMA:
    • Aby uniknąć problemów z podziałem na wątki, usuń odbiornik zdarzenia ImaServerSideAdInsertionMediaSource w wątku aplikacji.
    • Dodaj właściwość focusSkipButtonWhenAvailable do elementu ImaServerSideAdInsertionMediaSource.AdsLoader.Builder, aby zażądać zaznaczenia przycisku pominięcia na urządzeniach telewizyjnych i domyślnie ustawić dla niego wartość „true” (prawda).
    • Dodaj do elementu ImaServerSideAdInsertionMediaSource.AdsLoader metodę focusSkipButton(), aby automatycznie żądać zaznaczenia przycisku pominięcia.
    • Uaktualnij pakiet IMA SDK do wersji 3.29.0.
  • Aplikacja w wersji demonstracyjnej:
    • Poproś o zgodę na wysyłanie powiadomień o pobieraniu w czasie działania (#10884).

Wersja 1.0.0-beta03

22 listopada 2022 r.

Aplikacja androidx.media3:media3-*:1.0.0-beta03 została zwolniona. Wersja 1.0.0-beta03 zawiera te zatwierdzenia.

Ta wersja odpowiada wersji ExoPlayer 2.18.2.

  • Biblioteka główna:
    • Dodaj ExoPlayer.isTunnelingEnabled, aby sprawdzić, czy w przypadku obecnie wybranych ścieżek włączone jest tunelowanie (#2518).
    • Dodaj WrappingMediaSource, aby uprościć zawijanie pojedynczych elementów MediaSource (#7279).
    • Odrzuć wsteczny bufor, zanim odtwarzanie zatrzyma się z powodu niewystarczającej ilości pamięci.
    • Zamknij blok Tracking „doSomeWork”, gdy włączone jest odciążanie.
    • Rozwiąż problem ze śledzeniem sesji z szybkim wyszukiwaniem w elemencie PlaybackStatsListener (nr 180).
    • Wyślij brakujące wywołanie zwrotne funkcji onMediaItemTransition, gdy dzwonisz pod numer seekToNext lub seekToPrevious w przypadku playlisty z jednym elementem (#10667).
    • Dodaj właściwość Player.getSurfaceSize, która zwraca rozmiar powierzchni, na której jest renderowany film.
    • Naprawiono błąd, który powodował, że usunięcie odbiorników w trakcie publikowania odtwarzacza mogło powodować błąd IllegalStateException (#10758).
  • Kompilacja:
    • Aby uniknąć błędów kompilacji, wymuś minimalną wartość compileSdkVersion (#10684).
    • Unikaj publikowania bloku, gdy znajduje się w innej kompilacji Gradle.
  • Wybór ścieżki:
    • Jeśli wyświetlanie nie obsługuje Dolby Vision, wybieraj inne ścieżki. (#8944).
  • Pobrane pliki:
    • Napraw potencjalną pętlę nieskończoną w elemencie ProgressiveDownloader spowodowaną równoczesnym pobieraniem i odtwarzaniem z tym samym tagiem PriorityTaskManager (#10570).
    • Natychmiastowe powiadomienie o pobieraniu (#183).
    • Ogranicz liczbę usunięć równoległego pobierania do 1, aby uniknąć nadmiernego tworzenia wątków (#10458).
  • Film:
    • Jeśli wyświetlacz nie obsługuje innego dekodera Dolby Vision, wypróbuj alternatywny dekoder. (#9794).
  • Dźwięk:
    • Użyj zasady SingleThreadExecutor do zwolnienia AudioTrack instancji, aby uniknąć błędów zabraknięcia pamięci podczas jednoczesnego udostępniania wielu graczy (#10057).
    • Dodaje AudioOffloadListener.onExperimentalOffloadedPlayback dla stanu odciążenia AudioTrack. (#134).
    • Ustaw AudioTrackBufferSizeProvider jako interfejs publiczny.
    • Dodaj ExoPlayer.setPreferredAudioDevice, aby ustawić preferowane urządzenie wyjściowe audio (#135).
    • Zmień nazwę androidx.media3.exoplayer.audio.AudioProcessor na androidx.media3.common.audio.AudioProcessor.
    • Zmapuj 8- i 12-kanałowy dźwięk na maski kanałów 7.1 i 7.1.4 zależnie od wszystkich wersji Androida (#10701).
  • Metadane:
    • W MetadataRenderer można teraz skonfigurować renderowanie metadanych, gdy tylko będą dostępne. Utwórz instancję z funkcją MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean), aby określić, czy mechanizm renderowania będzie wydawał metadane wcześniej, czy synchronizował się z pozycją odtwarzacza.
  • DRM:
    • Obejście błędu w implementacji ClearKey na Androidzie 13, który zwraca niepusty, ale nieprawidłowy adres URL licencji.
    • Naprawiono błąd setMediaDrmSession failed: session not opened podczas przełączania między schematami DRM w playliście (np. Widevine na ClearKey).
  • Tekst:
    • CEA-608: sprawdź, czy polecenia przełączania usługi w polu 2 są obsługiwane prawidłowo (#10666).
  • DASH:
    • Analizuj EventStream.presentationTimeOffset z plików manifestu (#10460).
  • Interfejs:
    • Użyj bieżących zastąpień odtwarzacza jako gotowych ustawień w sekcji TrackSelectionDialogBuilder (#10429).
  • Sesja:
    • Sprawdź, czy polecenia są zawsze wykonywane w prawidłowej kolejności, nawet jeśli niektóre wymagają asynchronicznego rozwiązania problemu (#85).
    • Dodaj DefaultMediaNotificationProvider.Builder do utworzenia DefaultMediaNotificationProvider instancji. Kreator może skonfigurować identyfikator powiadomień, identyfikator kanału powiadomień oraz nazwę kanału powiadomień używaną przez dostawcę. Dodaj też metodę DefaultMediaNotificationProvider.setSmallIcon(int), aby ustawić małą ikonę powiadomień. (#104).
    • Upewnij się, że polecenia wysłane przed MediaController.release() nie są odrzucane (#99).
    • SimpleBitmapLoader może wczytać bitmapę z identyfikatorów URI file:// (#108).
    • Napraw asercję, która uniemożliwia usłudze MediaController wyszukiwanie reklamy w danym okresie (#122).
    • Po zakończeniu odtwarzania wskaźnik MediaSessionService zatrzymuje się na pierwszym planie i wyświetla się powiadomienie z prośbą o ponowne rozpoczęcie odtwarzania ostatnio odtwarzanego elementu multimedialnego (#112).
    • Nie uruchamiaj usługi na pierwszym planie z oczekującą intencją wstrzymania (#167).
    • Ręcznie ukryj „plakietkę” powiązaną z powiadomieniem utworzonym przez użytkownika DefaultNotificationProvider w interfejsie API 26 i API 27 (w interfejsach API w wersji 28 i nowszych) plakietka jest automatycznie ukryta (nr 131).
    • Naprawa błędu, który powodował, że drugie połączenie łączące ze starszą wersją MediaSession z Media3 MediaController powoduje zdarzenie IllegalStateExceptions (#49).
  • RTSP:
    • Dodaj obsługę pofragmentowanych pakietów H263 (#119).
    • Dodano obsługę formatu MP4A-LATM (#162).
  • IMA:
    • Dodaj czas oczekiwania na wczytanie informacji o reklamie, by uwzględnić przypadki, gdy pakiet IMA SDK utknie przy wczytywaniu reklamy (#10510).
    • Zapobiegaj pomijaniu reklam w trakcie filmu przy przewijaniu do końca treści (#10685).
    • Prawidłowo oblicz czas trwania okna w przypadku transmisji na żywo z reklamami wstawionymi po stronie serwera, np. IMA DAI (#10764).
  • Rozszerzenie FFmpeg:
    • Dodaj nowe wymagane flagi, aby połączyć biblioteki FFmpeg z pakietem NDK w wersji 23.1.7779620 lub nowszym (#9933).
  • Rozszerzenie AV1:
    • Zaktualizuj wersję CMake, aby uniknąć niezgodności z najnowszymi wersjami Android Studio (#9933).
  • Rozszerzenie Cast:
    • Zaimplementuj getDeviceInfo(), aby móc rozpoznać parametr CastPlayer podczas sterowania odtwarzaniem za pomocą przycisku MediaController (#142).
  • Transformer:
    • Dodaj licznik czasu watchdoga muxer, aby wykrywać, że generowanie próbki wyjściowej jest zbyt wolne.
  • Usuń wycofane symbole:
    • Usuń Transformer.Builder.setOutputMimeType(String). Ta funkcja została usunięta. Jeśli używany jest domyślny mikser, typem MIME będzie zawsze MP4.

Wersja 1.0.0-beta02

21 lipca 2022 r.

Aplikacja androidx.media3:media3-*:1.0.0-beta02 została zwolniona. Wersja 1.0.0-beta02 zawiera te zatwierdzenia.

Ta wersja jest powiązana z wersją ExoPlayer 2.18.1.

  • Biblioteka główna:
    • Upewnij się, że zmiana pola ShuffleOrder za pomocą ExoPlayer.setShuffleOrder spowoduje wywołanie metody Player.Listener#onTimelineChanged z parametrem reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED (#9889).
    • W przypadku multimediów progresywnych uwzględnij tylko wybrane ścieżki w pozycji buforowanej (#10361).
    • Zezwalaj na niestandardowy rejestrator na potrzeby wszystkich danych wyjściowych dziennika ExoPlayer (#9752).
    • Popraw implementację parametru setDataSourceFactory w usłudze DefaultMediaSourceFactory, która w niektórych przypadkach nie działała (#116).
  • Moduły wyodrębniania:
    • Naprawianie analizy zestawów zdjęć do krótkoterminowych plików referencyjnych H265 (#10316).
    • Naprawianie analizy szybkości transmisji bitów w polach esds (#10381).
  • DASH:
    • Analizuj adres URL licencji ClearKey z plików manifestu (#10246).
  • Interfejs:
    • Upewnij się, że TalkBack informuje o aktualnie aktywnej opcji prędkości w menu elementów sterujących odtwarzaniem (#10298).
  • RTSP:
    • Dodaj obsługę pofragmentowanych pakietów VP8 (#110).
  • Rozszerzenie BeyondCorp:
    • Posłuchaj zmian w elemencie playWhenReady w usłudze LeanbackAdapter (10420).
  • Obsada:
    • Użyj parametru MediaItem, który został przekazany do metod playlist, jako Window.mediaItem w CastTimeline (#25, #8212).
    • Wesprzyj dyrektywę Player.getMetadata() i Listener.onMediaMetadataChanged() za pomocą atrybutu CastPlayer (#25).

Wersja 1.0.0-beta01

16 czerwca 2022 r.

Aplikacja androidx.media3:media3-*:1.0.0-beta01 została zwolniona. Wersja 1.0.0-beta01 zawiera te zatwierdzenia.

Odpowiada to wersji ExoPlayer 2.18.0.

  • Biblioteka główna:
    • Włącz obsługę diagnostyki platformy Androida w MediaMetricsManager. ExoPlayer przekazuje na platformę zdarzenia odtwarzania i dane o wydajności. Pomaga to dostarczać informacji o wydajności systemu i debugowaniu na urządzeniu. Te dane mogą też być zbierane przez Google, jeśli użytkownik urządzenia włączy udostępnianie danych o użytkowaniu i diagnostyce. Aplikacje mogą zrezygnować z udziału w diagnostyce platformy dla odtwarzacza ExoPlayer za pomocą parametru ExoPlayer.Builder.setUsePlatformDiagnostics(false).
    • Napraw błąd, który powoduje zbyt częste resetowanie ścieżek podczas korzystania z funkcji MergingMediaSource, np. ładowanie napisów z innego urządzenia i zmianę wybranego w trakcie odtwarzania napisów (#10248).
    • Przestań wykrywać typ sieci 5G-NSA w interfejsach API 29 i 30. Odtworzenia będą odtwarzane w sieci 4G.
    • Nie zezwalaj na przekazywanie instrukcji null do interfejsów MediaSource.Factory.setDrmSessionManagerProvider i MediaSource.Factory.setLoadErrorHandlingPolicy. W razie potrzeby instancje DefaultDrmSessionManagerProvider i DefaultLoadErrorHandlingPolicy można przekazywać wprost.
    • Dodaj element MediaItem.RequestMetadata, aby wskazać metadane potrzebne do odtwarzania multimediów, gdy dokładny element LocalConfiguration nie jest znany. Usuń też tag MediaMetadata.mediaUrl, ponieważ jest on teraz uwzględniony w źródle RequestMetadata.
    • Dodaj Player.Command.COMMAND_SET_MEDIA_ITEM, aby umożliwić graczom ustawienie jednego elementu.
  • Wybór ścieżki:
    • Przenieś klasę TrackSelectionOverrides na TrackSelectionParameters i awansuj TrackSelectionOverride do klasy najwyższego poziomu.
    • Zmień nazwę TracksInfo na Tracks, a TracksInfo.TrackGroupInfo na Tracks.Group. Nazwy Player.getCurrentTracksInfo i Player.Listener.onTracksInfoChanged również zostały zmienione na Player.getCurrentTracks i Player.Listener.onTracksChanged. Obejmuje to „cofnięcie” nazwy metody Player.Listener.onTracksChanged, ale z innymi typami parametrów.
    • Zmień DefaultTrackSelector.buildUponParameters i DefaultTrackSelector.Parameters.buildUpon, aby zwracały wartości DefaultTrackSelector.Parameters.Builder zamiast wycofanej wersji DefaultTrackSelector.ParametersBuilder.
    • Dodaj wartość DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities, która jest domyślnie włączona. Gdy ta opcja jest włączona, DefaultTrackSelector preferuje ścieżki audio, których liczba kanałów nie przekracza możliwości wyjściowych urządzenia. Na urządzeniach mobilnych DefaultTrackSelector będzie preferować dźwięk stereo/mono niż wielokanałowy, chyba że format wielokanałowy może być przestrzenny (Android 12L i nowszy) lub dźwięk przestrzenny Dolby. Dodatkowo na urządzeniach, które obsługują przestrzenność dźwięku, DefaultTrackSelector będzie sprawdzać zmiany we właściwościach Przestrzenny i w przypadku tych opcji wybierać nową ścieżkę. Ograniczenia te nie dotyczą urządzeń obsługujących television tryb interfejsu. Preferowany będzie format z największą liczbą kanałów. Aby można było włączyć tę funkcję, instancja DefaultTrackSelector musi być skonstruowana przy użyciu Context.
  • Film:
    • Zmień nazwę społeczności DummySurface na PlaceholderSurface.
    • Dodaj obsługę AV1 do MediaCodecVideoRenderer.getCodecMaxInputSize.
  • Dźwięk:
    • Użyj dekodera dźwięku LG AC3 do wyświetlania reklam o niestandardowym typie MIME.
    • Zmień zwracany typ kodu AudioAttributes.getAudioAttributesV21() z android.media.AudioAttributes na nową klasę otoki AudioAttributesV21, aby zapobiec powolnej weryfikacji ART w interfejsie API < 21.
    • Zapytanie o platformę (interfejs API 29 lub nowszy) lub przyjmowanie liczby kanałów kodowania audio na potrzeby przekazywania audio, gdy liczba kanałów w formacie audio jest nieskonfigurowana, co ma miejsce w przypadku przygotowywania bez fragmentów HLS (10204).
    • Skonfiguruj AudioTrack z maską kanału AudioFormat.CHANNEL_OUT_7POINT1POINT4, jeśli dekoder odtwarza 12-kanałowy dźwięk PCM (#10322.
  • DRM
    • Upewnij się, że sesja DRM jest zawsze poprawnie zaktualizowana przy wyszukiwaniu natychmiast po zmianie formatu (10274).
  • Tekst:
    • Zmień Player.getCurrentCues(), aby zwracał wartość CueGroup zamiast List<Cue>.
    • SSA: obsługuje ustawienie stylu OutlineColour, gdy BorderStyle == 3 (tj. OutlineColour ustawia tło wstawienia) (#8435).
    • CEA-708: analizowanie danych w wiele bloków usługi i ignorowanie bloków niepowiązanych z wybranym numerem usługi.
    • Usuń atrybut RawCcExtractor, który był używany tylko do obsługi formatu napisów wewnętrznych Google.
  • Moduły wyodrębniania:
    • Dodano obsługę formatu AVI (#2092).
    • Matroska: przeanalizuj DiscardPadding pod kątem utworów Opus.
    • MP4: analizowanie szybkości transmisji bitów z esds pudełek.
    • Ogg: zezwalaj na duplikowanie identyfikatora operacji i nagłówków komentarzy (#10038).
  • Interfejs:
    • Popraw dostarczanie zdarzeń do ustawień OnClickListener ustawionych na PlayerView w tym przypadku w przypadku wartości useController=false (#9605). Napraw też dostarczanie zdarzeń do OnLongClickListener we wszystkich konfiguracjach widoku.
    • Rozwiązanie problemu: nieprawidłowe traktowanie sekwencji zdarzeń kliknięcia, które wykraczają poza zakres PlayerView przed ACTION_UP, jako kliknięcia (#9861).
    • Rozwiązano problem z ułatwieniami dostępu w usłudze PlayerView polegający na tym, że dotknięcie może powodować przełączanie odtwarzania, a nie ukrywanie elementów sterujących (#8627).
    • Przeredaguj wartości TrackSelectionView i TrackSelectionDialogBuilder, aby działały z interfejsem Player, a nie ExoPlayer. Dzięki temu widoków danych można używać w innych implementacjach Player i usuwać zależność między modułem interfejsu a modułem ExoPlayer. To rewolucyjna zmiana.
    • Nie pokazuj wymuszonych ścieżek tekstowych w selektorze ścieżek PlayerView i pozostaw wybraną odpowiednią ścieżkę tekstu wymuszonego, jeśli wybrana jest opcja „Brak” (#9432).
  • DASH:
    • Przeanalizuj liczbę kanałów z elementów DTS AudioChannelConfiguration. Umożliwia to ponowne włączenie przekazywania dźwięku w przypadku strumieni DTS (#10159).
    • Nie zezwalaj na przekazywanie instrukcji null do instancji DashMediaSource.Factory.setCompositeSequenceableLoaderFactory. Instancje DefaultCompositeSequenceableLoaderFactory mogą być przekazywane w sposób jednoznaczny, jeśli jest to konieczne.
  • HLS:
    • Jeśli atrybut CODECS playlisty nie zawiera kodeka audio (#10065), użyj go, jeśli chodzi o przygotowanie szczegółowe.
    • Nie zezwalaj na przekazywanie instrukcji null do interfejsów HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.setPlaylistParserFactory i HlsMediaSource.Factory.setPlaylistTrackerFactory. Wystąpienia właściwości DefaultCompositeSequenceableLoaderFactory, DefaultHlsPlaylistParserFactory lub odwołania do elementu DefaultHlsPlaylistTracker.FACTORY można przekazywać w sposób jawny, jeśli jest to konieczne.
  • Płynne strumieniowanie:
    • Nie zezwalaj na przekazywanie instrukcji null do instancji SsMediaSource.Factory.setCompositeSequenceableLoaderFactory. Jeśli jest to wymagane, instancje DefaultCompositeSequenceableLoaderFactory mogą być przekazywane wprost.
  • RTSP:
    • Dodaj czytnik RTP na potrzeby H263 (#63).
    • Dodaj czytnik RTP na potrzeby MPEG4 (#35).
    • Dodaj czytnik RTP na potrzeby HEVC (#36).
    • Dodaj czytnik RTP na AMR. Obecnie obsługiwane są tylko jednokanałowe, nieprzeplatane strumienie AMR. Złożony ładunek AMR RTP nie jest obsługiwany. (#46)
    • Dodaj czytnik RTP na potrzeby VP8 (#47).
    • Dodaj czytnik RTP na potrzeby WAV (#56).
    • Poprawiono nagłówek podstawowej autoryzacji RTSP. (#9544).
    • Przestań sprawdzać obowiązkowe pola SDP, ponieważ ExoPlayer ich nie potrzebuje (#10049).
    • Podczas analizowania czasu protokołu RTSP Zgłoszono wyjątek (#10165).
    • Dodaj czytnik RTP na potrzeby VP9 (#47).
    • Dodaj czytnik RTP dla OPUS (#53).
  • Źródła danych:
    • Zmień nazwę społeczności DummyDataSource na PlaceholderDataSource.
    • Obejście problemu z obsługą OkHttp.
  • Sesja:
    • Aby umożliwić asynchroniczne rozpoznawanie żądań, zastąp MediaSession.MediaItemFiller wartością MediaSession.Callback.onAddMediaItems.
    • obsługiwać metody setMediaItems(s), gdy MediaController łączy się ze starszą sesją multimediów.
    • Usuń MediaController.setMediaUri i MediaSession.Callback.onSetMediaUri. Tę samą funkcję można osiągnąć za pomocą metod MediaController.setMediaItem i MediaSession.Callback.onAddMediaItems.
    • Przekierowuj starsze wywołania MediaController do odtwarzania multimediów do MediaSession.Callback.onAddMediaItems zamiast onSetMediaUri.
    • Aby dostosować powiadomienia, dodaj MediaNotification.Provider i DefaultMediaNotificationProvider.
    • Aby pobrać obrazy grafiki, dodaj BitmapLoader i SimpleBitmapLoader.
    • Dodaj MediaSession.setCustomLayout(), aby zapewnić wsteczną zgodność ze starszą sesją.
    • Dodaj MediaSession.setSessionExtras(), aby zapewnić spójność funkcji ze starszą sesją.
    • Zmień nazwę MediaSession.MediaSessionCallback na MediaSession.Callback, MediaLibrarySession.MediaLibrarySessionCallback na MediaLibrarySession.Callback i MediaSession.Builder.setSessionCallback na setCallback.
    • Popraw NPE w usłudze MediaControllerImplLegacy (nr 59).
    • Aktualizowanie informacji o pozycji sesji na osi czasu(#51).
    • Napraw NPE w MediaControllerImplBase po zwolnieniu kontrolera (#74).
  • Odtwarzanie reklam / IMA:
    • Zmniejsz częstotliwość odpytywania reklam z częstotliwości co 100 ms do 200 ms, aby zachować zgodność z rekomendacjami rady Media Rating Council (MRC).
  • Rozszerzenie FFmpeg:
    • Zaktualizuj wersję CMake do 3.21.0+, aby uniknąć błędu CMake, który spowodował błąd synchronizacji Gradle w AndroidStudio (#9933).
  • Usuń wycofane symbole:
    • Usuń Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). Użyj w zamian zasady Player.Listener.onTracksChanged(Tracks).
    • Usuń Player.getCurrentTrackGroups i Player.getCurrentTrackSelections. Użyj w zamian zasady Player.getCurrentTracks. Możesz też nadal używać ExoPlayer.getCurrentTrackGroups i ExoPlayer.getCurrentTrackSelections, ale te metody są nadal wycofane.
    • Usuń stałe DownloadHelper DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT i DEFAULT_TRACK_SELECTOR_PARAMETERS. W miarę możliwości używaj pola getDefaultTrackSelectorParameters(Context). W innych przypadkach używaj pola DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.
    • Usuń konstruktor DefaultTrackSelector(ExoTrackSelection.Factory). Użyj w zamian zasady DefaultTrackSelector(Context, ExoTrackSelection.Factory).
    • Usuń Transformer.Builder.setContext. Zamiast tego wartość Context powinna być przekazywana do konstruktora Transformer.Builder.

Wersja 1.0.0-alfa03

14 marca 2022 r.

Aplikacja androidx.media3:media3-*:1.0.0-alpha03 została zwolniona. Wersja 1.0.0-alpha03 zawiera te zatwierdzenia.

Odpowiada to wersji ExoPlayer 2.17.1.

  • Dźwięk:
    • Naprawiono błąd podczas sprawdzania funkcji dźwięku Dolby Atmos (E-AC3-JOC) w HLS.
  • Moduły wyodrębniania:
    • FMP4: rozwiąż problem, który powodował, że metadane próbki emsg były wyświetlane w niewłaściwej kolejności w przypadku strumieni zawierających atomy emsg w wersjach v0 i v1 (#9996).
  • Tekst:
    • Popraw interakcję elementów SingleSampleMediaSource.Factory.setTrackId i MediaItem.SubtitleConfiguration.Builder.setId, aby nadać priorytet polu SubtitleConfiguration, a jeśli nie jest ustawiona, użyj wartości Factory (#10016).
  • Odtwarzanie reklam:
    • Naprawianie niedokładności w dźwięku między okresami reklam w transmisjach HLS SSAI na żywo.

Wersja 1.0.0-alfa02

2 marca 2022 r.

Aplikacja androidx.media3:media3-*:1.0.0-alpha02 została zwolniona. Wersja 1.0.0-alpha02 zawiera te zatwierdzenia.

Odpowiada to wersji ExoPlayer 2.17.0.

  • Biblioteka podstawowa:
    • Dodaj chronioną metodę DefaultRenderersFactory.getCodecAdapterFactory(), aby podklasy DefaultRenderersFactory, które zastępują buildVideoRenderers() lub buildAudioRenderers(), miały dostęp do fabryki adapterów kodeków i przekazywały je do MediaCodecRenderer utworzonych przez siebie instancji.
    • Propaguj pola nagłówka ICY name i genre odpowiednio do pól MediaMetadata.station i MediaMetadata.genre, aby docierały do aplikacji przez Player.Listener.onMediaMetadataChanged()(#9677).
    • Usuń puste klucze z DefaultHttpDataSource#getResponseHeaders.
    • Przejdź w tryb uśpienia i spróbuj ponownie, jeśli nie uda się utworzyć instancji MediaCodec. Jest to rozwiązanie problemu występującego na niektórych urządzeniach podczas przełączania platformy z bezpiecznego kodeka na inny kodek (#8696).
    • Dodaj MediaCodecAdapter.getMetrics(), aby umożliwić użytkownikom pobieranie danych z usługi MediaCodec. (#9766).
    • Napraw rozdzielczość zależności Maven (#8353).
    • Wyłącz automatyczną korektę szybkości w przypadku transmisji na żywo, które nie mają funkcji małego opóźnienia ani nie ustawiają szybkości na prośbę użytkownika (#9329).
    • Zmień nazwę społeczności DecoderCounters#inputBufferCount na queuedInputBufferCount.
    • Ustaw numer SimpleExoPlayer.renderers jako prywatny. Mechanizmy renderowania są dostępne na stronie ExoPlayer.getRenderer.
    • Zaktualizowano niektóre wartości stałe AnalyticsListener.EventFlags, aby pasowały do wartości w elemencie Player.EventFlags.
    • Podziel encję AnalyticsCollector na interfejs i domyślną implementację, aby umożliwić jej pomijanie przez R8, gdy aplikacja jej nie potrzebuje.
  • Wybór ścieżki:
    • Obsługują flagi preferowanych ról wideo przy wyborze ścieżki (#9402).
    • Zaktualizuj mechanizmy wyboru ścieżki wideo, aby uwzględnić preferowane typy MIME i flagi roli podczas wybierania wielu ścieżek wideo do adaptacji (#9519).
    • Zaktualizuj logikę wyboru ścieżki wideo i audio, aby wybierać tylko formaty na potrzeby wybierania adaptacyjnego, które mają ten sam poziom obsługi dekodera i sprzętu (#9565).
    • Jeśli podstawowe dekodery z akceleracją sprzętową obsługują wiele kodeków, zaktualizuj zasady wyboru ścieżki wideo, aby preferować bardziej wydajne kodeki (#4835).
    • Preferuj ustawienia treści audio (np. „domyślną” ścieżkę audio lub ścieżkę pasującą do języka lokalnego systemu) zamiast ograniczeń technicznych (np. preferowany typ MIME lub maksymalną liczbę kanałów).
    • Rozwiąż problem z wyborem utworu, który powodował, że zastąpienie jednej grupy ścieżek nie wyłączało innych grup ścieżek tego samego typu (#9675).
    • Napraw problem z wyborem ścieżki, w wyniku którego kombinacja zastąpień z pustą i niepustych ścieżek nie jest prawidłowo stosowana (#9649).
    • Zabroń zduplikowanych identyfikatorów TrackGroup w elemencie TrackGroupArray. Elementy TrackGroup zawsze można odróżnić przez ustawienie w konstruktorze TrackGroup elementu id. Rozwiązuje to problem z awarią, która występowała przy wznawianiu odtwarzania po włączeniu odtwarzania w tle aplikacji z aktywnym zastąpieniem ścieżki (#9718).
    • Popraw logikę w AdaptiveTrackSelection, aby umożliwić wzrost jakości przy wystarczającej przepustowości sieci nawet wtedy, gdy odtwarzanie jest bardzo blisko krawędzi transmisji na żywo (#9784).
  • Film:
    • W razie potrzeby napraw logikę zastępczą dekodera Dolby Vision, aby używać zgodnego dekodera H264/H265.
  • Dźwięk:
    • W razie potrzeby napraw logikę kreacji zastępczej dekodera Dolby Atmos (E-AC3-JOC), aby w razie potrzeby używać zgodnego dekodera E-AC3.
    • Zmień interfejsy API AudioCapabilities tak, aby wymagały jawnego przekazywania metody AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES zamiast null.
    • Zezwól na dostosowanie obliczania rozmiaru bufora AudioTrack przez wstawienie typu AudioTrackBufferSizeProvider do DefaultAudioSink. (#8891).
    • Jeśli żądany rozmiar bufora przekracza 1 MB, spróbuj ponownie utworzyć element AudioTrack. (#9712).
  • Moduły wyodrębniania:
    • WAV: dodaj obsługę strumieni RF64 (#9543).
    • Naprawa nieprawidłowej analizy jednostek NAL H.265 SPS (#9719).
    • Analizuj komentarze Vorbis (w tym METADATA_BLOCK_PICTURE) w plikach Ogg Opus i Ogg Vorbis.
  • Tekst:
    • Dodaj pole MediaItem.SubtitleConfiguration.id, które zostanie przekazane do pola Format.id ścieżki napisów utworzonej w konfiguracji (#9673).
    • Dodaj podstawową obsługę napisów WebVTT w kontenerach Matroska (#9886).
    • Zablokuj usłudze Cea708Decoder możliwość odczytu więcej niż zadeklarowany rozmiar bloku usług.
  • DRM:
    • Usuń playbackLooper z konta DrmSessionManager.(pre)acquireSession. Gdy aplikacja używa elementu DrmSessionManager w niestandardowym elemencie MediaSource, zamiast tego do DrmSessionManager.setPlayer musi być przekazywany playbackLooper.
  • Odtwarzanie reklam / IMA:
    • Dodano obsługę dynamicznego wstawiania reklam (DAI) IMA (#8213).
    • Dodaj metodę do elementu AdPlaybackState, by umożliwić zresetowanie grupy reklam i ponowne jej odtworzenie (#9615).
    • Wymuszanie odtwarzania podczas odtwarzania reklamy na poziomie 1,0 (#9018).
    • Rozwiąż problem polegający na tym, że nie udało się załadować grupy reklam, która spowodowała natychmiastowy reset odtwarzania (#9929).
  • Interfejs:
    • Popraw kolor cyfr w przyciskach przewijania i przewijania do przodu w StyledPlayerView podczas korzystania z określonych motywów (#9765).
    • Prawidłowo przetłumacz ciągi tekstowe dotyczące prędkości odtwarzania (#9811).
  • DASH:
    • Dodaj do pliku Representation (#9579) przeanalizowane podstawowe i dodatkowe właściwości.
    • obsługują rolę śledzenia forced-subtitle (#9727).
    • Przestań interpretować rolę ścieżki main jako C.SELECTION_FLAG_DEFAULT.
    • Napraw podstawową logikę wykluczania adresów URL w plikach manifestu, które nie deklarują przestrzeni nazw DVB (#9856).
    • Obsługa względnych adresów URL MPD.Location (#9939).
  • HLS:
    • Prawidłowo wypełnij pole Format.label w przypadku strumieni HLS tylko z dźwiękiem (#9608).
    • Aby skrócić czas uruchamiania, domyślnie użyj przygotowań bez fragmentów. Jeśli Twoje nagrania zawierają ścieżki z napisami, które nie są zadeklarowane na playliście reklamy nadrzędnej, dodaj je do playlisty reklamy nadrzędnej, by można było je odtwarzać, lub wyłącz opcję HlsMediaSource.Factory.setAllowChunklessPreparation(false).
    • Obsługuj dokładne przewijanie klatek kluczowych w HLS (#2882).
  • RTSP:
    • Podaj interfejs API klienta, aby zastąpić identyfikator SocketFactory używany do każdego połączenia z serwerem (#9606).
    • Jeśli występują obie metody uwierzytelniania DIGEST zamiast PODSTAWOWEJ (#9800).
    • Obsługa, gdy czas wczytywania ścieżki RTSP jest niedostępny (#9775).
    • Ignoruj nieprawidłowe wartości nagłówka RTP-Info (#9619).
  • Transformer:
    • Zwiększ wymaganą minimalną wersję interfejsu API do 21.
    • TransformationException służy teraz do opisywania błędów, które występują podczas przekształcania.
    • Dodaj TransformationRequest, aby określić opcje przekształcania.
    • Zezwalaj na rejestrowanie wielu detektorów.
    • Naprawianie zawieszania się Transformera, gdy dane wyjściowe kodeka są częściowo odczytywane.
    • Popraw potencjalny NPE w Transformer.getProgress podczas zwalniania rzutów modyfikujących.
    • Dodaj aplikację demonstracyjną do stosowania przekształceń.
  • Rozszerzenie MediaSession:
    • Domyślnie MediaSessionConnector usuwa teraz playlistę po zatrzymaniu. Aplikacje, które chcą zachować playlistę, mogą wywoływać setClearMediaItemsOnStop(false) w oprogramowaniu sprzęgającym.
  • Rozszerzenie Cast:
    • Usuń błąd, który uniemożliwiał usłudze CastPlayer prawidłowe wywołanie onIsPlayingChanged (#9792).
    • Obsługuj metadane audio, w tym grafiki, za pomocą funkcji DefaultMediaItemConverter (#9663).
  • Rozszerzenie FFmpeg:
    • Spraw, aby funkcja build_ffmpeg.sh korzystała z funkcji bin utils, a nie GNU (#9933).
  • Zgodność z Androidem 12:
    • Uaktualnij rozszerzenie Cast, by korzystało z wtyczki com.google.android.gms:play-services-cast-framework:20.1.0. Wcześniejsze wersje systemu play-services-cast-framework nie są zgodne z aplikacjami kierowanymi na Androida 12 i będą powodować awarię z błędem IllegalArgumentException podczas tworzenia komponentów PendingIntent (#9528).
  • Usuń wycofane symbole:
    • Usuń Player.EventListener. Użyj w zamian zasady Player.Listener.
    • Usuń MediaSourceFactory#setDrmSessionManager, MediaSourceFactory#setDrmHttpDataSourceFactory i MediaSourceFactory#setDrmUserAgent. Użyj w zamian zasady MediaSourceFactory#setDrmSessionManagerProvider.
    • Usuń MediaSourceFactory#setStreamKeys. Użyj w zamian zasady MediaItem.Builder#setStreamKeys.
    • Usuń MediaSourceFactory#createMediaSource(Uri). Użyj w zamian zasady MediaSourceFactory#createMediaSource(MediaItem).
    • Usuń setTag z DashMediaSource, HlsMediaSource i SsMediaSource. Użyj w zamian zasady MediaItem.Builder#setTag.
    • Usuń DashMediaSource#setLivePresentationDelayMs(long, boolean). Użyj MediaItem.Builder#setLiveConfiguration i MediaItem.LiveConfiguration.Builder#setTargetOffsetMs, aby zastąpić plik manifestu, lub DashMediaSource#setFallbackTargetLiveOffsetMs, aby podać wartość zastępczą.
    • Usuń (Simple)ExoPlayer.setThrowsWhenUsingWrongThread. Nie można już zrezygnować z egzekwowania wątku.
    • Usuń użytkowników ActionFile i ActionFileUpgradeUtil. Użyj ExoPlayera w wersji 2.16.1 lub wcześniejszej, aby scalić pliki działań ActionFileUpgradeUtil w DefaultDownloadIndex.
    • Usuń ProgressiveMediaSource#setExtractorsFactory. Użyj konstruktora ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory).
    • Usuń ProgressiveMediaSource.Factory#setTag i ProgressiveMediaSource.Factory#setCustomCacheKey. Zamiast niej używaj znaczników MediaItem.Builder#setTag i MediaItem.Builder#setCustomCacheKey.
    • Usuń konstruktora DefaultRenderersFactory(Context, @ExtensionRendererMode int) i DefaultRenderersFactory(Context, @ExtensionRendererMode int, long). Zamiast nich użyj konstruktora DefaultRenderersFactory(Context), DefaultRenderersFactory#setExtensionRendererMode i DefaultRenderersFactory#setAllowedVideoJoiningTimeMs.
    • Usuń wszystkie publiczne konstruktory CronetDataSource. Użyj w zamian zasady CronetDataSource.Factory.
  • Zmień IntDefs tylko na @Target(TYPE_USE). Może to zakłócić kompilację użycia w Kotlinie, co można poprawić, przenosząc adnotację do typu (Int).
    • @AacAudioObjectType
    • @Ac3Util.SyncFrameInfo.StreamType
    • @AdLoadException.Type
    • @AdtsExtractor.Flags
    • @AmrExtractor.Flags
    • @AspectRatioFrameLayout.ResizeMode
    • @AudioFocusManager.PlayerCommand
    • @AudioSink.SinkFormatSupport
    • @BinarySearchSeeker.TimestampSearchResult.Type
    • @BufferReplacementMode
    • @C.BufferFlags
    • @C.ColorRange
    • @C.ColorSpace
    • @C.ColorTransfer
    • @C.CryptoMode
    • @C.Encoding
    • @C.PcmEncoding
    • @C.Projection
    • @C.SelectionReason
    • @C.StereoMode
    • @C.VideoOutputMode
    • @CacheDataSource.Flags
    • @CaptionStyleCompat.EdgeType
    • @DataSpec.Flags
    • @DataSpec.HttpMethods
    • @DecoderDiscardReasons
    • @DecoderReuseResult
    • @DefaultAudioSink.OutputMode
    • @DefaultDrmSessionManager.Mode
    • @DefaultTrackSelector.SelectionEligibility
    • @DefaultTsPayloadReaderFactory.Flags
    • @EGLSurfaceTexture.SecureMode
    • @EbmlProcessor.ElementType
    • @ExoMediaDrm.KeyRequest.RequestType
    • @ExtensionRendererMode
    • @Extractor.ReadResult
    • @FileTypes.Type
    • @FlacExtractor.Flags (w com.google.android.exoplayer2.ext.flac opakowaniu)
    • @FlacExtractor.Flags (w com.google.android.exoplayer2.extractor.flac pakiecie)
    • @FragmentedMp4Extractor.Flags
    • @HlsMediaPlaylist.PlaylistType
    • @HttpDataSourceException.Type
    • @IllegalClippingException.Reason
    • @IllegalMergeException.Reason
    • @LoadErrorHandlingPolicy.FallbackType
    • @MatroskaExtractor.Flags
    • @Mp3Extractor.Flags
    • @Mp4Extractor.Flags
    • @NotificationUtil.Importance
    • @PlaybackException.FieldNumber
    • @PlayerNotificationManager.Priority
    • @PlayerNotificationManager.Visibility
    • @PlayerView.ShowBuffering
    • @Renderer.State
    • @RendererCapabilities.AdaptiveSupport
    • @RendererCapabilities.Capabilities
    • @RendererCapabilities.DecoderSupport
    • @RendererCapabilities.FormatSupport
    • @RendererCapabilities.HardwareAccelerationSupport
    • @RendererCapabilities.TunnelingSupport
    • @SampleStream.ReadDataResult
    • @SampleStream.ReadFlags
    • @StyledPlayerView.ShowBuffering
    • @SubtitleView.ViewType
    • @TextAnnotation.Position
    • @TextEmphasisSpan.MarkFill
    • @TextEmphasisSpan.MarkShape
    • @Track.Transformation
    • @TrackOutput.SampleDataPart
    • @Transformer.ProgressState
    • @TsExtractor.Mode
    • @TsPayloadReader.Flags
    • @WebvttCssStyle.FontSizeUnit

Wersja 1.0.0-alfa01

27 października 2021 roku

Aplikacja androidx.media3:media3-*:1.0.0-alpha01 została zwolniona. Wersja 1.0.0-alpha01 zawiera te zatwierdzenia.

Nowe funkcje

Media3 to nowe miejsce na biblioteki obsługi multimediów, w tym ExoPlayer. Pierwsza wersja alfa zawiera wczesne, funkcjonalne implementacje bibliotek do implementowania przypadków użycia multimediów, w tym:

  • ExoPlayer – odtwarzacz multimedialny na poziomie aplikacji na Androida, który można łatwo dostosować i rozszerzyć.
  • Funkcjonalność sesji multimedialnej – eksponowanie i sterowanie odtwarzaniem. Ten nowy moduł sesji używa tego samego interfejsu Player co ExoPlayer.
  • Komponenty UI do tworzenia interfejsów odtwarzania multimediów.
  • funkcje dodawania modułów z innych bibliotek do wykorzystania z ExoPlayer, np. wstawiania reklam za pomocą pakietu IMA SDK.

Więcej informacji znajdziesz w artykule o projekcie Media3 na GitHubie.

Komponent ExoPlayer był wcześniej hostowany w osobnym projekcie ExoPlayer na GitHubie. W Media3 nazwa pakietu to androidx.media3.exoplayer. Planujemy nadal utrzymywać i publikować projekt ExoPlayer na GitHubie przez jakiś czas, aby dać aplikacjom czas na migrację do Media3. Media3 ma zamienniki wszystkich modułów ExoPlayer z wyjątkiem starszych rozszerzeń media2 i mediasession, które zostały zastąpione nowym modułem media3-session. Pozwala to na bezpośrednią integrację odtwarzaczy z sesjami multimediów bez konieczności używania adaptera/klasy oprogramowania sprzęgającego.