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.