Transformacje

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.