После недолгих поисков готового пакета на Golang по редактированию видео — я понял, что ничего более-менее дельного в открытом доступе нет. Для одного моего проекта я использовал Python библиотеку moviepy которая хоть и медленная, но выполняла все нужные мне задачи. Мне часто нужно обрезать видео, склеить видео фрагменты и другие рутинные задачи для которых лень открыть Premiere Pro.

Я решил создать свой собственный пакет для решения простых задач по видео редактированию. Название у него MovieGo (есть проект MoviePy от которого я и вдохновился).

Премиум 👑 канал по Golang

Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎

Подписаться на канал

Уроки, статьи и Видео

Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.

Go в ВК ЧАТ в Telegram


Поддержи проект на Github

Если тебе интересны такие проекты и ты хочешь увидеть их развитие, то не забудь поставить звездочку этому проекту на Github

Ссылка на пакет: https://github.com/mowshon/moviego

 

В основном «под капотом» у данного пакета лежит библиотека FFMPEG. Все манипуляции над видео выполняются через вызов нужных команд в консоль. Ниже будут предоставлены несколько примеров того, что можно сделать на текущий момент с этим пакетом.

Установка

Изменить размер видео в Golang

Структура Video от пакета MovieGo предоставляет три метода для изменения размера видео.

  • ResizeByWidth( новая ширина ) — данный метод меняет ширину видео и автоматически, сохраняя пропорции, меняет и высоту видео;
  • ResizeByHeight( новая высота ) — метод меняет высоту видео и обновляет ширину сохраняя пропорции;
  • Resize( новая ширина, новая высота ) — метод меняет ширину и высоту видео.

Пример кода на Golang как менять ширину и высоту видео:

Если выполнить данные манипуляции в FFMPEG, то команды выглядели бы следующим образом:

Обрезать видео на фрагменты в Golang

Самая частая задача которая встречается, это обрезка основного видео на части. Для этого мы будем использовать метод SubClip(начало, конец) чтобы обрезать кусочки видео из нашего основного видео.

Эквивалент данного действия в FFMPEG:

Объединение нескольких видео в одно в Golang

Конкатенация нескольких видео в одно, так же является частой задачей при редактировании видео. Для этой задачи у нас есть функция Concat которая возвращает структуру Video и ошибку (если такая возникла) и уже к ней применяем метод .Out("название-файла.mp4").Run() для рендеринга финального видео.

Функция Concat принимает слайс типа []moviego.Video в котором добавляем нужные нам фрагменты видео. Можно применяет различные доступные эффекты к видео из слайса. Функция будет рендерить их по очереди потом объединит их в одно видео.

Добавление переходов Fade-in, Fade-out для видео

Здесь представлены 4 метода работы с эффектом Fade (In, Out). Два метода для видео и два метода для аудио-дорожки из видео.

  • .FadeIn( начало, продолжительность ) — добавляет эффект Fade-In (переход от полностью черного экрана к нормальному видео);
  • .FadeOut( длительность до конца видео ) — метод добавляет эффект Fade-Out, от нормальной картинки постепенно затухает в полностью черный экран. В зависимости от указанной «длительности» затухания, данный эффект добавится в конце видео, его начало будет в отметке = (videoDuration - fadeOutDuration);
  • .AudioFadeIn( начало, длительность ) — как и в случае с методом FadeIn для видео, данный метод полностью убавит звук в начале видео и постепенно вернет звук в норму в зависимости от указанной «длительности» эффекта;
  • .AudioFadeOut( длительность ) — данный метод добавит эффект «затухания» аудио-дорожки в конце видео.

Как вы уже заметили, благодаря этому пакету можно комбинировать несколько методов в цепи вызовов друг за другом при этом не меняя состояние структуры полученную от первого вызова видео файла.

Создание скриншота из видео в Golang

Тут все весьма просто. Берем метод Screenshot и указываем ему нужную нам секунду из видео и делаем скриншот.

Одна из «фишек» этого метода и пакета в целом, это возможность получить скриншот после всей цепи примененных изменений к основному видео. Если вы применили эффект FadeIn с длительностью в 6 секунд и попробуйте сделать скриншот во 2 секунде видео, то получите вот такой результат:

simple-screen.png (Без изменений) screen.png (FadeIn)

Итоги

Данный пакет еще находится в стадии развития, я постараюсь улучшить функционал по мере появления новых задач и свободного времени. Код далёк от идеала и если у вас есть желание, то можете загрузить Pull-Request с предложениями по улучшению кода. Надеюсь данный пакет будет вам полезен!

Если будут вопросы, то жду вас в разделе: Issues от Github