Obsługiwane formaty

Więcej informacji o formatach multimediów znajdziesz na stronie Obsługiwane formaty w ExoPlayerze. W Transformerze obowiązują te same ograniczenia dotyczące wczytywania, wyodrębniania i dekodowania strumieni, ale Transformer nie obsługuje dołączonych modułów dekodera oprogramowania ExoPlayera.

Transformer korzysta też z MediaCodec do kodowania, co ogranicza liczbę obsługiwanych formatów wyjściowych. Więcej informacji o ograniczeniach kodowania znajdziesz w artykule Kodeki wideo MediaCodec.

Domyślnie Transformer tworzy standardowe pliki MP4 za pomocą InAppMp4Muxer. Jeśli Twoja aplikacja wymaga fragmentowanego formatu MP4, możesz przekazać InAppFragmentedMp4Muxer.Factory podczas inicjowania instancji Transformer. Media3 obsługuje też inne formaty takie jak WebM, AAC, Ogg i WAV, za pomocą dedykowanych multiplekserów, np. WebmMuxer, AacMuxer, OggMuxer i WavMuxer. Aby można było je wstrzyknąć, muszą być opakowane w niestandardowy Muxer.Factory, ale przyszłe wersje będą zawierać gotowe do użycia implementacje fabryczne, które uproszczą ten proces.

Obsługa obrazów

Transformer używa BitmapFactory do wczytywania i dekodowania wszystkich zasobów graficznych, dlatego obsługuje wszystkie formaty obsługiwane przez BitmapFactory. Obsługiwane typy obrazów znajdziesz w artykule Obsługa obrazów. W przypadku formatów wieloobrazkowych (np. GIF-ów) wyświetlany jest pojedynczy kadr obrazu z kontenera, jeśli używany jest DefaultAssetLoaderFactory.

Formaty specjalne

Transformer obsługuje dane wejściowe w nowszych formatach multimediów, które oferują specjalne funkcje w porównaniu z formatami konwencjonalnymi.

Obsługa filmów HDR

Coraz więcej urządzeń obsługuje nagrywanie filmów HDR co zapewnia żywsze, dokładniejsze kolory i większy zakres jasności.

Transformer obsługuje edytowanie filmów HDR na urządzeniach z Androidem 13 (API na poziomie 33) lub nowszym, które mają wymaganą obsługę kodowania. Podczas edytowania filmów HDR wszystkie efekty wideo GL muszą obsługiwać 16-bitowe komponenty kolorów zmiennoprzecinkowych i przestrzeń kolorów BT.2020. HDR_MODE_KEEP_HDR to domyślny tryb podczas tworzenia Composition. Jeśli edytowanie HDR nie jest obsługiwane, Transformer wraca do używania HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL.

Konwertowanie HDR na SDR, znane też jako mapowanie tonów, jest obsługiwane na urządzeniach z Androidem 10 (API na poziomie 29) lub nowszym, które mają wymaganą obsługę dekodowania i OpenGL support. Jest to przydatne, gdy udostępniasz multimedia HDR innym aplikacjom lub usługom, które nie obsługują wczytywania treści HDR. Aby włączyć mapowanie tonów za pomocą OpenGL, podczas tworzenia Composition wywołaj setHdrMode(HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL). Od Androida 12 (API na poziomie 31) MediaCodec obsługuje też mapowanie tonów na niektórych urządzeniach, w tym na wszystkich urządzeniach z Androidem 13 lub nowszym, które mogą nagrywać filmy HDR. Aby włączyć mapowanie tonów za pomocą MediaCodec, wywołaj setHdrMode(HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC).

Obsługa multimediów w zwolnionym tempie

Filmy w zwolnionym tempie zawierają metadane wskazujące prędkość, z jaką powinna być odtwarzana każda sekcja strumienia. Spłaszczanie to proces tworzenia nowego strumienia wideo na podstawie filmu w zwolnionym tempie, ale z przyspieszonymi lub spowolnionymi sekcjami na podstawie metadanych, dzięki czemu są one odtwarzane prawidłowo nawet w odtwarzaczach, które nie stosują metadanych w zwolnionym tempie.

Aby spłaszczyć strumienie w zwolnionym tempie, użyj metody konstruktora setFlattenForSlowMotion w EditedMediaItem.

Kotlin

val editedMediaItem =
  EditedMediaItem.Builder(inputMediaItem).setFlattenForSlowMotion(true).build()
val transformer = Transformer.Builder(context).addListener(transformerListener).build()
transformer.start(editedMediaItem, outputPath)

Java

EditedMediaItem editedMediaItem =
    new EditedMediaItem.Builder(inputMediaItem).setFlattenForSlowMotion(true).build();
Transformer transformer =
    new Transformer.Builder(context).addListener(transformerListener).build();
transformer.start(editedMediaItem, outputPath);

Dzięki temu możesz obsługiwać filmy w zwolnionym tempie bez konieczności obsługi tych specjalnych formatów. Wystarczy, że zamiast oryginalnej wersji filmu zapiszesz i odtworzysz jego spłaszczoną wersję.