Trasformazioni

Transcodifica tra formati

Puoi specificare i formati audio e video di output da produrre quando creando Transformer. Ad esempio, il seguente codice mostra come per 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 video, Transformer passa automaticamente alla transmuxing, ovvero alla copia i campioni compressi dal container di input al container di output senza modifica. In questo modo si evitano i costi di calcolo e la potenziale perdita di qualità decodifica e 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 esterno ai timestamp di inizio e di fine specificati impostando la configurazione di ritaglio sull'elemento multimediale di input. Ad esempio, per produrre un Clip contenente solo i 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, attiva Taglia e ottimizzazione.

Kotlin

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

Java

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

Questo accelera l'esportazione in quanto decodifica e ricodifica la parte minima del video possibile, quindi unendo i dati ricodificati con il resto dell'originale video. L'ottimizzazione si basa sulla possibilità di unire parte del file di input con un output appena codificato, il che significa che il formato di output dell'encoder deve essere compatibile. Quindi, ad esempio, se il file era originariamente su un dispositivo con un'implementazione diversa di codifica, è probabile che non sia possibile applicare l'ottimizzazione. Affinché l'ottimizzazione vada a buon fine, l'encoder 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 un singolo asset senza effetti, ad eccezione di nessun effetto video operativo e rotazioni divisibili di 90 gradi. Se l'ottimizzazione un errore, Transformer torna automaticamente all'esportazione normale e segnala 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 a cui applicare ordine. La raccolta include implementazioni di effetti video per casi d'uso comuni, oppure scrivere effetti personalizzati e trasmetterli durante la creazione di contenuti multimediali modificati elementi.

Puoi ridimensionare i contenuti multimediali, il che può essere utile per risparmiare sulle risorse di elaborazione larghezza di banda molto elevata quando si ha a che fare con ingressi a risoluzione molto elevata, come 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 shaker. Ad esempio, un programma shaker può applicare più matrici consecutive trasformazioni avanzate, con un conseguente miglioramento dell'efficienza e della 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 AudioProcessor di Compute Engine all'audio RAW (PCM). ExoPlayer supporta il passaggio di processori audio DefaultAudioSink.Builder, che consente di visualizzare l'anteprima delle modifiche audio.