Trasformazioni

Transcodifica tra formati

Puoi specificare i formati audio e video di output che vuoi produrre durante la creazione di Transformer. Ad esempio, il seguente codice mostra come configurare Transformer per l'output di video H.264/AVC e audio 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();

Se il formato multimediale di input corrisponde già alle configurazioni per l'audio o il video, Transformer passa automaticamente alla transmuxing, ovvero copiando i campioni compressi dal contenitore di input al contenitore di output senza modifiche. In questo modo si evitano i costi di calcolo e la potenziale perdita di qualità della decodifica e della ricodifica nello stesso formato.

Rimuovere l'audio o il video

Rimuovi l'audio o il video utilizzando EditedMediaItem.Builder, ad esempio:

Kotlin

EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()

Java

new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();

Tagliare un clip

Puoi rimuovere qualsiasi contenuto multimediale al di fuori dei timestamp di inizio e fine specificati impostando la configurazione di ritaglio sull'elemento multimediale di input. Ad esempio, per produrre un clip contenente solo contenuti multimediali di durata compresa tra 10 e 20 secondi:

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();

Ottimizzazione dei ritagli

Per ridurre la latenza del taglio all'inizio di un video, abilita l'ottimizzazione del taglio.

Kotlin

Transformer.Builder(context)
    .experimentalSetTrimOptimizationEnabled(true)
    .build()

Java

new Transformer.Builder(context)
    .experimentalSetTrimOptimizationEnabled(true)
    .build();

Ciò velocizza l'esportazione decodificando e ricodificando il minor numero possibile di video, quindi unendo i dati ricodificati con il resto del video originale. L'ottimizzazione si basa sulla possibilità di unire parte del file di input con l'output appena codificato, il che significa che il formato di output del codificatore e il formato di input devono essere compatibili. Quindi, ad esempio, se il file è stato originariamente prodotto su un dispositivo con un codificatore diverso, è probabile che non sia possibile applicare l'ottimizzazione. Affinché l'ottimizzazione vada a buon fine, il codificatore fornito a Transformer tramite EncoderFactory deve avere un livello e un profilo compatibili con il formato di input.

Questa ottimizzazione funziona solo con l'input MP4 con singolo asset senza effetti, ad eccezione degli effetti video operativi e delle rotazioni divisibili di 90 gradi. Se l'ottimizzazione non va a buon fine, Transformer torna automaticamente all'esportazione normale e segnala il risultato dell'ottimizzazione in ExportResult.OptimizationResult.

Stiamo convalidando questa funzionalità e ci aspettiamo che diventi non sperimentale in una release futura.

Modifiche video

EditedMediaItems presenta elenchi di processori audio ed effetti video da applicare in ordine. La libreria include implementazioni di effetti video per casi d'uso comuni oppure puoi scrivere effetti personalizzati e trasmetterli durante la creazione di elementi multimediali modificati.

Puoi ridimensionare i contenuti multimediali, il che può essere utile per risparmiare sulle risorse di elaborazione o sulla larghezza di banda quando devi gestire input a risoluzione molto elevata, ad esempio video 4K o 8K. Ad esempio, per ridimensionare in modo proporzionale a un'altezza di 480 pixel:

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();

In alternativa, puoi scalare in base a un determinato fattore, ad esempio, per dimezzare le dimensioni:

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();

Puoi configurare la rotazione nello stesso modo:

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();

Effetti video personalizzati

Il costruttore Effects accetta un elenco di effetti audio e video da applicare. Internamente, il framework degli effetti di Transformer converte l'elenco degli effetti video in una sequenza di programmi GL Shar applicati in ordine. In alcuni casi, il framework degli effetti è in grado di applicare più effetti con un unico programma Shar. Ad esempio, un programma ombreggiato può applicare più trasformazioni consecutive delle matrici, migliorando l'efficienza e la qualità.

Gli effetti video sono supportati anche per l'anteprima in ExoPlayer, utilizzando ExoPlayer.setVideoEffects.

L'app demo include esempi di effetti video personalizzati.

Modifiche audio

Gli effetti audio vengono implementati applicando una sequenza di istanze AudioProcessor all'audio non elaborato (PCM). ExoPlayer supporta il passaggio dei processori audio all'DefaultAudioSink.Builder, che consente di visualizzare l'anteprima delle modifiche audio.