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