Modifier est un outil et un cadre pour le NLE déclaratif ( montage vidéo non linéaire ) à l'aide de Node.js et FFMPEG. Modifiez-vous de créer facilement et par programme une vidéo à partir d'un ensemble de clips, d'images, d'audio et de titres , avec des transitions en douceur et de la musique superposées.
A modifié un simple CLI pour assembler rapidement une vidéo à partir d'un ensemble de clips ou d'images, ou vous pouvez utiliser son API JavaScript plus flexible.
Inspiré par FFMPEG-CONCAT, est modifié à l'échelle beaucoup plus rapide et ne nécessite pas beaucoup de stockage car il utilise l'édition de streaming . Médise à l'édite à être très extensible et à affronter une interface enfichable pour ajouter un nouveau contenu dynamique .

Ce GIF / YouTube a été créé avec cette commande: "Communly CommonFeatures.json5". Voir plus d'exemples ici.
cutFrom / cutTo avec duration de chaque clipVideo must be 1337x1000 30fps )Voir des exemples
ffmpeg (et ffprobe ) installé et disponible en PATH npm i -g editly
Exécutez editly --help pour l'utilisation
Créez une simple modification vidéo randomisée à partir de vidéos, d'images et de texte avec une piste 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.mp3Ou créer un MP4 (ou GIF) à partir d'un JSON ou JSON5 Edit Spec (JSON5 est juste un format JSON plus convivial) :
editly my-spec.json5 --fast --keep-source-audio --out output.gifPour des exemples de la façon de créer une spécification de modification JSON, voir ci-dessous ou des exemples.
Sans --fast , il utilise par défaut la largeur , la hauteur et la fréquence d'images de la première vidéo d'entrée. Tous les autres clips seront convertis en ces dimensions. Vous pouvez bien sûr remplacer tout ou partie de ces paramètres.
--audio-file-path dans le fichier vidéo. Assurez-vous de respecter leur licence! import editly from 'editly' ;
// See editSpec documentation
await editly ( editSpec ) Les spécifications d'édition sont des objets JavaScript / JSON décrivant l'ensemble de l'opération d'édition avec la structure suivante:
{
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 ,
}| Paramètre | CLI équivalent | Description | Défaut | |
|---|---|---|---|---|
outPath | --out | Le chemin de sortie (MP4, MKV), peut également être un .gif | ||
width | --width | Largeur dans laquelle tous les supports seront convertis | 640 | |
height | --height | Hauteur dans laquelle tous les supports seront convertis | Auto basé sur width et le rapport d'aspect de la première vidéo | |
fps | --fps | FPS dans lequel toutes les vidéos seront converties | Première vidéo FPS ou 25 | |
customOutputArgs | Spécifiez des arguments de codec / format de sortie personnalisés pour FFMPEG (voir exemple) | Auto (H264) | ||
allowRemoteRequests | --allow-remote-requests | Autoriser les URL distantes comme chemins | false | |
fast | --fast , -f | Mode rapide (faible résolution et FPS, utile pour obtenir un aperçu rapide ⏩) | false | |
defaults.layer.fontPath | --font-path | Définissez la police par défaut sur un .TTF | Police du système | |
defaults.layer.* | Définir n'importe quel paramètre de couche dont toutes les couches hériteront | |||
defaults.duration | --clip-duration | Définissez la durée de clip par défaut pour les clips qui n'ont pas de propre durée | 4 | seconde |
defaults.transition | Un objet { name, duration } décrivant la transition par défaut. Réglé sur null pour désactiver les transitions | |||
defaults.transition.duration | --transition-duration | Durée de transition par défaut | 0.5 | seconde |
defaults.transition.name | --transition-name | Type de transition par défaut. Voir les types de transition | random | |
defaults.transition.audioOutCurve | Courbe de décoloration par défaut dans le croisement audio s'estompe | tri | ||
defaults.transition.audioInCurve | Fade par défaut dans la courbe en Audio Cross Fades | tri | ||
clips[] | Liste des objets clip qui seront lus en séquence. Chaque clip peut avoir une ou plusieurs couches. | |||
clips[].duration | Durée de clip. Voir defaults.duration . Si non set, la durée du clip sera celle de la première couche vidéo . | defaults.duration | ||
clips[].transition | Spécifiez la transition à la fin de ce clip. Voir defaults.transition | defaults.transition | ||
clips[].layers[] | Liste des calques dans le clip actuel qui sera superposé dans leur ordre naturel (couche finale en haut) | |||
clips[].layers[].type | Type de couche, voir ci-dessous | |||
clips[].layers[].start | À quelle heure dans le clip si ce calque devrait commencer | seconde | ||
clips[].layers[].stop | Quelle heure dans le clip si ce calque devrait s'arrêter | seconde | ||
audioTracks[] | Liste des pistes audio arbitraires. Voir les pistes audio. | [] | ||
audioFilePath | --audio-file-path | Définissez une piste audio pour toute la vidéo. Voir aussi Tracks audio | ||
loopAudio | --loop-audio | Faire boucle la piste audio si elle est plus courte que la vidéo? | false | |
keepSourceAudio | --keep-source-audio | Gardez l'audio source à partir de clips ? | false | |
clipsAudioVolume | Volume de l'audio à partir de clips par rapport aux audioTracks . Voir les pistes audio. | 1 | ||
outputVolume | --output-volume | Ajustez le volume de sortie (étape finale). Voir l'exemple | 1 | par exemple 0.5 ou 10dB |
audioNorm.enable | Activer la normalisation audio? Voir normalisation audio. | false | ||
audioNorm.gaussSize | Taille de la Gauss de normalisation audio. Voir normalisation audio. | 5 | ||
audioNorm.maxGain | Gain maximum de normalisation audio. Voir normalisation audio. | 30 |
transition.name peut être l'une des transitions GL, ou l'une des éléments suivants: directional-left , directional-right , directional-up , directional-down , random ou dummy .
Voir des exemples et CommonFeatures.json5
Pour les calques vidéo, si clip.duration parent est spécifié, la vidéo sera ralenti / accélérée pour faire correspondre clip.duration . Si cutFrom / cutTo est réglé, le segment résultant ( cutTo - cutFrom ) sera ralenti / accéléré pour ajuster clip.duration . Si la couche a un audio, elle sera conservée (et mélangée avec d'autres couches audio si elle est présente.)
| Paramètre | Description | Défaut | |
|---|---|---|---|
path | Chemin vers le fichier vidéo | ||
resizeMode | Voir les modes de redimension | ||
cutFrom | Valeur de temps pour couper | 0 | seconde |
cutTo | Valeur de temps à couper à | fin de vidéo | seconde |
width | Largeur par rapport à la largeur d'écran | 1 | 0 à 1 |
height | Hauteur par rapport à la hauteur de l'écran | 1 | 0 à 1 |
left | Position X par rapport à la largeur d'écran | 0 | 0 à 1 |
top | Position y par rapport à la hauteur de l'écran | 0 | 0 à 1 |
originX | X ancre | left | left ou right |
originY | Ancre y | top | top ou bottom |
mixVolume | Volume relatif lorsque vous mélangez la piste audio de cette vidéo avec d'autres | 1 |
Les couches audio seront mélangées. Si cutFrom / cutTo est réglé, le segment résultant ( cutTo - cutFrom ) sera ralenti / accéléré pour ajuster clip.duration . L'opération de ralentissement / accélération est limitée à des valeurs comprises entre 0.5x et 100x .
| Paramètre | Description | Défaut | |
|---|---|---|---|
path | Chemin vers le fichier audio | ||
cutFrom | Valeur de temps pour couper | 0 | seconde |
cutTo | Valeur de temps à couper à | clip.duration | seconde |
mixVolume | Volume relatif lorsque vous mélangez cette piste audio avec d'autres | 1 |
Il s'agit d'un cas particulier d' audioTracks qui facilite le démarrage de l'audio par rapport aux temps de début clips sans avoir à calculer les heures de début globales.
detached-audio a exactement les mêmes propriétés que AudioRacks, sauf que l'heure start est relative au début du clip.
Exemple de pistes audio détachées
Image pleine écran
| Paramètre | Description | Défaut | |
|---|---|---|---|
path | Chemin vers le fichier image | ||
resizeMode | Voir les modes de redimension |
Voir aussi les paramètres de Ken Burns.
Superposition d'image avec une position et une taille personnalisées à l'écran. Remarque: si vous souhaitez utiliser des GIF animés, utilisez video à la place.
| Paramètre | Description | Défaut | |
|---|---|---|---|
path | Chemin vers le fichier image | ||
position | Voir paramètre de position | ||
width | Largeur (de 0 à 1) où 1 est la largeur d'écran | ||
height | Hauteur (de 0 à 1) où 1 est la hauteur de l'écran |
Voir aussi Ken Burns Paramètres.
fontPath - Voir defaults.layer.fontPathtext - Titre Texte à afficher, gardez-le courttextColor - par défaut #ffffffposition - Voir paramètre de positionVoir aussi Ken Burns Paramètres
fontPath - Voir defaults.layer.fontPathtext - Sous-titre Texte à affichertextColor - par défaut #ffffff Titre avec arrière-plan
text - Voir Type titletextColor - Voir Type titlebackground - { type, ... } - Voir Type radial-gradient , linear-gradient ou fill-colorfontPath - Voir Type title fontPath - Voir defaults.layer.fontPathtexttextColor - par défaut #ffffffbackgroundColor - par défaut #d02a42position - Voir paramètre de position fontPath - Voir defaults.layer.fontPathtextfontSizecharSpacingcolorposition - Voir paramètre de position color - couleur pour remplir l'arrière-plan, par défaut: randomiser colors - tableau de deux couleurs, par défaut: randomiser colors - tableau de deux couleurs, par défaut: randomiser ???
Voir CustomCanvas.js
func - Fonction JavaScript personnalisée Voir CustomFabric.js
func - Fonction JavaScript personnalisée Charge un shader GLSL. Voir gl.json5 et arc-en-ciel.
fragmentPathvertexPath (facultatif) La propriété audioTracks peut contenir éventuellement une liste d'objets qui spécifient les pistes audio qui peuvent être démarrées à des temps arbitraires dans la vidéo finale. Ces pistes seront mélangées ( mixVolume spécifiant un nombre relatif pour la force de chaque piste par rapport aux autres pistes). Parce que l'audio à partir clips sera mélangé séparément d' audioTracks , clipsAudioVolume spécifie le volume de l'audio combiné à partir de clips par rapport au volume de chacune des pistes audio d' audioTracks .
| Paramètre | Description | Défaut | |
|---|---|---|---|
audioTracks[].path | Chemin de fichier pour cette piste | ||
audioTracks[].mixVolume | Volume relatif pour cette piste | 1 | |
audioTracks[].cutFrom | Valeur de temps pour couper le fichier source de | 0 | seconde |
audioTracks[].cutTo | Valeur de temps pour couper le fichier source à | seconde | |
audioTracks[].start | Combien de secondes après la vidéo pour démarrer cette piste audio | 0 | seconde |
La différence entre audioTracks et «Audio» de type de couche est que audioTracks continuera à jouer sur plusieurs clips et peut démarrer et s'arrêter chaque fois que cela est nécessaire.
Voir l'exemple audioTracks
Voir aussi le type de couche «détaché-Audio» .
Vous pouvez activer la normalisation audio de l'audio de sortie finale. Ceci est utile si vous souhaitez réaliser l'audio-Ducking (par exemple, plus bas le volume de toutes les autres pistes lorsque la voix off parle).
Les paramètres audioNorm sont documentés ici.
Exemple de Ducking audio
resizeMode - Comment ajuster l'image à l'écran. Peut être l'un des:
contain - toute la vidéo sera contenue dans le cadre et la boîte aux lettrescontain-blur - comme contain , mais avec une copie floue comme boîte aux lettrescover - VIDÉO être recadré pour couvrir l'ensemble de l'écran (rapport d'aspect conservé)stretch - La vidéo sera étirée pour couvrir tout l'écran (rapport d'aspect ignoré). Par défaut contain-blur .
Voir:
Certaines couches soutiennent le paramètre de position
position peut être l'une ou l'autre:
top , bottom center , top-left , top-right , center-left , center-right , bottom-left , bottom-right{ x, y, originX = 'left', originY = 'top' } , où { x: 0, y: 0 } est le coin supérieur gauche de l'écran, et { x: 1, y: 1 } est le coin inférieur droit, x est relatif à la largeur vidéo, y à la hauteur de la vidéo. originX et originY sont facultatifs et spécifient l'origine de la position (position d'ancrage) de l'objet.Voir position.json5
| Paramètre | Description | Défaut | |
|---|---|---|---|
zoomDirection | Zoom Direction pour Ken Burns Effet: in , out , left , right ou null pour désactiver | ||
zoomAmount | Zoom Montant pour l'effet Ken Burns | 0.1 |
Cela devrait vous aider à utiliser modifié comme une CLI conteneurisée, sans vous soucier d'obtenir toutes les bonnes versions de dépendances sur votre système.
$ 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. , essayez: npm un -g editly && npm i -g --build-from-source editly (voir # 15)/bin/sh: pkg-config: command not found , essayez d'utiliser la nouvelle version Node.js LTS Ce projet est maintenu par moi seul. Le projet restera toujours gratuit et open source, mais s'il vous est utile, envisagez de me soutenir. :) Cela me donnera une motivation supplémentaire pour l'améliorer.
Paypal
Ce package n'existerait pas sans le soutien et l'aide de tous les contributeurs et sponsors!
Un merci spécial à:
Soumettez un PR si vous souhaitez partager vos vidéos ou votre projet créés avec modification ici.
Fait avec ❤️ dans ??
Plus d'applications par mifi.no
Suivez-moi sur GitHub, YouTube, IG, Twitter pour plus de contenu génial!