, О MemoryFile, вы пробовали это? Использует ли он много памяти? Пожалуйста, поделитесь кодом для этого. Вы можете использовать мой репозиторий для этого.
Проблема
Чтобы получить Uri для выбора, у нас все работает нормально (решение доступноВот)Что касается самой обрезки, мы не смогли найти ни одной хорошей библиотеки с разрешительной лицензией, за исключением одной под названием
"K4l-видео-триммер" , Например, библиотека «FFmpeg» считается недопустимой, поскольку она использует GPLv3, что требует, чтобы приложение, использующее ее, также было открытым исходным кодом. Кроме того, как я читал, это занимает довольно много (около 9 МБ).К сожалению, эта библиотека (k4l-video-trimmer) очень старая и не обновлялась годами, поэтому пришлось ее раскошелиться (
Вот), чтобы справиться с этим приятно. Он использует открытую библиотеку под названием"Mp4parser" сделать обрезку.Проблема в том, что эта библиотека может обрабатывать только файлы, а не
или жеUri
таким образом, даже образец может дать сбой при выборе элементов, которые недоступны, как обычный файл, или даже иметь пути, которые он не может обработать. Я знаю, что во многих случаях возможно получить путь к файлу, но во многих других случаях это не так, и я также знаю, что можно просто скопировать файл (InputStream
Вот), но это не очень хорошее решение, так как файл может быть большим и занимать много места, даже если он уже доступен.Что я пробовал
В файле "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 [