LITR (pronunciado "lai-tr") es una herramienta liviana de transformación de video/audio que admite videos y pistas de audio de transcodificación con una modificación opcional de cuadro.
En su iteración actual, LITR admite:
De forma predeterminada, LITR usa la pila Android MediaCodec para decodificación/codificación acelerada de hardware y OpenGL para representar. También usa MediaExtractor y Mediamuxer para leer/escribir medios.
Simplemente agarre a través de Gradle:
implementation ' com.linkedin.android.litr:litr:1.5.7 '
... o Maven:
< dependency >
< groupId >com.linkedin.android.litr</ groupId >
< artifactId >litr</ artifactId >
< version >1.5.7</ version >
</ dependency >
Primero, instanciar MediaTransformer
con un Context
que pueda acceder a Uri
S que usará para la entrada y salida. Más comúnmente, ese será un contexto de aplicación.
MediaTransformer mediaTransformer = new MediaTransformer ( getApplicationContext ());
Luego, simplemente llame al método transform
para transformar su video:
mediaTransformer . transform ( requestId ,
sourceVideoUri ,
targetVideoFilePath ,
targetVideoFormat ,
targetAudioFormat ,
videoTransformationListener ,
transformationOptions );
Pocas cosas notables relacionadas con la transformación:
requestId
único, se usará al volver a llamar a un oyente o es necesario al cancelar una transformación continuanull
significa que no desea modificar las pistas de ese tipoGlFilter
s en TransformationOptions
, que se aplicarán en ordenBufferFilter
s en TransformationOptions
, que se aplicarán en ordentransform
varias veces, a las solicitudes de transformación de colaTransformationOptions
MediaRange
en TransformationOptions
La transformación continua se puede cancelar llamando cancel
con su requestId
:
mediaTransformer . cancel ( requestId );
Cuando ya no necesite MediaTransformer
, libérelo. Tenga en cuenta que la instancia MediaTransformer
se vuelve inutilizable después de que la libere, tendrá que instanciar una nueva.
mediaTransformer . release ();
Cuando la transformación falla, no se lanza la excepción, sino que se proporciona en TransformationListener.onError
. LITR define sus propias excepciones para diferentes escenarios. Para API> = 23, la excepción de LITR también contendrá MediaCodec.CodecException
como causa.
Cuando sea posible, se proporcionarán estadísticas de transformación en las devoluciones de llamada del oyente. Las estadísticas incluyen formatos de origen y pista de destino, códecs utilizados y resultados de transformación y tiempo para cada pista.
Por defecto, LITR usa Android MediaCodec Stack para hacer todos los trabajos de medios y OpenGL para renderizar. Pero esto no está en piedra.
A alto nivel, LITR desglosa la transformación en cinco pasos esenciales:
Cada paso de transformación es realizado por un componente. Cada componente se abstrae como una interfaz:
MediaSource
Decoder
Renderer
Encoder
MediaTarget
Cuando use sus propias implementaciones de componentes, asegúrese de que la salida de un componente coincida con la entrada esperada de un próximo componente. Por ejemplo, si está utilizando un Encoder
personalizado (¿AV1?), Asegúrese de que acepte cualquier Renderer
de formato de cuadro que produzca ( GlSurface
, ByteBuffer
) y emita lo que MediaTarget
espera como entrada.
Los componentes personalizados se pueden usar en TrackTransform
s en el método de transformación "bajo nivel":
transform ( requestId ,
List < TrackTransform > trackTransforms ,
listener ,
granularity )
Esta API permite definir componentes y parámetros por pista de medios, lo que permite las operaciones basadas en pistas, como pistas de muxing/demuxing, transcodificando diferentes pistas de manera diferente, cambiando el orden de la pista, etc.
Puede usar filtros personalizados para modificar marcos de video/audio. Si está escribiendo un filtro de video personalizado, implemente la interfaz GlFilter
para realizar operaciones adicionales de dibujo de OpenGL. Si necesita cambiar cómo se representa el cuadro de video de origen en un marco de video de destino, implementa la interfaz GlFrameRender
. Para el filtro de audio, implementa BufferFilter
.
LITR ahora tiene 40 nuevos filtros de video acelerados de GPU portados de proyectos MP4COMPOSER-Android y Android-GpuImage. También puede crear su propio filtro simplemente configurando VideoFramerenderFilter con su sombreador personalizado, ¡sin codificación adicional!
Todos los filtros de video/audio viven en la biblioteca "Pack Filter", que está disponible a través de Gradle:
implementation ' com.linkedin.android.litr:litr-filters:1.5.7 '
... o Maven:
< dependency >
< groupId >com.linkedin.android.litr</ groupId >
< artifactId >litr-filters</ artifactId >
< version >1.5.7</ version >
</ dependency >
Puede aprobar una lista de filtros al transformar un video o pista de audio. Tenga en cuenta que los filtros se aplicarán en el orden en que están en la lista, por lo que el ordenamiento es importante.
MediaTransformer
no es muy intencionalmente un singleton, para permitir una burla fácil en las pruebas unitarias. También hay MockMediaTransformer
para las pruebas de UI, que pueden "reproducir" sincrónicamente una secuencia de devoluciones de llamada del oyente.
La lógica comercial central en LITR está bien cubierta por pruebas unitarias. LITR está diseñado para usar el patrón de inyección de dependencia, lo que hace que sea muy fácil escribir pruebas JVM con dependencias simuladas. Utilizamos Mockito Framework para burlarse.
LITR viene con una aplicación de demostración bastante útil, que le permite transcodificar pistas de video/audio con diferentes parámetros, además de proporcionar código de muestra.
Lea Contriping.MD para obtener detalles sobre nuestro código de conducta y el proceso para enviarnos solicitudes de extracción.
Para las versiones disponibles, consulte las etiquetas en este repositorio.
Puede usar compilaciones de instantáneas para probar los últimos cambios inéditos. Se publica una nueva instantánea después de cada fusión de la rama principal por el flujo de trabajo de acción de la instantánea de implementación.
Simplemente agregue el repositorio de instantáneas de Sonatype a sus scripts de Gradle:
repositories {
maven {
url " https://oss.sonatype.org/content/repositories/snapshots/ "
}
}
Puede encontrar la última versión de instantánea para usar en el archivo Gradle.Properties.
Vea también la lista de contribuyentes que participaron en este proyecto.
Este proyecto tiene licencia bajo la licencia BSD 2 Cláusula - consulte el archivo de licencia para obtener más detalles