Bearbeiten sind ein Werkzeug und ein Framework für deklarative NLE ( nichtlineare Videobearbeitung ) mit node.js und ffmpeg. Mit der Bearbeiten können Sie einfach ein Video aus einem Satz von Clips, Bildern, Audio und Titeln mit reibungslosen Übergängen und Musik überlagert werden.
Bearbeiten haben eine einfache CLI, um ein Video schnell aus einer Reihe von Clips oder Bildern zusammenzustellen, oder Sie können die flexiblere JavaScript -API verwenden.
Inspiriert von ffmpeg-concat ist bearbeiten viel schneller und erfordert nicht viel Speicher, da die Bearbeitung von Streaming verwendet wird. Bearbeiten Sie das Ziel, sehr erweiterbar zu sein und reich an einer steckbaren Schnittstelle zum Hinzufügen neuer dynamischer Inhalte .

Dieses GIF / YouTube wurde mit diesem Befehl erstellt: "Bearbeiten von CommonFeatures.json5". Weitere Beispiele finden Sie hier.
cutFrom / cutTo mit duration jedes Clips zu entsprechenVideo must be 1337x1000 30fps )Siehe Beispiele
ffmpeg (und ffprobe ) installiert und im PATH erhältlich npm i -g editly
Bearbeiten Sie editly --help für die Verwendung
Erstellen Sie ein einfaches randomisiertes Video aus Videos, Bildern und Text mit einem Audio -Track:
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.mp3Oder erstellen Sie einen MP4 (oder GIF) aus einer JSON- oder JSON5 -Bearbeitungsspezifikation (JSON5 ist nur ein benutzerfreundlicheres JSON -Format) :
editly my-spec.json5 --fast --keep-source-audio --out output.gifBeispiele für die Erstellung einer JSON -Bearbeitungsspezifikation finden Sie unten oder Beispiele.
Ohne --fast wird es standardmäßig die Breite , Höhe und Bildrate aus dem ersten Eingangsvideo verwendet. Alle anderen Clips werden in diese Dimensionen umgewandelt. Sie können natürlich jeden oder alle dieser Parameter überschreiben.
--audio-file-path in die Videodatei. Achten Sie darauf, ihre Lizenz zu respektieren! import editly from 'editly' ;
// See editSpec documentation
await editly ( editSpec ) Bearbeitungsspezifikationen sind JavaScript / JSON -Objekte, die den gesamten Bearbeitungsvorgang mit der folgenden Struktur beschreiben:
{
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 ,
}| Parameter | CLI -Äquivalent | Beschreibung | Standard | |
|---|---|---|---|---|
outPath | --out | Ausgangspfad (MP4, MKV) kann auch ein .gif sein | ||
width | --width | Breite, in die alle Medien konvertiert werden | 640 | |
height | --height | Höhe, auf die alle Medien konvertiert werden | Auto basierend auf width und des Seitenverhältnisses des ersten Videos | |
fps | --fps | FPs, auf die alle Videos konvertiert werden | Erstes Video fps oder 25 | |
customOutputArgs | Geben Sie benutzerdefinierte Ausgabescodec/Format -Argumente für FFMPEG an (siehe Beispiel) | Auto (H264) | ||
allowRemoteRequests | --allow-remote-requests | Remote -URLs als Pfade zulassen | false | |
fast | --fast , -f | Schneller Modus (niedrige Auflösung und FPS, nützlich, um eine schnelle Vorschau zu erhalten ⏩) | false | |
defaults.layer.fontPath | --font-path | Stellen Sie die Standardschrift für eine .ttf ein | Systemschrift | |
defaults.layer.* | Stellen Sie einen beliebigen Ebenenparameter ein, den alle Ebenen erben werden | |||
defaults.duration | --clip-duration | Stellen Sie die Standard -Clip -Dauer für Clips fest, die keine eigene Dauer haben | 4 | Sek |
defaults.transition | Ein Objekt { name, duration } der den Standardübergang beschreibt. Auf Null einstellen, um Übergänge zu deaktivieren | |||
defaults.transition.duration | --transition-duration | Standardübergangsdauer | 0.5 | Sek |
defaults.transition.name | --transition-name | Standardübergangstyp. Siehe Übergangstypen | random | |
defaults.transition.audioOutCurve | Die Standard -Kurve in Audio Cross verblasst die Kurve | tri | ||
defaults.transition.audioInCurve | Standardverlust in der Kurve in Audio Cross verblasst verblasst | tri | ||
clips[] | Liste der Clip -Objekte, die nacheinander gespielt werden. Jeder Clip kann eine oder mehrere Schichten haben. | |||
clips[].duration | Clip -Dauer. Siehe defaults.duration . Wenn sie nicht festgelegt ist, ist die Clip -Dauer die der ersten Videoebene . | defaults.duration | ||
clips[].transition | Geben Sie den Übergang am Ende dieses Clips an. Siehe defaults.transition | defaults.transition | ||
clips[].layers[] | Liste der Ebenen innerhalb des aktuellen Clips, der in ihrer natürlichen Reihenfolge überlagert wird (endgültige Schicht oben) | |||
clips[].layers[].type | Ebenentyp, siehe unten | |||
clips[].layers[].start | Wie spät in den Clip sollte diese Ebene beginnen | Sek | ||
clips[].layers[].stop | Wie spät in den Clip sollte diese Ebene stoppen | Sek | ||
audioTracks[] | Liste der willkürlichen Audiospuren. Siehe Audiospuren. | [] | ||
audioFilePath | --audio-file-path | Legen Sie einen Audio -Track für das gesamte Video ein. Siehe auch Audiospuren | ||
loopAudio | --loop-audio | Schleifen Sie den Audio -Track, wenn er kürzer als Video ist? | false | |
keepSourceAudio | --keep-source-audio | Quelle Audio von clips abhalten? | false | |
clipsAudioVolume | Audiovolumen von clips relativ zu audioTracks . Siehe Audiospuren. | 1 | ||
outputVolume | --output-volume | Einstellen des Ausgangsvolumens (Endstufe). Siehe Beispiel | 1 | zB 0.5 oder 10dB |
audioNorm.enable | Audionormalisierung aktivieren? Siehe Audio -Normalisierung. | false | ||
audioNorm.gaussSize | Audio -Normalisierung Gaußgröße. Siehe Audio -Normalisierung. | 5 | ||
audioNorm.maxGain | Audio -Normalisierung maximaler Gewinn. Siehe Audio -Normalisierung. | 30 |
transition.name kann eine der GL-Übergänge oder eines der folgenden sein: directional-left , directional-right , directional-up , directional-down , random oder dummy .
Siehe Beispiele und CommonFeatures.json5
Für Videoschichten wird das Video verlangsamt, clip.duration übergeordnete clip.duration angegeben ist. Wenn cutFrom / cutTo eingestellt ist, wird das resultierende Segment ( cutTo - cutFrom ) verlangsamt / zum Anpassung an clip.duration . Wenn die Ebene Audio hat, wird sie aufbewahrt (und mit anderen Audioschichten gemischt, falls vorhanden).
| Parameter | Beschreibung | Standard | |
|---|---|---|---|
path | Pfad zur Videodatei | ||
resizeMode | Siehe Größenänderung Modi | ||
cutFrom | Zeitwert, um aus zu schneiden | 0 | Sek |
cutTo | Zeitwert zu schneiden auf | Ende des Videos | Sek |
width | Breite relativ zur Bildschirmbreite | 1 | 0 bis 1 |
height | Höhe relativ zur Bildschirmhöhe | 1 | 0 bis 1 |
left | X-Position im Vergleich zur Bildschirmbreite | 0 | 0 bis 1 |
top | Y-Position im Vergleich zur Bildschirmhöhe | 0 | 0 bis 1 |
originX | X Anker | left | left oder right |
originY | Y Anker | top | top oder bottom |
mixVolume | Relatives Volumen beim Mischen des Audio -Tracks dieses Videos mit anderen | 1 |
Audioschichten werden zusammen gemischt. Wenn cutFrom / cutTo eingestellt ist, wird das resultierende Segment ( cutTo - cutFrom ) verlangsamt / zum Anpassung an clip.duration . Der Verlangsamung/Beschleunigungsbetrieb ist auf Werte zwischen 0.5x und 100x begrenzt.
| Parameter | Beschreibung | Standard | |
|---|---|---|---|
path | Pfad zur Audiodatei | ||
cutFrom | Zeitwert, um aus zu schneiden | 0 | Sek |
cutTo | Zeitwert zu schneiden auf | clip.duration | Sek |
mixVolume | Relatives Volumen beim Mischen dieser Audiospur mit anderen | 1 |
Dies ist ein spezieller Fall von audioTracks , mit dem die Audio -Startzeiten im Verhältnis zu clips -Startzeiten einfacher gestartet werden können, ohne die globalen Startzeiten zu berechnen.
detached-audio hat genau die gleichen Eigenschaften wie Audiotracks, außer dass die start im Verhältnis zum Start des Clips ist.
Beispiel für abgelöste Audiospuren
Vollbildbild
| Parameter | Beschreibung | Standard | |
|---|---|---|---|
path | Pfad zur Bilddatei | ||
resizeMode | Siehe Größenänderung Modi |
Siehe auch siehe Ken Burns -Parameter.
Bildüberlagerung mit einer benutzerdefinierten Position und Größe auf dem Bildschirm. Hinweis: Wenn Sie animierte GIFs verwenden möchten, verwenden Sie stattdessen video .
| Parameter | Beschreibung | Standard | |
|---|---|---|---|
path | Pfad zur Bilddatei | ||
position | Siehe Positionsparameter | ||
width | Breite (von 0 bis 1) wobei 1 Bildschirmbreite ist | ||
height | Höhe (von 0 bis 1) wobei 1 Bildschirmhöhe ist |
Siehe auch Ken Burns Parameter.
fontPath - Siehe defaults.layer.fontPathtext - Title -Text, um es kurz zu haltentextColor - Standard #ffffffposition - Siehe PositionsparameterSiehe auch Ken Burns Parameter
fontPath - Siehe defaults.layer.fontPathtext - Untertiteltext zu zeigentextColor - Standard #ffffff Titel mit Hintergrund
text - Siehe Typ titletextColor - siehe titlebackground { type, ... } -Siehe Typ radial-gradient , linear-gradient oder fill-colorfontPath - siehe Typ title fontPath - Siehe defaults.layer.fontPathtexttextColor - Standard #ffffffbackgroundColor - Standard #d02a42position - Siehe Positionsparameter fontPath - Siehe defaults.layer.fontPathtextfontSizecharSpacingcolorposition - Siehe Positionsparameter color - Farbe, um Hintergrund zu füllen, Standardeinstellung: Randomize colors - Array von zwei Farben, Standard: Randomize colors - Array von zwei Farben, Standard: Randomize ???
Siehe Customcanvas.js
func - benutzerdefinierte JavaScript -Funktion Siehe CustomFabric.js
func - benutzerdefinierte JavaScript -Funktion Lädt einen GLSL -Shader. Siehe GL.JSON5 und Rainbow-Colors.frag
fragmentPathvertexPath (optional) Die Eigenschaft audioTracks kann optional eine Liste von Objekten enthalten, die Audio -Tracks angeben, die im endgültigen Video zu willkürlichen Zeiten gestartet werden können. Diese Tracks werden miteinander gemischt ( mixVolume gibt eine relative Zahl für die Laut, die jeder Track mit den anderen Tracks verglichen wird). Da Audio aus clips getrennt von audioTracks gemischt wird, gibt clipsAudioVolume das Volumen des kombinierten Audios von clips relativ zum Volumen jeder Audio -Spuren von audioTracks an.
| Parameter | Beschreibung | Standard | |
|---|---|---|---|
audioTracks[].path | Dateipfad für diesen Track | ||
audioTracks[].mixVolume | Relatives Volumen für diesen Track | 1 | |
audioTracks[].cutFrom | Zeitwert, um die Quelldatei aus zu schneiden | 0 | Sek |
audioTracks[].cutTo | Zeitwert, um die Quelldatei auf zu schneiden | Sek | |
audioTracks[].start | Wie viele Sekunden nach dem Video, um diesen Audio -Track zu starten | 0 | Sek |
Der Unterschied zwischen audioTracks und Layer -Typ 'Audio' besteht darin, dass audioTracks weiterhin über mehrere clips herum spielen und bei Bedarf starten und stoppen können.
Siehe Beispiel audioTracks
Siehe auch Layer-Typ 'Distached-Audio' .
Sie können die Audio -Normalisierung des endgültigen Ausgangs -Audios aktivieren. Dies ist nützlich, wenn Sie Audio-Ducken erreichen möchten (z. B. senken Sie das Volumen aller anderen Tracks automatisch, wenn Voice-Over spricht).
audioNorm -Parameter werden hier dokumentiert.
Beispiel für Audio -Ducken
resizeMode - So passen Sie das Bild in den Bildschirm an. Kann einer von: sein:
contain - Das gesamte Video wird im Rahmen und im Briefbox enthalten seincontain-blur - wie contain , aber mit einer verschwommenen Kopie als Briefkastencover - Video beschnitten, um den gesamten Bildschirm abzudecken (Seitenverhältnis erhalten)stretch - Video wird gestreckt, um den gesamten Bildschirm abzudecken (Seitenverhältnis ignoriert). contain-blur .
Sehen:
Bestimmte Ebenen unterstützen den Positionsparameter
position kann eine von beiden sein:
top , bottom center , top-left , top-right , center-left , center-right , bottom-left , bottom-right{ x, y, originX = 'left', originY = 'top' } , wobei { x: 0, y: 0 } die obere linke Ecke des Bildschirms ist, und { x: 1, y: 1 } ist die untere rechte Ecke, x ist relativ zur Videobreite, y bis zur Videohöhe. originX und originY sind optional und geben den Ursprung der Position (Ankerposition) des Objekts an.Siehe Position.json5
| Parameter | Beschreibung | Standard | |
|---|---|---|---|
zoomDirection | Zoomrichtung für Ken Burns Effekt: in , out , left , right oder null um zu deaktivieren | ||
zoomAmount | Zoommenge für Ken Burns -Effekt | 0.1 |
Dies sollte Ihnen helfen, die Bearbeitung als Container -CLI zu verwenden, ohne sich Sorgen zu machen, dass Sie die richtigen Versionen von Abhängigkeiten von Ihrem System erhalten.
$ 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/bin/sh: pkg-config: command not found haben, versuchen Sie, die neueste Node.js LTS-Version zu verwenden Dieses Projekt wird allein von mir aufrechterhalten. Das Projekt bleibt immer kostenlos und Open Source, aber wenn es für Sie nützlich ist, sollten Sie mich in Betracht ziehen. :) Es wird mir zusätzliche Motivation geben, es zu verbessern.
Paypal
Dieses Paket würde ohne die Unterstützung und Hilfe aller Mitwirkenden und Sponsoren nicht existieren!
Besonderer Dank an:
Senden Sie eine PR ein, wenn Sie Ihre Videos oder ein Projekt teilen möchten, das hier erstellt wurde.
Gemacht mit ❤️ in ??
Weitere Apps von mifi.no
Folgen Sie mir auf Github, YouTube, IG, Twitter, um mehr fantastische Inhalte zu erhalten!