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.