LITR (prononcé "LAI-TR") est un outil de transformation vidéo / audio léger qui prend en charge les pistes vidéo et audio transcodantes avec une modification du cadre en option.
Dans son itération actuelle, les supports LITR:
Par défaut, LITR utilise la pile Android MediaCodec pour le décodage / codage accéléré matériel et OpenGL pour le rendu. Il utilise également MediaExtractor et MediaMuxer pour lire / écrire des supports.
Saisissez simplement via Gradle:
implementation ' com.linkedin.android.litr:litr:1.5.7 '
... ou maven:
< dependency >
< groupId >com.linkedin.android.litr</ groupId >
< artifactId >litr</ artifactId >
< version >1.5.7</ version >
</ dependency >
Tout d'abord, instanciement MediaTransformer
avec un Context
qui peut accéder Uri
que vous utiliserez pour l'entrée et la sortie. Le plus souvent, ce sera un contexte d'application.
MediaTransformer mediaTransformer = new MediaTransformer ( getApplicationContext ());
Ensuite, appelez simplement la méthode transform
pour transformer votre vidéo:
mediaTransformer . transform ( requestId ,
sourceVideoUri ,
targetVideoFilePath ,
targetVideoFormat ,
targetAudioFormat ,
videoTransformationListener ,
transformationOptions );
Peu de choses notables liées à la transformation:
requestId
unique unique, elle sera utilisée lors de la rappel sur un auditeur ou nécessaire lors de l'annulation d'une transformation en coursnull
signifie que vous ne voulez pas modifier les pistes de ce typeGlFilter
dans TransformationOptions
, qui sera appliquée dans l'ordreBufferFilter
dans TransformationOptions
, qui seront appliquées dans l'ordretransform
plusieurs fois, en demandes de transformation de file d'attenteTransformationOptions
MediaRange
dans TransformationOptions
La transformation en cours peut être annulée en appelant cancel
avec son requestId
:
mediaTransformer . cancel ( requestId );
Lorsque vous n'avez plus besoin MediaTransformer
, veuillez le libérer. Notez que l'instance MediaTransformer
devient inutilisable après l'avoir publiée, vous devrez instancier une nouvelle.
mediaTransformer . release ();
Lorsque la transformation échoue, l'exception n'est pas lancée, mais plutôt fournie dans TransformationListener.onError
Rappel. LITR définit ses propres exceptions pour différents scénarios. Pour API> = 23, l'exception LITR contiendra également MediaCodec.CodecException
en tant que cause.
Lorsque cela est possible, des statistiques de transformation seront fournies dans les rappels des auditeurs. Les statistiques incluent les formats de piste source et cible, les codecs utilisés et le résultat de transformation et le temps pour chaque piste.
Par défaut, LITR utilise la pile Android MediaCodec pour effectuer tous les travaux de support et OpenGL pour le rendu. Mais ce n'est pas dans la pierre.
Au niveau élevé, LITR décompose la transformation en cinq étapes essentielles:
Chaque étape de transformation est effectuée par un composant. Chaque composant est abstrait en interface:
MediaSource
Decoder
Renderer
Encoder
MediaTarget
Lorsque vous utilisez vos propres implémentations de composants, assurez-vous que la sortie d'un composant correspond à l'entrée attendue d'un composant suivant. Par exemple, si vous utilisez un Encoder
personnalisé (AV1?), Assurez-vous qu'il accepte le format de trame que Renderer
produit produit ( GlSurface
, ByteBuffer
) et publie ce que MediaTarget
attend en tant qu'entrée.
Les composants personnalisés peuvent être utilisés dans TrackTransform
S dans la méthode de transformation "de faible niveau" inférieur:
transform ( requestId ,
List < TrackTransform > trackTransforms ,
listener ,
granularity )
Cette API permet de définir des composants et des paramètres par piste multimédia, permettant ainsi des opérations basées sur la piste, telles que les pistes de mutation / démontage, de transcoder différentes pistes différemment, de modification de l'ordre des pistes, etc.
Vous pouvez utiliser des filtres personnalisés pour modifier les trames vidéo / audio. Si vous écrivez un filtre vidéo personnalisé, implémentez l'interface GlFilter
pour effectuer des opérations de dessin OpenGL supplémentaires. Si vous devez modifier la façon dont le cadre vidéo source est rendu sur un cadre vidéo cible, implémentez l'interface GlFrameRender
. Pour le filtre audio, implémentez BufferFilter
.
LITR dispose désormais de 40 nouveaux filtres vidéo accélérés GPU portés à partir de projets MP4composer-android et Android-GPUImage. Vous pouvez également créer votre propre filtre simplement en configurant VideofraMerederFilter avec votre shader personnalisé, sans codage supplémentaire!
Tous les filtres vidéo / audio vivent dans la bibliothèque "Filter Pack", qui est disponible via Gradle:
implementation ' com.linkedin.android.litr:litr-filters:1.5.7 '
... ou maven:
< dependency >
< groupId >com.linkedin.android.litr</ groupId >
< artifactId >litr-filters</ artifactId >
< version >1.5.7</ version >
</ dependency >
Vous pouvez passer dans une liste de filtres lors de la transformation d'une piste vidéo ou audio. Gardez à l'esprit que les filtres seront appliqués dans l'ordre dans lesquels ils figurent dans la liste, donc la commande des questions.
MediaTransformer
n'est pas très intentionnellement pas un singleton, pour permettre une moquerie facile dans les tests unitaires. Il y a aussi MockMediaTransformer
pour les tests d'interface utilisateur, qui peuvent "lire de manière synchrone" une séquence de rappels d'auditeur.
La logique commerciale de base dans LITR est bien couverte par les tests unitaires. LITR est conçu pour utiliser le modèle d'injection de dépendance, ce qui facilite la rédaction de tests JVM avec des dépendances moquées. Nous utilisons Mockito Framework pour se moquer.
LITR est livré avec une application de démonstration assez utile, qui vous permet de transcoder des pistes vidéo / audio avec différents paramètres, en plus de fournir un exemple de code.
Veuillez lire contribution.md pour plus de détails sur notre code de conduite et le processus de soumission des demandes de traction à nous.
Pour les versions disponibles, consultez les balises de ce référentiel.
Vous pouvez utiliser des builds instantanés pour tester les dernières modifications inédites. Un nouveau instantané est publié après chaque fusion à la branche principale par le flux de travail d'action GitHub de déploiement.
Ajoutez simplement le référentiel instantané de Sonatype à vos scripts Gradle:
repositories {
maven {
url " https://oss.sonatype.org/content/repositories/snapshots/ "
}
}
Vous pouvez trouver la dernière version instantanée à utiliser dans le fichier gradle.properties.
Voir également la liste des contributeurs qui ont participé à ce projet.
Ce projet est sous licence en vertu de la licence BSD 2 CLAUSE - Voir le fichier de licence pour plus de détails