Editly es una herramienta y marco para la NLE declarativa ( edición de video no lineal ) utilizando Node.js y FFMPEG. Editelly le permite crear fácil y programáticamente un video a partir de un conjunto de clips, imágenes, audio y títulos , con transiciones suaves y música superpuesta.
Editor tiene una CLI simple para ensamblar rápidamente un video a partir de un conjunto de clips o imágenes, o puede usar su API JavaScript más flexible.
Inspirado en FFMPEG-Concat, Editly es mucho más rápido y no requiere mucho almacenamiento porque utiliza la edición de transmisión . Editly apunta a ser muy extensible y rico en funciones con una interfaz enchufable para agregar un nuevo contenido dinámico .

Este GIF / YouTube se creó con este comando: "Editty CommonFeature.json5". Vea más ejemplos aquí.
cutFrom / cutTo al segmento con duration de cada clipVideo must be 1337x1000 30fps )Ver ejemplos
ffmpeg (y ffprobe ) instalado y disponible en PATH npm i -g editly
Ejecutar editly --help para su uso
Cree una edición de video aleatorizada simple a partir de videos, imágenes y texto con una pista de audio:
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.mp3O crear un MP4 (o GIF) a partir de una especificación de edición JSON o JSON5 (JSON5 es solo un formato JSON más fácil de usar) :
editly my-spec.json5 --fast --keep-source-audio --out output.gifPara ver ejemplos de cómo hacer una especificación de edición JSON, consulte a continuación o ejemplos.
Sin --fast , se debe usar el ancho , la altura y la velocidad de cuadro del primer video de entrada. Todos los demás clips se convertirán a estas dimensiones. Por supuesto, puede anular cualquiera o todos estos parámetros.
--audio-file-path en el archivo de video. ¡Asegúrese de respetar su licencia! import editly from 'editly' ;
// See editSpec documentation
await editly ( editSpec ) Las especificaciones de edición son objetos JavaScript / JSON que describen la operación de edición completa con la siguiente estructura:
{
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 ,
}| Parámetro | CLI equivalente | Descripción | Por defecto | |
|---|---|---|---|---|
outPath | --out | Ruta de salida (MP4, MKV), también puede ser un .gif | ||
width | --width | Ancho al que todos los medios se convertirán en | 640 | |
height | --height | Altura a la que todos los medios se convertirán en | Auto basado en width y la relación de aspecto del primer video | |
fps | --fps | FPS que todos los videos se convertirán en | Primer video fps o 25 | |
customOutputArgs | Especificar argumentos de código de salida/formato de salida personalizados para FFMPEG (ver ejemplo) | Auto (H264) | ||
allowRemoteRequests | --allow-remote-requests | Permitir URL remotas como rutas | false | |
fast | --fast , -f | Modo rápido (baja resolución y FPS, útil para obtener una vista previa rápida ⏩) | false | |
defaults.layer.fontPath | --font-path | Establecer fuente predeterminada en un .ttf | Fuente del sistema | |
defaults.layer.* | Establezca cualquier parámetro de capa que heredarán todas las capas | |||
defaults.duration | --clip-duration | Establezca la duración del clip predeterminada para clips que no tienen una duración propia | 4 | segundo |
defaults.transition | Un objeto { name, duration } que describe la transición predeterminada. Establecer en NULL para deshabilitar las transiciones | |||
defaults.transition.duration | --transition-duration | Duración de transición predeterminada | 0.5 | segundo |
defaults.transition.name | --transition-name | Tipo de transición predeterminado. Ver tipos de transición | random | |
defaults.transition.audioOutCurve | Curva de desvanecimiento predeterminada en Audio Cross Fades | tri | ||
defaults.transition.audioInCurve | Fade predeterminado en curva en audio cruzado Fades | tri | ||
clips[] | Lista de objetos de clip que se reproducirán en secuencia. Cada clip puede tener una o más capas. | |||
clips[].duration | Duración del clip. Ver defaults.duration . Si no lo es, la duración del clip será la de la primera capa de video . | defaults.duration | ||
clips[].transition | Especifique la transición al final de este clip. Ver defaults.transition | defaults.transition | ||
clips[].layers[] | Lista de capas dentro del clip actual que se superpondrá en su orden natural (capa final en la parte superior) | |||
clips[].layers[].type | Tipo de capa, ver más abajo | |||
clips[].layers[].start | ¿A qué hora en el clip debería comenzar esta capa? | segundo | ||
clips[].layers[].stop | ¿A qué hora en el clip debería detener esta capa? | segundo | ||
audioTracks[] | Lista de pistas de audio arbitrarias. Ver pistas de audio. | [] | ||
audioFilePath | --audio-file-path | Establezca una pista de audio para todo el video. Ver también pistas de audio | ||
loopAudio | --loop-audio | ¿Loce la pista de audio si es más corto que el video? | false | |
keepSourceAudio | --keep-source-audio | ¿Mantener el audio de origen de clips ? | false | |
clipsAudioVolume | Volumen de audio de clips en relación con audioTracks . Ver pistas de audio. | 1 | ||
outputVolume | --output-volume | Ajustar el volumen de salida (etapa final). Ver ejemplo | 1 | por ejemplo, 0.5 o 10dB |
audioNorm.enable | Habilitar la normalización de audio? Ver Normalización de audio. | false | ||
audioNorm.gaussSize | Normalización de audio tamaño de gauss. Ver Normalización de audio. | 5 | ||
audioNorm.maxGain | Audio Normalización máxima ganancia. Ver Normalización de audio. | 30 |
transition.name puede ser cualquiera de las transiciones GL, o cualquiera de las siguientes: directional-left , directional-right , directional-up , directional-down , random o dummy .
Ver ejemplos y commonfeatures.json5
Para las capas de video, si se especifica clip.duration clip.duration Si se establece cutFrom / cutTo , el segmento resultante ( cutTo - cutFrom ) se ralentizará / acelerará para adaptarse clip.duration . Si la capa tiene audio, se mantendrá (y se mezclará con otras capas de audio si está presente).
| Parámetro | Descripción | Por defecto | |
|---|---|---|---|
path | Ruta al archivo de video | ||
resizeMode | Ver modos de cambio de tamaño | ||
cutFrom | Valor de tiempo para cortar de | 0 | segundo |
cutTo | Valor de tiempo para cortar | final del video | segundo |
width | Ancho relativo al ancho de la pantalla | 1 | 0 a 1 |
height | Altura en relación con la altura de la pantalla | 1 | 0 a 1 |
left | Posición X en relación con el ancho de la pantalla | 0 | 0 a 1 |
top | Posición Y en relación con la altura de la pantalla | 0 | 0 a 1 |
originX | X ancla | left | left o right |
originY | Y ancla | top | top o bottom |
mixVolume | Volumen relativo Al mezclar la pista de audio de este video con otros | 1 |
Las capas de audio se mezclarán. Si se establece cutFrom / cutTo , el segmento resultante ( cutTo - cutFrom ) se ralentizará / acelerará para adaptarse clip.duration . La operación de desaceleración/aceleración se limita a valores entre 0.5x y 100x .
| Parámetro | Descripción | Por defecto | |
|---|---|---|---|
path | Ruta al archivo de audio | ||
cutFrom | Valor de tiempo para cortar de | 0 | segundo |
cutTo | Valor de tiempo para cortar | clip.duration | segundo |
mixVolume | Volumen relativo Al mezclar esta pista de audio con otros | 1 |
Este es un caso especial de audioTracks que hace que sea más fácil iniciar el audio en relación con los tiempos de inicio clips sin tener que calcular los tiempos de inicio globales.
detached-audio tiene exactamente las mismas propiedades que las audiotracks, excepto que la hora start es relativa al inicio del clip.
Ejemplo de pistas de audio separadas
Imagen de pantalla completa
| Parámetro | Descripción | Por defecto | |
|---|---|---|---|
path | Archivo de ruta a imagen | ||
resizeMode | Ver modos de cambio de tamaño |
Ver también ver parámetros de Ken Burns.
Superposición de imagen con una posición y tamaño personalizados en la pantalla. Nota: Si desea usar gifs animados, use video en su lugar.
| Parámetro | Descripción | Por defecto | |
|---|---|---|---|
path | Archivo de ruta a imagen | ||
position | Ver parámetro de posición | ||
width | Ancho (de 0 a 1) donde 1 es ancho de pantalla | ||
height | Altura (de 0 a 1) donde 1 es la altura de la pantalla |
Ver también Parámetros de Ken Burns.
fontPath - Ver defaults.layer.fontPathtext - Título Texto para mostrar, mantenerlo cortotextColor - predeterminado #ffffffposition - Ver parámetro de posiciónVer también Parámetros de Ken Burns
fontPath - Ver defaults.layer.fontPathtext - Subtítulo Texto para mostrartextColor - predeterminado #ffffff Título con antecedentes
text - Ver title del tipotextColor - ver title del tipobackground { type, ... } -Consulte el tipo radial-gradient , linear-gradient o fill-colorfontPath - Ver title de tipo fontPath - Ver defaults.layer.fontPathtexttextColor - predeterminado #ffffffbackgroundColor - predeterminado #d02a42position - Ver parámetro de posición fontPath - Ver defaults.layer.fontPathtextfontSizecharSpacingcolorposition - Ver parámetro de posición color - Color para llenar el fondo, predeterminado: aleatorizar colors : matriz de dos colores, predeterminado: aleatorizar colors : matriz de dos colores, predeterminado: aleatorizar ????
Ver CustomCanvas.js
func - Función JavaScript personalizada Ver CustomFabric.js
func - Función JavaScript personalizada Carga un sombreador GLSL. Ver GL.JSON5 y Rainbow-Colors.frag
fragmentPathvertexPath (opcional) La propiedad audioTracks puede contener opcionalmente una lista de objetos que especifican pistas de audio que se pueden iniciar en tiempos arbitrarios en el video final. Estas pistas se mezclarán ( mixVolume especificando un número relativo para qué tan fuerte se compara cada pista con las otras pistas). Debido a que el audio de clips se mezclará por separado de audioTracks , clipsAudioVolume especifica el volumen del audio combinado de clips en relación con el volumen de cada una de las pistas de audio de audioTracks .
| Parámetro | Descripción | Por defecto | |
|---|---|---|---|
audioTracks[].path | Ruta de archivo para esta pista | ||
audioTracks[].mixVolume | Volumen relativo para esta pista | 1 | |
audioTracks[].cutFrom | Valor de tiempo para cortar el archivo fuente de | 0 | segundo |
audioTracks[].cutTo | Valor de tiempo para cortar el archivo fuente a | segundo | |
audioTracks[].start | Cuántos segundos en el video para iniciar esta pista de audio | 0 | segundo |
La diferencia entre audioTracks y el tipo de capa 'audio' es que audioTracks continuarán jugando en varios clips y pueden comenzar y detenerse cuando sea necesario.
Ver ejemplo audioTracks
Consulte también Tipo de capa 'Audio separado' .
Puede habilitar la normalización de audio del audio de salida final. Esto es útil si desea lograr el bucking de audio (por ejemplo, automáticamente menor volumen de todas las demás pistas cuando habla de voz en off).
Los parámetros de audioNorm se documentan aquí.
Ejemplo de Audio Ducking
resizeMode : cómo ajustar la imagen a la pantalla. Puede ser uno de:
contain : todo el video estará contenido en el marco y el buzóncontain-blur - como contain , pero con una copia borrosa como el buzóncover : se recorta el video para cubrir toda la pantalla (relación de aspecto conservada)stretch : el video se estirará para cubrir toda la pantalla (relación de aspecto ignorada). contain-blur predeterminados.
Ver:
Ciertas capas admiten el parámetro de posición
position puede ser una de cualquiera de los dos:
center top , bottom , top-left , top-right , center-left , center-right , bottom-left , bottom-right{ x, y, originX = 'left', originY = 'top' } , donde { x: 0, y: 0 } es la esquina superior izquierda de la pantalla, y { x: 1, y: 1 } es la esquina inferior derecha, x es relativa a la altura de video, y hasta la altura del video. originX y originY son opcionales y especifican el origen de la posición (posición de anclaje) del objeto.Ver posición.json5
| Parámetro | Descripción | Por defecto | |
|---|---|---|---|
zoomDirection | Dirección de zoom para el efecto Ken Burns: in , out , left , right o null para deshabilitar | ||
zoomAmount | Cantidad de zoom para el efecto Ken Burns | 0.1 |
Esto debería ayudarlo a utilizar editormente como una CLI contenederizada, sin preocuparse por obtener todas las versiones correctas de dependencias en su sistema.
$ 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. , intente: npm un -g editly && npm i -g --build-from-source editly (ver #15)/bin/sh: pkg-config: command not found , intente usar la versión más nueva de node.js lts Este proyecto es mantenido solo por mí. El proyecto siempre seguirá siendo gratuito y de código abierto, pero si es útil para usted, considere apoyarme. :) Me dará una motivación adicional para mejorarlo.
Paypal
¡Este paquete no existiría sin el soporte y la ayuda de todos los contribuyentes y patrocinadores!
Un agradecimiento especial a:
Envíe un PR si desea compartir sus videos o proyecto creado con Edity aquí.
Hecho con ❤️ en ??
Más aplicaciones de Mifi.No
¡Sígueme en Github, YouTube, IG, Twitter para obtener más contenido increíble!