Utilizando mp4parser, ¿cómo puedo manejar los videos tomados de Uri y ContentResolver?

Fond

Queremos permitir que el usuario elija un video de cualquier aplicación, y luego recortar un video para que tenga una duración máxima de 5 segundos.

El problem

Para que se seleccione un Uri, logramos que funcione bien (solución disponibleaqu).

n cuanto al recorte en sí, no pudimos encontrar ninguna buena biblioteca que tenga licencia permisiva, excepto una llamada "k4l-video-trimmer" @. La biblioteca "FFmpeg", por ejemplo, no se considera permiso ya que usa GPLv3, que requiere que la aplicación que lo usa también sea de código abierto. Además, como he leído, se necesita bastante (alrededor de 9 MB).

Sadly, esta biblioteca (k4l-video-trimmer) es muy antigua y no se actualizó en años, así que tuve que bifurcarla aqu) para manejarlo bien. Utiliza una biblioteca de código abierto llamada "mp4parser" para hacer el recorte.

Problema es que esta biblioteca parece ser capaz de manejar solo archivos, y no unaUri oInputStream, por lo que incluso la muestra puede bloquearse al seleccionar elementos que no son accesibles como un archivo normal, o incluso tienen rutas que no puede manejar. Sé que en muchos casos es posible obtener una ruta de acceso de un archivo, pero en muchos otros casos no lo es, y también sé que es posible copiar el archivo aqu), pero esta no es una buena solución, ya que el archivo podría ser grande y ocupar mucho espacio aunque ya sea accesible.

Lo que he probado

Hay 2 lugares en los que la biblioteca usa un archivo:

En el archivo "K4LVideoTrimmer", en la función "setVideoURI", que solo muestra el tamaño del archivo. Aquí la solución es bastante fácil, basada en Documentación de 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));
        }
    }
 ...

En el archivo "TrimVideoUtils", en "startTrim" que llama a la función "genVideoUsingMp4Parser". Allí, llama a la biblioteca "mp4parser" usando:

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

Dice que usanFileDataSourceViaHeapImpl (de la biblioteca "mp4parser") para evitar OOM en Android, así que decidí quedarme con él.

Thing es que hay 4 CTORS para ello, todos esperan alguna variación de un archivo: File, filePath, FileChannel, FileChannel + fileName.

Las pregunta¿Hay una manera de superar esto

Quizás implementeFileChannel y simular un archivo real, usandoContentResolver yUri? Supongo que podría ser posible, incluso si eso significa volver a abrir InputStream cuando sea necesario ...

Para ver lo que conseguí, puedes clonar el proyectoaqu. Solo sepa que no hace ningún recorte, ya que el código para ello en el archivo "K4LVideoTrimmer" está comentado:

//TODO handle trimming using Uri
//TrimVideoUtils.startTrim(file, getDestinationPath(), mStartPosition, mEndPosition, mOnTrimVideoListener);
¿Existe quizás una mejor alternativa a esta biblioteca de recorte, que también es permisiva (significado de las licencias Apache2 / MIT, por ejemplo)? ¿Uno que no tiene este problema? ¿O tal vez incluso algo del propio marco de Android? Yo creo que MediaMuxer class podría ayudar (como está escritoaqu), pero creo que podría necesitar API 26, mientras que necesitamos manejar API 21 y superior ...

EDITAR

Pensé que había encontrado una solución usando una solución diferente para recortarse, y escribí sobre elloaqu, pero lamentablemente no puede manejar algunos videos de entrada, mientras quemp4parser library puede manejarlos.

Por favor, avíseme si es posible modificarmp4parser para manejar tales videos de entrada incluso si es de Uri y no de un archivo (sin una solución alternativa de solo copiar a un archivo de video).

Respuestas a la pregunta(1)

Su respuesta a la pregunta