Transformations

Transcodage entre formats

Vous pouvez spécifier les formats audio et vidéo de sortie que vous souhaitez produire lorsque vous créez Transformer. Par exemple, le code suivant montre comment configurer Transformer pour générer une sortie vidéo H.264/AVC et 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();

Si le format du support d'entrée correspond déjà aux configurations audio ou vidéo, Transformer passe automatiquement à la transmuxing, c'est-à-dire en copiant les échantillons compressés du conteneur d'entrée vers le conteneur de sortie sans y apporter de modifications. Cela évite les coûts de calcul et la perte potentielle de qualité du décodage et du réencodage du même format.

Supprimer l'audio ou la vidéo

Supprimez l'audio ou la vidéo avec EditedMediaItem.Builder, par exemple:

Kotlin

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

Java

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

Couper un clip

Vous pouvez supprimer tout contenu multimédia en dehors des horodatages de début et de fin spécifiés en définissant la configuration de rognage sur l'élément multimédia d'entrée. Par exemple, pour produire un extrait ne contenant que le contenu multimédia dont la durée est comprise entre 10 et 20 secondes:

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

Modifications de vidéos

Les EditedMediaItems contiennent des listes de processeurs audio et d'effets vidéo à appliquer dans l'ordre. La bibliothèque inclut des implémentations d'effets vidéo pour les cas d'utilisation courants. Vous pouvez également écrire des effets personnalisés et les transmettre lors de la création d'éléments multimédias modifiés.

Vous pouvez redimensionner les médias, ce qui peut être utile pour économiser sur les ressources de traitement ou la bande passante lorsque vous traitez des entrées très haute résolution, telles que les vidéos 4K ou 8K. Par exemple, pour effectuer une mise à l'échelle proportionnellement à une hauteur de 480 pixels:

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

Vous pouvez également effectuer un scaling en fonction d'un facteur donné, par exemple pour diviser la taille par deux:

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

Vous pouvez configurer la rotation de la même manière:

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

Effets vidéo personnalisés

Le constructeur Effects accepte une liste d'effets audio et vidéo à appliquer. En interne, le framework d'effets de Transformer convertit la liste des effets vidéo en une séquence de nuanceurs GL qui sont appliqués dans l'ordre. Dans certains cas, le framework des effets est capable d'appliquer plusieurs effets avec un seul programme de nuanceur. Par exemple, un programme de nuanceurs peut appliquer plusieurs transformations matricielles consécutives, ce qui améliore l'efficacité et la qualité.

Les effets vidéo sont également pris en charge pour la prévisualisation dans ExoPlayer, à l'aide de ExoPlayer.setVideoEffects.

L'application de démonstration inclut des exemples d'effets vidéo personnalisés.

Modifications audio

Les effets audio sont mis en œuvre en appliquant une séquence d'instances AudioProcessor au contenu audio brut (PCM). ExoPlayer accepte la transmission des processeurs audio à DefaultAudioSink.Builder, ce qui permet de prévisualiser les modifications audio.