Transformations

Transcodage d'un format à un autre

Vous pouvez spécifier les formats audio et vidéo de sortie que vous souhaitez produire Transformer. Par exemple, le code suivant montre comment pour configurer Transformer en 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 pour l'audio ou vidéo, Transformer passe automatiquement au transmuxing, c'est-à-dire copier les échantillons compressés du conteneur d'entrée vers le conteneur de sortie sans modification. Cela permet d'éviter les coûts de calcul et la perte potentielle de qualité décodage et 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 tous les contenus multimédias en dehors des codes temporels de début et de fin spécifiés en définissant la configuration de bornement de l'élément multimédia d'entrée. Par exemple, pour générer clip contenant uniquement 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'option "Couper" l'optimisation.

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 réencodant aussi peu la vidéo que puis d'assembler les données réencodées avec le reste de l'original vidéo. 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 doit être compatible. Ainsi, par exemple, si le fichier était initialement sur un appareil avec une mise en œuvre d'encodeur différente, que l'optimisation ne pourra pas être appliquée. Pour que l'optimisation aboutisse, l'encodeur fourni à Transformer via la classe 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 à un seul élément, sans aucun effet, sauf sans effets vidéo d'opération ni rotations divisibles par 90 degrés. Si l'optimisation échoue, Transformer revient automatiquement à l'exportation normale et signale résultat de l'optimisation dans ExportResult.OptimizationResult.

Cette fonctionnalité est en cours de validation et nous estimons qu'elle ne sera pas expérimentale dans une prochaine version.

Modifications de vidéos

EditedMediaItems a des listes de processeurs audio et d'effets vidéo à appliquer commande. Elle inclut des implémentations d'effets vidéo pour les cas d'utilisation courants, ou créer des effets personnalisés et les transmettre lorsque vous créez des contenus multimédias éléments.

Vous pouvez redimensionner les médias, ce qui peut être utile pour économiser sur les ressources de traitement pour les entrées à très haute résolution, comme les 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 matrices consécutives les transformations, ce qui améliore l'efficacité et la qualité.

Les effets vidéo sont également pris en charge pour l'aperçu dans ExoPlayer, en utilisant 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 de AudioProcessor des instances à l'audio brut (PCM). ExoPlayer permet de transmettre des processeurs audio au DefaultAudioSink.Builder, qui permet de prévisualiser les modifications audio