Редактически -это инструмент и структура для декларативного NLE ( нелинейное редактирование видео ) с использованием node.js и ffmpeg. Редактически позволяет легко и программно создавать видео из набора клипов, изображений, аудио и названий , с плавными переходами и музыкой.
Редактически имеет простой CLI для быстрого сборки видео из набора клипов или изображений, или вы можете использовать его более гибкий API JavaScript.
Вдохновленный FFMPEG-CONCAT, Editlly намного быстрее и не требует большого хранилища, поскольку он использует потоковое редактирование. Редактически направлены на то, чтобы быть очень расширяемым и функционировать богатым с помощью подключаемого интерфейса для добавления нового динамического контента .

Этот GIF / YouTube был создан с помощью этой команды: «Редактически CommonFeatures.json5». Смотрите больше примеров здесь.
cutFrom / cutTo с duration каждого зажимаVideo must be 1337x1000 30fps )Смотрите примеры
ffmpeg (и ffprobe ) установлен и доступен в PATH npm i -g editly
editly --help беги
Создайте простое рандомизированное редактирование видео из видео, изображений и текста с аудио -треком:
editly
title: ' My video '
clip1.mov
clip2.mov
title: ' My slideshow '
img1.jpg
img2.jpg
title: ' THE END '
--fast
--audio-file-path /path/to/music.mp3Или создать MP4 (или GIF) из спецификации JSON или JSON5 (JSON5 - это просто более удобный формат JSON) :
editly my-spec.json5 --fast --keep-source-audio --out output.gifДля примеров того, как сделать спецификацию редактирования JSON, см. Ниже или примеры.
--fast , это будет по умолчанию использовать ширину , высоту и частоту кадров из первого входного видео. Все остальные клипы будут преобразованы в эти измерения. Вы, конечно, можете переопределить любые или все эти параметры.
--audio-file-path в видеофайле. Обязательно уважайте их лицензию! import editly from 'editly' ;
// See editSpec documentation
await editly ( editSpec ) Редактировать характеристики - это объекты JavaScript / JSON, описывающие всю операцию редактирования со следующей структурой:
{
outPath ,
width ,
height ,
fps ,
allowRemoteRequests : false ,
defaults : {
duration : 4 ,
transition : {
duration : 0.5 ,
name : 'random' ,
audioOutCurve : 'tri' ,
audioInCurve : 'tri' ,
} ,
layer : {
fontPath ,
// ...more layer defaults
} ,
layerType : {
'fill-color' : {
color : '#ff6666' ,
}
// ...more per-layer-type defaults
} ,
} ,
clips : [
{
transition ,
duration ,
layers : [
{
type ,
// ...more layer-specific options
}
// ...more layers
] ,
}
// ...more clips
] ,
audioFilePath ,
loopAudio : false ,
keepSourceAudio : false ,
clipsAudioVolume : 1 ,
outputVolume : 1 ,
audioTracks : [
{
path ,
mixVolume : 1 ,
cutFrom : 0 ,
cutTo ,
start : 0 ,
} ,
// ...more audio tracks
] ,
audioNorm : {
enable : false ,
gaussSize : 5 ,
maxGain : 30 ,
}
// Testing options:
enableFfmpegLog : false ,
verbose : false ,
fast : false ,
}| Параметр | CLI эквивалент | Описание | По умолчанию | |
|---|---|---|---|---|
outPath | --out | Выходной путь (MP4, MKV), также может быть .gif | ||
width | --width | Ширина, в которую будут преобразованы все носители | 640 | |
height | --height | Высота, в которую будут преобразованы все носители | Авто на основе width и соотношения сторон первого видео | |
fps | --fps | FPS, в которые будут преобразованы все видео | Первое видео FPS или 25 | |
customOutputArgs | Укажите пользовательский выход вывода Codec/Format аргументы для FFMPEG (см. Пример) | Авто (H264) | ||
allowRemoteRequests | --allow-remote-requests | Разрешить удаленные URL -адреса в качестве путей | false | |
fast | --fast - -f | Быстрый режим (низкое разрешение и FPS, полезные для быстрого предварительного просмотра ⏩) | false | |
defaults.layer.fontPath | --font-path | Установить шрифт по умолчанию в .ttf | Системный шрифт | |
defaults.layer.* | Установите любой параметр слоя, который будут наследовать все слои | |||
defaults.duration | --clip-duration | Установите продолжительность клипа по умолчанию для клипов, которые не имеют собственной продолжительности | 4 | раздел |
defaults.transition | Объект { name, duration } описывающее переход по умолчанию. Установить на NULL , чтобы отключить переходы | |||
defaults.transition.duration | --transition-duration | Продолжительность перехода по умолчанию | 0.5 | раздел |
defaults.transition.name | --transition-name | Тип перехода по умолчанию. Смотрите типы перехода | random | |
defaults.transition.audioOutCurve | По умолчанию кривая исчезновения в аудио -перекрестном исчезновении | tri | ||
defaults.transition.audioInCurve | По умолчанию затухание в кривой в аудио -перекрестном исчезновении | tri | ||
clips[] | Список объектов клипа, которые будут воспроизведены последовательно. Каждый клип может иметь один или несколько слоев. | |||
clips[].duration | Продолжительность клипа. См. defaults.duration . В случае неретации продолжительность клипа будет от первого видео -слоя . | defaults.duration | ||
clips[].transition | Укажите переход в конце этого клипа. См. defaults.transition | defaults.transition | ||
clips[].layers[] | Список слоев в текущем зажиме, которые будут наложены в их естественном порядке (конечный слой сверху) | |||
clips[].layers[].type | Тип слоя, см. Ниже | |||
clips[].layers[].start | В какое время в клипе, если этот слой запустит | раздел | ||
clips[].layers[].stop | В какое время в клипе, если этот слой остановится | раздел | ||
audioTracks[] | Список произвольных аудио треков. Смотрите аудио треки. | [] | ||
audioFilePath | --audio-file-path | Установите аудио -трек для всего видео. Смотрите также аудио треки | ||
loopAudio | --loop-audio | Зацикливание аудио -трека, если он короче, чем видео? | false | |
keepSourceAudio | --keep-source-audio | Сохранять источник аудио от clips ? | false | |
clipsAudioVolume | Объем звука от clips относительно audioTracks . Смотрите аудио треки. | 1 | ||
outputVolume | --output-volume | Настроить выходной объем (окончательный этап). Смотрите пример | 1 | например, 0.5 или 10dB |
audioNorm.enable | Включить нормализацию звука? Смотрите нормализацию звука. | false | ||
audioNorm.gaussSize | Нормализация звука размер Гаусса. Смотрите нормализацию звука. | 5 | ||
audioNorm.maxGain | Нормализация звука максимально усиление. Смотрите нормализацию звука. | 30 |
transition.name directional-left directional-right directional-up directional-down random dummy
См. Примеры и Commonfeatures.json5
Для слоев видео, если указан родительский clip.duration clip.duration Если устанавливается cutFrom / cutTo , полученный сегмент ( cutTo - cutFrom ) будет замедлен / ускорен для подгонки clip.duration . Если у слоя есть звук, он будет сохранен (и смешан с другими звуковыми слоями, если они присутствуют).)
| Параметр | Описание | По умолчанию | |
|---|---|---|---|
path | Путь к видеофайлу | ||
resizeMode | Смотрите режимы изменения размера | ||
cutFrom | Значение времени для сокращения | 0 | раздел |
cutTo | Значение времени для сокращения | конец видео | раздел |
width | Ширина по сравнению с шириной экрана | 1 | 0 до 1 |
height | Высота по сравнению с высотой экрана | 1 | 0 до 1 |
left | X-позиция по сравнению с шириной экрана | 0 | 0 до 1 |
top | Y-позиция относительно высоты экрана | 0 | 0 до 1 |
originX | X якорь | left | left или right |
originY | Y якорь | top | top или bottom |
mixVolume | Относительный громкость при смешивании аудио -трека этого видео с другими | 1 |
Аудио слои будут смешиваться вместе. Если устанавливается cutFrom / cutTo , полученный сегмент ( cutTo - cutFrom ) будет замедлен / ускорен для подгонки clip.duration . Застреленная/ускоренная операция ограничена значениями от 0.5x до 100x .
| Параметр | Описание | По умолчанию | |
|---|---|---|---|
path | Путь к аудиофайлу | ||
cutFrom | Значение времени для сокращения | 0 | раздел |
cutTo | Значение времени для сокращения | clip.duration | раздел |
mixVolume | Относительный объем при смешивании этой аудио -трека с другими | 1 |
Это особый случай audioTracks , который облегчает запуск звука относительно времени начала clips без необходимости рассчитать глобальное время начала.
detached-audio обладает точно такими же свойствами, что и Audiotracks, за исключением того, что время start относительно начала клипа.
Пример отдельных аудиоте
Полное изображение
| Параметр | Описание | По умолчанию | |
|---|---|---|---|
path | Путь к файлу изображения | ||
resizeMode | Смотрите режимы изменения размера |
См. Также см. Параметры Кена Бернса.
Наложение изображения с помощью пользовательской позиции и размера на экране. Примечание. Если вы хотите использовать анимированные GIF -файлы, используйте video вместо этого.
| Параметр | Описание | По умолчанию | |
|---|---|---|---|
path | Путь к файлу изображения | ||
position | См. Параметр позиции | ||
width | Ширина (от 0 до 1), где 1 ширина экрана | ||
height | Высота (от 0 до 1) где 1 - высота экрана |
См. Также Параметры Кена Бернса.
fontPath - см. defaults.layer.fontPathtext - текст заголовка, чтобы показать, держите его короткимtextColor - по умолчанию #ffffffposition - см. Параметр позицииСм. Также Параметры Кена Бернса
fontPath - см. defaults.layer.fontPathtext - текст подзаголовок, чтобы показатьtextColor - по умолчанию #ffffff Название с фоном
text - см. title типаtextColor - см. title типаbackground { type, ... } -см. Тип radial-gradient , linear-gradient или fill-colorfontPath - см. title типа fontPath - см. defaults.layer.fontPathtexttextColor - по умолчанию #ffffffbackgroundColor - по умолчанию #d02a42position - см. Параметр позиции fontPath - см. defaults.layer.fontPathtextfontSizecharSpacingcolorposition - см. Параметр позиции color - цвет для заполнения фона, по умолчанию: рандомизировать colors - массив двух цветов, по умолчанию: рандомизируйте colors - массив двух цветов, по умолчанию: рандомизируйте ???
Смотрите CustomCanvas.js
func - пользовательская функция JavaScript См. Customfabric.js
func - пользовательская функция JavaScript Загружает шейдер GLSL. См. Gl.json5 и Rainbow-Colors.frag
fragmentPathvertexPath (необязательно) Свойство audioTracks можно при желании содержать список объектов, в которых указываются аудио треки, которые можно запустить в произвольное время в конечном видео. Эти треки будут смешиваться вместе ( mixVolume , указывающий относительное число для того, насколько громко по сравнению с другими треками). Поскольку аудио из clips будет смешиваться отдельно от audioTracks , clipsAudioVolume указывает объем комбинированного звука от clips относительно объема каждого из аудиоуров от audioTracks .
| Параметр | Описание | По умолчанию | |
|---|---|---|---|
audioTracks[].path | Путь файла для этого трека | ||
audioTracks[].mixVolume | Относительный объем для этого трека | 1 | |
audioTracks[].cutFrom | Значение времени для вырезания исходного файла из | 0 | раздел |
audioTracks[].cutTo | Значение времени для сокращения исходного файла на | раздел | |
audioTracks[].start | Сколько секунд в видео, чтобы начать этот аудио -трек | 0 | раздел |
Разница между audioTracks и Audio типа слоя состоит в том, что audioTracks будет продолжать играть через несколько clips и может начинать и останавливаться при необходимости.
См. Пример audioTracks
См. Также тип слоя «Отдельный автор» .
Вы можете включить нормализацию звука окончательного вывода аудио. Это полезно, если вы хотите достичь уклона звука (например, автоматически снижение объема всех других треков, когда высказывают голосовой запас).
Параметры audioNorm задокументированы здесь.
Пример уклонения звука
resizeMode - Как подготовить изображение на экран. Может быть одним из:
contain - все видео будет содержатся в рамке и в почтовом ящикеcontain-blur - как contain , но с размытой копией в качестве письмаcover - Видео подключено, чтобы покрыть весь экран (сохраненное соотношение сторон)stretch - Видео будет растянуто, чтобы покрыть весь экран (игнорируется соотношение сторон). По умолчанию contain-blur .
Видеть:
Определенные слои поддерживают параметр позиции
position может быть одним из любого:
top , bottom center , top-left , top-right , center-left , center-right , bottom-left , bottom-right{ x, y, originX = 'left', originY = 'top' } , где { x: 0, y: 0 } - верхний левый угол экрана, а { x: 1, y: 1 } - нижний правый угол, x относительно ширины видео, y к росте видео. originX и originY являются необязательными, и указывают происхождение позиции (позиция якоря) объекта.См. Position.json5
| Параметр | Описание | По умолчанию | |
|---|---|---|---|
zoomDirection | Направление масштабирования для Кена Бернса Эффект: in , out , left или null right отключить | ||
zoomAmount | Сумма увеличения для эффекта Кена Бернса | 0.1 |
Это должно помочь вам использовать редактивно в качестве контейнерного CLI, не беспокоясь о том, чтобы получить все правильные версии зависимостей в вашей системе.
$ git clone https://github.com/mifi/editly.git
$ cd editly/examples
$ git clone https://github.com/mifi/editly-assets.git assets
$ cd ..
$ docker-compose up
$ docker-compose run editly bash -c " cd examples && editly audio1.json5 --out /outputs/audio1.mp4 "
$ docker cp editly:/outputs/audio1.mp4 . Error: The specified module could not be found. , попробуйте: npm un -g editly && npm i -g --build-from-source editly (см. #15)/bin/sh: pkg-config: command not found , попробуйте использовать новую версию node.js lts Этот проект поддерживается мной один. Проект всегда останется свободным и открытым исходным кодом, но если он полезен для вас, подумайте о поддержке меня. :) Это даст мне дополнительную мотивацию, чтобы улучшить его.
PayPal
Этот пакет не будет существовать без поддержки и помощи от всех участников и спонсоров!
Особая благодарность:
Отправьте PR, если вы хотите поделиться своими видео или проектом, созданным здесь.
Сделано с ❤ в ??
Больше приложений от mifi.no
Следуйте за мной на GitHub, YouTube, IG, Twitter для более потрясающего контента!