Transkoduj między formatami
Możesz określić wyjściowe formaty audio i wideo, które chcesz uzyskać przy tworzeniu Transformera. Poniższy kod pokazuje na przykład, jak skonfigurować Transformer tak, aby odtwarzał wideo w standardzie H.264/AVC i AAC:
Kotlin
Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build()
Java
new Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build();
Jeśli format multimediów wejściowych jest już zgodny z konfiguracją dźwięku lub obrazu, Transformer automatycznie przełączy się na transmuksowanie, czyli skopiuje skompresowane próbki z kontenera wejściowego do kontenera wyjściowego bez modyfikacji. Pozwala to uniknąć kosztów obliczeniowych oraz potencjalnej utraty jakości dekodowania i ponownego kodowania w tym samym formacie.
Usuwanie dźwięku lub obrazu
Usuń dźwięk lub film, używając elementu EditedMediaItem.Builder
, na przykład:
Kotlin
EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()
Java
new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();
Przycinanie klipu
Możesz usunąć multimedia poza określonymi sygnaturami czasowymi rozpoczęcia i zakończenia, ustawiając konfigurację przycinania w wejściowym elemencie multimedialnym. Aby np. utworzyć klip zawierający tylko treści multimedialne trwające od 10 do 20 sekund:
Kotlin
val inputMediaItem = MediaItem.Builder() .setUri(uri) .setClippingConfiguration( ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build()) .build()
Java
MediaItem inputMediaItem = new MediaItem.Builder() .setUri(uri) .setClippingConfiguration( new MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build()) .build();
Edytowanie filmu
EditedMediaItems
ma listę procesorów audio i efektów wideo, które należy zastosować w określonej kolejności. Biblioteka zawiera implementacje efektów wideo przeznaczone do typowych zastosowań. Możesz też pisać efekty niestandardowe i przekazywać je podczas tworzenia edytowanych elementów multimedialnych.
Możesz przeskalowywać multimedia, co pozwala zaoszczędzić na zasobach przetwarzania lub przepustowości, gdy masz do czynienia z danymi wejściowymi o bardzo wysokiej rozdzielczości, np. w rozdzielczości 4K lub 8K. Aby na przykład wyskalować go proporcjonalnie do wysokości 480 pikseli:
Kotlin
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf(Presentation.createForHeight(480)) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of(Presentation.createForHeight(480)))) .build();
Możesz też skalować dane według danego współczynnika, na przykład aby podzielić rozmiar o połowę:
Kotlin
val editedMediaItem = EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf( ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()))) .build();
Możesz skonfigurować rotację w taki sam sposób:
Kotlin
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf( ScaleAndRotateTransformation.Builder() .setRotationDegrees(90f) .build()) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setRotationDegrees(90f).build()))) .build();
Niestandardowe efekty wideo
Konstruktor Effects
akceptuje listę efektów audio i wideo, które chcesz zastosować.
Wewnętrznie platforma efektów Transformer konwertuje listę efektów wideo na sekwencję programów cieniowania GL, które są stosowane w określonej kolejności. W niektórych przypadkach platforma efektów może zastosować wiele efektów w ramach jednego programu do cieniowania.
Na przykład jeden program do cieniowania może zastosować kilka następujących po sobie przekształceń macierzy, co poprawia wydajność i jakość.
Efekty wideo są również obsługiwane w podglądzie w ExoPlayer przy użyciu ExoPlayer.setVideoEffects
.
Aplikacja demonstracyjna zawiera przykłady niestandardowych efektów wideo.
Zmiany w dźwięku
Efekty audio są implementowane przez zastosowanie sekwencji AudioProcessor
wystąpień do nieprzetworzonego dźwięku (PCM). ExoPlayer obsługuje przesyłanie procesorów dźwięku do interfejsu DefaultAudioSink.Builder
, co umożliwia podgląd zmian dźwięku.