Usando o mp4parser, como posso lidar com os vídeos retirados do Uri e do ContentResolve

Fund

Queremos permitir que o usuário escolha um vídeo em qualquer aplicativo e, em seguida, apare um vídeo com no máximo 5 segundos.

O problem

Para selecionar um Uri, nós funcionamos bem (solução disponívelAqu).

Quanto ao corte em si, não conseguimos encontrar uma boa biblioteca que possua licença permissiva, exceto uma chamada "aparador de vídeo k4l". A biblioteca "FFmpeg", por exemplo, é considerada sem permissão, pois usa a GPLv3, que exige que o aplicativo que a usa também seja de código aberto. Além disso, como li, é preciso muito (cerca de 9 MB).

Infelizmente, esta biblioteca (k4l-video-trimmer) é muito antiga e não foi atualizada há anos, então tive que bifurcá-la Aqu) para lidar bem com isso. Ele usa uma biblioteca de código aberto chamada "mp4parser" para fazer o corte.

O problema é que esta biblioteca parece capaz de lidar apenas com arquivos, e não umUri ouInputStream, portanto, mesmo a amostra pode falhar ao selecionar itens que não podem ser acessados como um arquivo normal ou ter caminhos que não podem ser manipulados. Sei que em muitos casos é possível obter o caminho de um arquivo, mas em muitos outros casos não é, e também sei que é possível copiar o arquivo Aqu), mas essa não é uma boa solução, pois o arquivo pode ser grande e ocupar muito espaço, mesmo que já esteja acessíve

O que eu tentei

Existem dois locais em que a biblioteca usa um arquivo:

No arquivo "K4LVideoTrimmer", na função "setVideoURI", que apenas mostra o tamanho do arquivo a ser mostrado. Aqui a solução é bastante fácil, baseada em Documentação do Google:

public void setVideoURI(final Uri videoURI) {
    mSrc = videoURI;
    if (mOriginSizeFile == 0) {
        final Cursor cursor = getContext().getContentResolver().query(videoURI, null, null, null, null);
        if (cursor != null) {
            int sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE);
            cursor.moveToFirst();
            mOriginSizeFile = cursor.getLong(sizeIndex);
            cursor.close();
            mTextSize.setText(Formatter.formatShortFileSize(getContext(), mOriginSizeFile));
        }
    }
 ...

No arquivo "TrimVideoUtils", em "startTrim", que chama a função "genVideoUsingMp4Parser". Lá, ele chama a biblioteca "mp4parser" usando:

Movie movie = MovieCreator.build(new FileDataSourceViaHeapImpl(src.getAbsolutePath()));

Diz que eles usamFileDataSourceViaHeapImpl (da biblioteca "mp4parser") para evitar o OOM no Android, então decidi ficar com el

Thing é, existem 4 CTORS para ele, todos esperam alguma variação de um arquivo: File, filePath, FileChannel, FileChannel + fileNam

As questõe Existe uma maneira de superar isso?

Talvez implementarFileChannel e simule um arquivo real usandoContentResolver eUri? Acho que pode ser possível, mesmo que isso signifique reabrir o InputStream quando necessário ...

Para ver o que eu consegui, você pode clonar o projetoAqu. Apenas saiba que ele não faz nenhum corte, pois o código para ele no arquivo "K4LVideoTrimmer" é comentado:

//TODO handle trimming using Uri
//TrimVideoUtils.startTrim(file, getDestinationPath(), mStartPosition, mEndPosition, mOnTrimVideoListener);
Existe talvez uma alternativa melhor a essa biblioteca de aparamentos, que também é permissiva (significado das licenças do Apache2 / MIT, por exemplo)? Um que não tem esse problema? Ou talvez até algo do próprio framework Android? Eu acho que MediaMuxer class poderia ajudar (como escritoAqu), mas acho que pode precisar da API 26, enquanto precisamos lidar com a API 21 e acima ...

EDITAR

Pensei ter encontrado uma solução usando uma solução diferente para aparar e escrevi sobre elaAqu, mas infelizmente não consegue lidar com alguns vídeos de entrada, enquantomp4parser library pode lidar com ele

Entre em contato se for possível modificarmp4parser para lidar com esses vídeos de entrada, mesmo que seja do Uri e não de um arquivo (sem uma solução alternativa de copiar apenas para um arquivo de vídeo

questionAnswers(1)

yourAnswerToTheQuestion