Продолжаем работать с видосиками. У меня недавно был случай что потребовалось нарезать один видео файл на много маленьких файлов вырезая ненужные части. И я такое запедалил с помощью замечательной библиотеки от Google которая называется mp4parser.
Эта библиотека позволяет помимо нарезки так же:
— соединять файлы у которых одинаковые настройки енкодинга;
— накладывать аудио дорожку на видео;
— изменение или добавление меты;
Библиотека очень мощная, вот прям не могу даже ничего плохого про нее сказать. Очень быстро справляется со всеми задачами, прямо вот в долю секунды. Однажды пробовал нарезать огромный видео файл на несколько частей, так либа справлялась за 2 — 3 секунды, даже боюсь представить как они это сделали, там реально какая-то магия.
app/build.gradle
По традиции изначально подключаем библиотеки, у нас их будет две, одни это androidx, а вторая mp4parser.
RangesModel.kt
В этой модели у нас будет в конструкторе передаваться название файла который будем создавать после нарезки, так же начальное время видоса, с какого момента резать и до какого момента резать. То есть если видео допустим длится 10 минут, а мы хотим вырезать видео с 3 секунды и до 8 секунды, будем передавать в startTime = 3, а в endTime = 8 и на выходе получим видео в 5 секунд в котором будет кусок видоса.
TrimmerEndWorkListener.kt
Дальше создадим один лисенер который будет нам возвращать статусы по поводу нарезки видео из самого класса описывающего работу по нарезке. Будет возвращат нам ошибки и по окончанию нарезки будет возвращать нам видос и рендж с которым было нарезанно видео.
Далее опишем сам класс по нарезке видео. Этот код в принципе довольно распостраненный, его можно найти в куче проектов на github'e, я его немного модифицировал для своих нужд, по этому он чуть-чуть выглядеть будет иначе. Но основной функционал стандартный для этой библиотеки.
VideoTrimmer.kt
В кратце если сказать что тут происходит — то тут в конструктор мы передаем контекст для работы с путями в файловой системе, передаем файл который мы будем нарезать, и коллбек для получения результатов по окончанию работы библиотеки. Дальше мы в конструкторе получаем длинну видео, создаем трек с помощью которого дальше нарезаем в цикле видео по ренжам которые мы задали. Так же мы проверяем что у нас endTime не больше чем startTime, корректируем ренжи если это требуется и потом уже нарезаем видео.
Если все хорошо, и видео нормально записалось без каких либо проблем, мы получаем коллбек в активити что все ок, если нет то получаем эксепшены в которых понятно в чем проблема. Если более детально описать то
Если более детально разложить по методам, то это выглядит немного сложнее. В конструкторе init — мы проверяем длинну видео, что бы она была не 0, если все нормально то записываем длинну видео и дальше переходим в startTrim — который запускает если видео файл корректный — метод по нарезке genVideoUsingMp4Parser, иначе если файл битый или у него какие-то проблемы с метой, try выкинет эксепшн в catch и нам прилетит колбек с ексепшином о том что случилось во время старта нарезки видео.
— genVideoUsingMp4Parser — самый главный метод в данном классе. В нем мы создаем инстанс MovieCreator в который передаем путь к файлу который мы хотим нарезать, создаем треки исходя из этого файла. Далее корректируем тайминг у видео, если это требуется, бывает такое что тайминг уже откорректирован у видео, на пример если оно было уже пропущено через эту библиотеку. Далее исходя из треков которые мы создали ранее на основе видео в цикле нарезаем видео. По окончанию всех действий над видео, мы записываем в наш инстанс MovieCreator начало видео с какого момента мы будем писать видео в файл, и конец видео на котором у нас будет видео заканчиваться. Дальше мы записываем ренжи и видео в отдельный файл и если все прошло успешно то мы отправляем коллбек в активити, если же на каком-то из этих этапов у нас произошла ошибка, то кидаем туда ексепшн.
— correctTimeToSyncSample — здесь мы пытаемся найти трек с синхронизированными сэмплами. Тут мы должны убедиться, что начало нового фрагмента точно тот кадр который был указан в ренжах, что бы не обрезать ничего лишнего. Это стандартный метод который описан в документации к библиотеке mp4parser.
activity_main.xml
Наше приложение будет иметь два текстовых поля и два поля для ввода времени начала набрезки и конца нарезки видео. Так же у нас будет кнопка по нажатию на которую у нас будет вызываться метод startTrim и будет происходится нарезка видео.
MainActivity.kt
В onCreate мы задаем файл который мы будем обрезать, я решил что бы не добавлять лишнего ничего просто загружу файл на девайс и с памяти девайса буду брать его. Файл для примера можно скачать отсюда. Это видео должно быть загружено в папку /storage/emulated/0/Android/data/dajver.com.videotrimmerexample/files/Download/. Если есть большое желание то можно переделать в выбор из галереи например. Так вот, получаем видео, дальше получаем длинну видео с помощью метода getFileDuration() и отображаем ее в поле для ввода endTime. По клику на trimButton мы запускаем нашего триммера, подписываемся на коллбек, передаем файл который нарезаем и создаем методы лисенеров которые попросит создать студия.
И после того как у нас вернется успешный результат о том что видео нарезано и все хорошо — мы открываем видео в видео плеере с помощью интента.
Вот такая штуковина эта нарезка видео с помощью mp4parser. Надеюсь кому-то это пригодится.
Исходники:
GitHub
Эта библиотека позволяет помимо нарезки так же:
— соединять файлы у которых одинаковые настройки енкодинга;
— накладывать аудио дорожку на видео;
— изменение или добавление меты;
Библиотека очень мощная, вот прям не могу даже ничего плохого про нее сказать. Очень быстро справляется со всеми задачами, прямо вот в долю секунды. Однажды пробовал нарезать огромный видео файл на несколько частей, так либа справлялась за 2 — 3 секунды, даже боюсь представить как они это сделали, там реально какая-то магия.
app/build.gradle
По традиции изначально подключаем библиотеки, у нас их будет две, одни это androidx, а вторая mp4parser.
RangesModel.kt
В этой модели у нас будет в конструкторе передаваться название файла который будем создавать после нарезки, так же начальное время видоса, с какого момента резать и до какого момента резать. То есть если видео допустим длится 10 минут, а мы хотим вырезать видео с 3 секунды и до 8 секунды, будем передавать в startTime = 3, а в endTime = 8 и на выходе получим видео в 5 секунд в котором будет кусок видоса.
TrimmerEndWorkListener.kt
Дальше создадим один лисенер который будет нам возвращать статусы по поводу нарезки видео из самого класса описывающего работу по нарезке. Будет возвращат нам ошибки и по окончанию нарезки будет возвращать нам видос и рендж с которым было нарезанно видео.
Далее опишем сам класс по нарезке видео. Этот код в принципе довольно распостраненный, его можно найти в куче проектов на github'e, я его немного модифицировал для своих нужд, по этому он чуть-чуть выглядеть будет иначе. Но основной функционал стандартный для этой библиотеки.
VideoTrimmer.kt
В кратце если сказать что тут происходит — то тут в конструктор мы передаем контекст для работы с путями в файловой системе, передаем файл который мы будем нарезать, и коллбек для получения результатов по окончанию работы библиотеки. Дальше мы в конструкторе получаем длинну видео, создаем трек с помощью которого дальше нарезаем в цикле видео по ренжам которые мы задали. Так же мы проверяем что у нас endTime не больше чем startTime, корректируем ренжи если это требуется и потом уже нарезаем видео.
Если все хорошо, и видео нормально записалось без каких либо проблем, мы получаем коллбек в активити что все ок, если нет то получаем эксепшены в которых понятно в чем проблема. Если более детально описать то
Если более детально разложить по методам, то это выглядит немного сложнее. В конструкторе init — мы проверяем длинну видео, что бы она была не 0, если все нормально то записываем длинну видео и дальше переходим в startTrim — который запускает если видео файл корректный — метод по нарезке genVideoUsingMp4Parser, иначе если файл битый или у него какие-то проблемы с метой, try выкинет эксепшн в catch и нам прилетит колбек с ексепшином о том что случилось во время старта нарезки видео.
— genVideoUsingMp4Parser — самый главный метод в данном классе. В нем мы создаем инстанс MovieCreator в который передаем путь к файлу который мы хотим нарезать, создаем треки исходя из этого файла. Далее корректируем тайминг у видео, если это требуется, бывает такое что тайминг уже откорректирован у видео, на пример если оно было уже пропущено через эту библиотеку. Далее исходя из треков которые мы создали ранее на основе видео в цикле нарезаем видео. По окончанию всех действий над видео, мы записываем в наш инстанс MovieCreator начало видео с какого момента мы будем писать видео в файл, и конец видео на котором у нас будет видео заканчиваться. Дальше мы записываем ренжи и видео в отдельный файл и если все прошло успешно то мы отправляем коллбек в активити, если же на каком-то из этих этапов у нас произошла ошибка, то кидаем туда ексепшн.
— correctTimeToSyncSample — здесь мы пытаемся найти трек с синхронизированными сэмплами. Тут мы должны убедиться, что начало нового фрагмента точно тот кадр который был указан в ренжах, что бы не обрезать ничего лишнего. Это стандартный метод который описан в документации к библиотеке mp4parser.
activity_main.xml
Наше приложение будет иметь два текстовых поля и два поля для ввода времени начала набрезки и конца нарезки видео. Так же у нас будет кнопка по нажатию на которую у нас будет вызываться метод startTrim и будет происходится нарезка видео.
MainActivity.kt
В onCreate мы задаем файл который мы будем обрезать, я решил что бы не добавлять лишнего ничего просто загружу файл на девайс и с памяти девайса буду брать его. Файл для примера можно скачать отсюда. Это видео должно быть загружено в папку /storage/emulated/0/Android/data/dajver.com.videotrimmerexample/files/Download/. Если есть большое желание то можно переделать в выбор из галереи например. Так вот, получаем видео, дальше получаем длинну видео с помощью метода getFileDuration() и отображаем ее в поле для ввода endTime. По клику на trimButton мы запускаем нашего триммера, подписываемся на коллбек, передаем файл который нарезаем и создаем методы лисенеров которые попросит создать студия.
И после того как у нас вернется успешный результат о том что видео нарезано и все хорошо — мы открываем видео в видео плеере с помощью интента.
Вот такая штуковина эта нарезка видео с помощью mp4parser. Надеюсь кому-то это пригодится.
Исходники:
GitHub
Комментариев нет:
Отправить комментарий