С помощью FFmpeg будет реализована утилита для конвертирования видео в нужный формат
121 Обзор проекта
Основная проблема: чтобы написать конфиг для рендера видео в нужный нам формат, нужно потратить крайне много времени и сил
Поэтому хочется сделать простой интерфейс, в который мы зададим только основные параметры и получим на выходе нужное нам видео
И так же в самом перспективном варианте нужно будет сделать так, чтобы приложение под капотом выполняло и другие задачи пользователя по выбору (от других инструментов)
122 Наивная реализация
Первым делом нужно добавить библиотеку, которая позволит реализовать вывод нужных нам вопросов в консоль и получить эти данные
И вот представлен пример реализации программы в 43 строчки кода. Это функция, которая принимает в себя в первой части ввод пользовательских данных, во второй выполняет саму внутреннюю логику, а в третьей выдаёт логи о результатах выполнения.
Однако нужно ещё и сказать про большое количество неудобств, вызыванных такой быстрой реализацией:
У нас ограниченный набор настроек . В res мы задали их только под один конкретный случай - выбор разрешения у видео (без возможностей добавить то же сжатие)
Разделение зависимостей прямо внутри программы. У нас она состоит из получения данных от пользователя, обработки этих данных и логов
Изменение этих зависимостей. Если нам нужно изменить или дополнить логику для них (например, добавить уведомление в телеграм)
Однако, если посмотреть на эту программу с точки зрения микросервиса, то нам будет просто необходимым добавление абстракций, потому что расширять проект будет просто невозможно без них
123 Старт приложения
Если в голову сразу не приходит архитектура приложения, то сначала можно написать наивную реализацию этого приложения
Будем использовать Template Method для реализации однотипных задач - работа с Ansible, FFmpeg и т.д.
Построение команды - builder
И на изображении показана структура проекта и его разделения. Всё будет собираться под одной оболочкой - App.
Создаём проект
Добавляем гитигнор
Настраиваем пути компиляции
Устанавливаем пакет для работы с запросами
Примерно так выглядит пакет
124 Обработка ввода
Примерно так выглядит проект на данном этапе реализации программы
И вот внутренний код
125 Обработка вывода
Нам нужны типы node.js
Код самого ввода:
126 Упражнение - Консольный вывод
Реализация консольного вывода в приложении. Тут так же можно дорасширить его, добавив вывод в телеграмме
127 Упражнение - Шаблонный метод исполнителя
Нам нужно реализовать абстрактный Command Executor, который последовательно должен представлять выполнение четырёх действий: ввод, построение команды, запуск потока, обработка потока
128 Упражнение - Builder для ffmpeg
Конкретно тут мы должны будем реализовать команду, которая будет содержать финализированный набор наших опций для отдельного элемента - ffmpeg-рендера
Конкретно нам нужно построить команду, которая будет хранить статичное значение и вводимые нами данные
В конфиге тайпскрипта нам нужно отключить необходимость инициализировать значения через конструктор (для использования паттерна билдер)
Этот класс будет отвечать за создание билдера запроса в ffmpeg на рендер видео
И в теории можно вызвать этот код так:
129 Работа с файлами
Дальше нам нужно реализовать код, который будет выполнять сбор путей, их билд и спавн.
Дальше мы сможем окончательно дореализовать ffmpeg
130 Упражнение - Ffmpeg executor
И дальше нам нужно реализовать executer, который будет исполнять наши логи
131 Финал проекта
Вот так в конечном итоге выглядит архитектура проекта:
Это структура нашего проекта:
Все вызываемые команды (ffmpeg, dir) находятся в commands
Вся основная реализация проекта (идентичная для всех команд) находится в папке core
В out располагается инструмент вывода у программы
Через App.ts у нас идёт запуск проекта (App.js нужно врубать в консоли)
Вот так выглядит App.ts, через который вызывается весь наш проект:
Так же очень легко можно дописать дополнительную реализацию Dir-утилиты
Вот так выглядит изменённый App.ts, в котором находится вызов теперь не FFmpeg, а Dir-утилиты