O Litr (pronunciado "Lai-Tr") é uma ferramenta leve de transformação de vídeo/áudio que suporta faixas de vídeo e áudio com modificação opcional de quadros.
Em sua iteração atual suporta:
Por padrão, o Litr usa a pilha Android MediaCodec para decodificação/codificação acelerada de hardware e codificação e OpenGL para renderização. Ele também usa o MediaExtractor e o MediaMuxer para ler/gravar mídia.
Basta agarrar 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 >
Primeiro, instancie MediaTransformer
com um Context
que pode acessar Uri
que você usará para entrada e saída. Mais comumente, esse será um contexto de aplicativo.
MediaTransformer mediaTransformer = new MediaTransformer ( getApplicationContext ());
Em seguida, basta chamar o método transform
para transformar seu vídeo:
mediaTransformer . transform ( requestId ,
sourceVideoUri ,
targetVideoFilePath ,
targetVideoFormat ,
targetAudioFormat ,
videoTransformationListener ,
transformationOptions );
Poucas coisas notáveis relacionadas à transformação:
requestId
único, ele será usado ao ligar de volta para um ouvinte ou necessário ao cancelar uma transformação contínuanull
significa que você não deseja modificar as faixas desse tipoGlFilter
s nas TransformationOptions
, que serão aplicadas em ordemBufferFilter
s nas TransformationOptions
, que serão aplicadas em ordemtransform
várias vezes, para fazer a fila de solicitações de transformaçãoTransformationOptions
MediaRange
em TransformationOptions
A transformação em andamento pode ser cancelada ligando para cancel
com seu requestId
:
mediaTransformer . cancel ( requestId );
Quando você não precisar mais MediaTransformer
, libere -o. Observe que a instância MediaTransformer
se torna inutilizável depois de lançá -la, você terá que instanciar uma nova.
mediaTransformer . release ();
Quando a transformação falha, a exceção não é lançada, mas é fornecida no retorno de chamada TransformationListener.onError
. A Litr define suas próprias exceções para diferentes cenários. Para API> = 23, a exceção do LITR também conterá MediaCodec.CodecException
como causa.
Quando possível, as estatísticas de transformação serão fornecidas nos retornos de chamada do ouvinte. As estatísticas incluem formatos de faixa de origem e destino, codecs usados e resultado de transformação e tempo para cada faixa.
Por padrão, o Litr usa a pilha Android MediaCodec para fazer todo o trabalho da mídia e o OpenGL para renderização. Mas isso não é colocado em pedra.
Em alto nível, o Litr divide a transformação em cinco etapas essenciais:
Cada etapa de transformação é realizada por um componente. Cada componente é abstraído como uma interface:
MediaSource
Decoder
Renderer
Encoder
MediaTarget
Ao usar suas próprias implementações de componentes, verifique se a saída de um componente corresponde à entrada esperada de um próximo componente. Por exemplo, se você estiver usando um Encoder
personalizado (AV1?), Verifique se ele aceita qualquer Renderer
de formato de quadro que produza ( GlSurface
, ByteBuffer
) e sai o que MediaTarget
espera como uma entrada.
Os componentes personalizados podem ser usados no TrackTransform
s abaixo do método de transformação de "baixo nível":
transform ( requestId ,
List < TrackTransform > trackTransforms ,
listener ,
granularity )
Esta API permite definir componentes e parâmetros por faixa de mídia, permitindo operações baseadas em faixas, como faixas de muxing/desmembamento, transcodificando diferentes faixas de maneira diferente, alterando a ordem de trilha etc.
Você pode usar filtros personalizados para modificar quadros de vídeo/áudio. Se você estiver escrevendo um filtro de vídeo personalizado, implemente a interface GlFilter
para fazer operações extras de desenho do OpenGL. Se você precisar alterar a forma como o quadro de vídeo de origem é renderizado em um quadro de vídeo de destino, implemente a interface GlFrameRender
. Para filtro de áudio, implemente BufferFilter
.
A Litr agora possui 40 novos filtros de vídeo acelerados da GPU portados dos projetos MP4Composer-Android e Android-Gpuimage. Você também pode criar seu próprio filtro simplesmente configurando o VideoFRameRenderFilter com seu shader personalizado, sem codificação extra!
Todos os filtros de vídeo/áudio ao vivo na biblioteca "Filter Pack", que está disponível 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 >
Você pode passar em uma lista de filtros ao transformar um vídeo ou faixa de áudio. Lembre -se de que os filtros serão aplicados na ordem em que estão na lista, portanto, ordenar assuntos.
MediaTransformer
não é muito intencionalmente um singleton, para permitir uma fácil zombaria em testes de unidade. Também há MockMediaTransformer
para testes de interface do usuário, que podem "reproduzir" uma sequência de retornos de chamada do ouvinte.
A lógica de negócios central no LITR é bem coberta por testes de unidade. O LITR foi projetado para usar o padrão de injeção de dependência, o que facilita a gravação de testes de JVM com dependências ridicularizadas. Usamos a estrutura da Mockito para zombar.
O Litr vem com um aplicativo de demonstração bastante útil, que permite transcodificar faixas de vídeo/áudio com diferentes parâmetros, além de fornecer código de amostra.
Leia contribuindo.md para obter detalhes sobre nosso código de conduta e o processo para enviar solicitações de puxar para nós.
Para as versões disponíveis, consulte as tags neste repositório.
Você pode usar as compilações no instantâneo para testar as mais recentes alterações não lançadas. Um novo instantâneo é publicado após cada mesclagem para a filial principal pelo fluxo de trabalho de ação do Implant Snapshot Github.
Basta adicionar o repositório Sonatype Snapshot aos seus scripts gradle:
repositories {
maven {
url " https://oss.sonatype.org/content/repositories/snapshots/ "
}
}
Você pode encontrar a versão mais recente do instantâneo a ser usada no arquivo gradle.properties.
Veja também a lista de colaboradores que participaram deste projeto.
Este projeto está licenciado sob a licença BSD 2 -cláusulas - consulte o arquivo de licença para obter detalhes