LitR (ausgesprochen "LAI-TR") ist ein leichtes Video/Audio-Transformationstool, das Transcodierungsvideo- und Audio-Tracks mit optionaler Frame-Modifikation unterstützt.
In seiner aktuellen Iteration unterstützt LitR:
Standardmäßig verwendet LitR Android MediaCodec -Stack für Hardware -beschleunigte Dekodierung/Codierung und OpenGL für das Rendering. Außerdem verwendet es MediaExtractor und MediaMuxer zum Lesen/Schreiben von Medien.
Einfach über Gradle greifen:
implementation ' com.linkedin.android.litr:litr:1.5.7 '
... oder Maven:
< dependency >
< groupId >com.linkedin.android.litr</ groupId >
< artifactId >litr</ artifactId >
< version >1.5.7</ version >
</ dependency >
Erstens, instanziieren Sie MediaTransformer
mit einem Context
, der auf Uri
-S zugreifen kann, die Sie für Eingabe und Ausgabe verwenden können. Am häufigsten wird dies ein Anwendungskontext sein.
MediaTransformer mediaTransformer = new MediaTransformer ( getApplicationContext ());
Rufen Sie dann einfach die transform
auf, um Ihr Video zu transformieren:
mediaTransformer . transform ( requestId ,
sourceVideoUri ,
targetVideoFilePath ,
targetVideoFormat ,
targetAudioFormat ,
videoTransformationListener ,
transformationOptions );
Nur wenige bemerkenswerte Dinge im Zusammenhang mit der Transformation:
requestId
sichernull
-Target -Format übergeben bedeutet, dass Sie keine Spuren dieses Typs ändern möchtenGlFilter
in TransformationOptions
ein, die in der Reihenfolge angewendet werdenBufferFilter
in TransformationOptions
ein, die in der Reihenfolge angewendet werdentransform
mehrmals aufrufen, um Transformationsanfragen auf Queue zu wandernTransformationOptions
festgelegt werdenMediaRange
in TransformationOptions
getrimmt werden Die laufende Transformation kann abgesagt werden, indem cancel
mit seiner requestId
angerufen wird:
mediaTransformer . cancel ( requestId );
Wenn Sie nicht mehr MediaTransformer
benötigen, veröffentlichen Sie ihn bitte. Beachten Sie, dass die MediaTransformer
-Instanz nach der Veröffentlichung unbrauchbar wird. Sie müssen eine neue instanziieren.
mediaTransformer . release ();
Wenn die Transformation fehlschlägt, wird die Ausnahme nicht ausgelöst, sondern in TransformationListener.onError
-Rückruf bereitgestellt. LitR definiert seine eigenen Ausnahmen für verschiedene Szenarien. Für API> = 23 enthält die LITR -Ausnahme auch MediaCodec.CodecException
als Ursache.
Wenn möglich, werden Transformationsstatistiken in Listener -Rückrufen bereitgestellt. Zu den Statistiken gehören Quell- und Zielspurformate, Codecs, die verwendet werden, und Transformationsergebnis und Zeit für jeden Track.
Standardmäßig verwendet LitR Android MediaCodec Stack, um alle Medienarbeit zu erledigen, und OpenGL zum Rendern. Aber das ist nicht in Stein gemeißelt.
Auf hohem Niveau unterteilt LitR die Transformation in fünf wesentliche Schritte:
Jeder Transformationsschritt wird von einer Komponente durchgeführt. Jede Komponente wird als Schnittstelle abstrahiert:
MediaSource
Decoder
Renderer
Encoder
MediaTarget
Stellen Sie bei Verwendung Ihrer eigenen Komponenten -Implementierungen sicher, dass die Ausgabe einer Komponente mit der erwarteten Eingabe einer nächsten Komponente übereinstimmt. Wenn Sie beispielsweise einen benutzerdefinierten Encoder
(AV1?) Verwenden, stellen Sie sicher, dass das Renderer
des Frame -Formats ( GlSurface
, ByteBuffer
) angeht, und gibt das aus, was MediaTarget
als Eingabe erwartet.
Benutzerdefinierte Komponenten können in TrackTransform
S unter der Transformation "Low -Level" -Transformation verwendet werden:
transform ( requestId ,
List < TrackTransform > trackTransforms ,
listener ,
granularity )
Diese API ermöglicht das Definieren von Komponenten und Parametern pro Medienspur, wodurch Track -basierte Operationen wie Muxing-/Demuxing -Tracks, Transkodierung verschiedener Tracks unterschiedlich, Änderungen der Strecke usw.
Sie können benutzerdefinierte Filter verwenden, um Video-/Audio -Frames zu ändern. Wenn Sie einen benutzerdefinierten Videofilter schreiben, implementieren Sie GlFilter
-Schnittstelle, um zusätzliche OpenGL -Draw -Operationen zu erstellen. Wenn Sie ändern müssen, wie Source -Video -Frame auf einen Zielvideo -Bildrahmen gerendert wird, implementieren Sie GlFrameRender
-Schnittstelle. Implementieren Sie für Audiofilter BufferFilter
.
LitR verfügt jetzt über 40 neue GPU-beschleunigte Videofilter, die von MP4Composer-Android- und Android-Gpuimage-Projekten portiert wurden. Sie können auch Ihren eigenen Filter einfach erstellen, indem Sie VideoFramerenderFilter mit Ihrem benutzerdefinierten Shader ohne zusätzliche Codierung konfigurieren!
Alle Video-/Audiofilter live in der "Filter Pack" -Bibliothek, die über Gradle erhältlich ist:
implementation ' com.linkedin.android.litr:litr-filters:1.5.7 '
... oder Maven:
< dependency >
< groupId >com.linkedin.android.litr</ groupId >
< artifactId >litr-filters</ artifactId >
< version >1.5.7</ version >
</ dependency >
Sie können eine Liste von Filtern übergeben, wenn Sie einen Video- oder Audio -Track transformieren. Denken Sie daran, dass Filter in der Reihenfolge angewendet werden, in der sie sich in der Liste befinden, und so die Bestellung von Angelegenheiten.
MediaTransformer
ist sehr absichtlich kein Singleton, um es in Unit -Tests leicht zu verspotten. Es gibt auch MockMediaTransformer
für UI -Tests, die eine Abfolge von Hörer -Rückrufen synchron "wieder spielen" können.
Die Kerngeschäftslogik in LITR ist durch Einheitstests gut abgedeckt. LitR ist so konzipiert, dass sie das Abhängigkeitsinjektionsmuster verwenden, wodurch es sehr einfach ist, JVM -Tests mit verspotteten Abhängigkeiten zu schreiben. Wir verwenden Mockito Framework zum Verspotten.
LitR verfügt über eine ziemlich nützliche Demo -App, mit der Sie neben der Bereitstellung von Beispielcodes Video-/Audio -Tracks mit unterschiedlichen Parametern übertragen können.
Bitte lesen Sie mit Beitrags.md für Informationen zu unserem Verhaltenskodex und dem Vorgang zum Senden von Pull -Anfragen an uns.
Die verfügbaren Versionen finden Sie in den Tags in diesem Repository.
Sie können Snapshot -Builds verwenden, um die neuesten unveröffentlichten Änderungen zu testen. Ein neuer Snapshot wird nach jeder Verschmelzung in die Hauptzweigung von Snapshot Github Action Workflow veröffentlicht.
Fügen Sie einfach das Sonatype -Snapshot -Repository Ihren Gradle -Skripten hinzu:
repositories {
maven {
url " https://oss.sonatype.org/content/repositories/snapshots/ "
}
}
Die neueste Snapshot -Version finden Sie in der Datei gradle.properties.
Siehe auch die Liste der Mitwirkenden, die an diesem Projekt teilgenommen haben.
Dieses Projekt ist unter der BSD 2 -Klausel -Lizenz lizenziert - finden Sie in der Lizenzdatei für Einzelheiten