Transformations

Transcodage d'un format à un autre

Vous pouvez spécifier les formats audio et vidéo de sortie que vous souhaitez produire lors de la création de Transformer. Par exemple, le code suivant montre comment configurer Transformer pour générer une sortie vidéo H.264/AVC et de l'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 au transmuxing, c'est-à-dire en copiant les échantillons compressés du conteneur d'entrée vers le conteneur de sortie sans les modifier. Cela permet d'éviter les coûts de calcul et la perte potentielle de qualité du décodage et du réencodage dans le même format.

Supprimer l'audio ou la vidéo

Supprimez l'audio ou la vidéo à l'aide de 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 codes temporels 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 les contenus multimédias d'une durée 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();

Optimiser les finitions

Pour réduire la latence lors du découpage du début d'une vidéo, activez l'optimisation du découpage.

Kotlin

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

Java

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

Cela accélère l'exportation en décodant et en encodant le moins possible la vidéo, puis en associant les données réencodées au reste de la vidéo d'origine. L'optimisation repose sur la capacité à assembler une partie du fichier d'entrée avec une sortie nouvellement encodée, ce qui signifie que le format de sortie de l'encodeur et le format d'entrée doivent être compatibles. Ainsi, par exemple, si le fichier a été créé à l'origine sur un appareil avec une implémentation d'encodeur différente, il est probable que l'optimisation ne soit pas possible. Pour que l'optimisation aboutisse, l'encodeur fourni à Transformer via EncoderFactory doit avoir un niveau et un profil compatibles avec le format d'entrée.

Cette optimisation ne fonctionne qu'avec une entrée MP4 à élément unique sans effet, sauf avec des effets vidéo d'opération et des rotations divisibles par 90 degrés. Si l'optimisation échoue, Transformer revient automatiquement à l'exportation normale et signale le résultat de l'optimisation dans ExportResult.OptimizationResult.

Nous sommes en train de valider cette fonctionnalité et nous prévoyons qu'elle ne sera pas expérimentale dans une prochaine version.

Modifications de vidéos

EditedMediaItems contient 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 lorsque vous créez des éléments multimédias modifiés.

Vous pouvez redimensionner les contenus multimédias, ce qui peut être utile pour économiser sur les ressources de traitement ou la bande passante lorsque vous utilisez des entrées à très haute résolution, telles que des vidéos 4K ou 8K. Par exemple, pour effectuer une mise à l'échelle proportionnelle jusqu'à 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 une mise à l'échelle selon 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 programmes de nuanceurs GL appliqués dans l'ordre. Dans certains cas, le framework des effets peut appliquer plusieurs effets avec un seul programme de nuanceurs. 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 compatibles avec l'aperçu 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 implémentés en appliquant une séquence d'instances AudioProcessor au contenu audio brut (PCM). ExoPlayer permet de transmettre des processeurs audio à DefaultAudioSink.Builder, ce qui permet de prévisualiser les modifications audio.