, О MemoryFile, вы пробовали это? Использует ли он много памяти? Пожалуйста, поделитесь кодом для этого. Вы можете использовать мой репозиторий для этого.

ы хотим, чтобы пользователь мог выбрать видео из любого приложения, а затем обрезать его до максимум 5 секунд.

Проблема

Чтобы получить Uri для выбора, у нас все работает нормально (решение доступно

Вот)Что касается самой обрезки, мы не смогли найти ни одной хорошей библиотеки с разрешительной лицензией, за исключением одной под названием

"K4l-видео-триммер" , Например, библиотека «FFmpeg» считается недопустимой, поскольку она использует GPLv3, что требует, чтобы приложение, использующее ее, также было открытым исходным кодом. Кроме того, как я читал, это занимает довольно много (около 9 МБ).К сожалению, эта библиотека (k4l-video-trimmer) очень старая и не обновлялась годами, поэтому пришлось ее раскошелиться (

Вот), чтобы справиться с этим приятно. Он использует открытую библиотеку под названием"Mp4parser" сделать обрезку.Проблема в том, что эта библиотека может обрабатывать только файлы, а не

 или жеUriтаким образом, даже образец может дать сбой при выборе элементов, которые недоступны, как обычный файл, или даже иметь пути, которые он не может обработать. Я знаю, что во многих случаях возможно получить путь к файлу, но во многих других случаях это не так, и я также знаю, что можно просто скопировать файл (InputStreamВот), но это не очень хорошее решение, так как файл может быть большим и занимать много места, даже если он уже доступен.Что я пробовал

Есть 2 места, где библиотека использует файл:

В файле "K4LVideoTrimmer", в функции "setVideoURI", которая просто получает размер файла, который будет показан. Здесь решение довольно простое, основанное на

Документация GoogleВ файле «TrimVideoUtils», в «startTrim», который вызывает функцию «genVideoUsingMp4Parser». Там он вызывает библиотеку «mp4parser», используя::

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));
        }
    }
 ...

Это говорит о том, что они используют

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

 (из библиотеки "mp4parser"), чтобы избежать OOM на Android, поэтому я решил остаться с ним.FileDataSourceViaHeapImplДело в том, что для этого есть 4 CTORS, все ожидают некоторого изменения файла: File, filePath, FileChannel, FileChannel + fileName.

Вопросы

Есть ли способ преодолеть это?Может быть, реализовать

 и имитировать реальный файл, используяFileChannel а такжеContentResolver ? Я предполагаю, что это может быть возможно, даже если это означает повторное открытие InputStream при необходимости ...UriЧтобы увидеть, что у меня получилось, вы можете клонировать проект

Вот, Просто знайте, что это не делает никакой обрезки, поскольку код для этого в файле "K4LVideoTrimmer" прокомментирован:Возможно, есть лучшая альтернатива этой библиотеке обрезки, которая также является разрешающей (например, имеется в виду лицензии Apache2 / MIT)? Тот, у которого нет этой проблемы? Или, может быть, даже что-то из самого Android Framework? думаю

//TODO handle trimming using Uri
//TrimVideoUtils.startTrim(file, getDestinationPath(), mStartPosition, mEndPosition, mOnTrimVideoListener);
MediaMuxer класс может помочь (как написаноВот), но я думаю, что может потребоваться API 26, а нам нужно обработать API 21 и выше ...РЕДАКТИРОВАТЬ:

Я думал, что нашел решение, используя другое решение для обрезки себя, и написал об этом

Вот, но, к сожалению, он не может обрабатывать некоторые входные видео, в то время как библиотека может справиться с ними.mp4parserПожалуйста, дайте мне знать, если возможно изменить

 обрабатывать такие входные видео, даже если они из Uri, а не из File (без обходного пути простого копирования в видеофайл).mp4parserУпомянутый вами класс MediaMuxer поддерживается API 18 Onwards [

Ответы на вопрос(1)

Ваш ответ на вопрос