Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Slick, declarative command line video editing & API

License

NotificationsYou must be signed in to change notification settings

mifi/editly

Repository files navigation

DiscordNPM versionBuild statusPayPal

Editly is a tool and framework for declarative NLE (non-linear video editing) using Node.js and ffmpeg. Editly allows you to easily andprogrammatically create a video from aset of clips, images, audio and titles, with smooth transitions and music overlaid.

Editly has a simple CLI for quickly assembling a video from a set of clips or images, or you can use its more flexible JavaScript API.

Inspired byffmpeg-concat, editly is much faster and doesn't require much storage because it usesstreaming editing. Editly aims to be very extensible and feature rich with a pluggable interface for adding newdynamic content.

demo

This GIF / YouTube was created with this command: "editlycommonFeatures.json5". Seemore examples here.

Features

  • Edit videos with code! 🤓
  • Declarative API with fun defaults
  • Create colorful videos with random colors generated from aesthetically pleasing palettes and random effects
  • Supports any input size, e.g. 4K video and DSLR photos
  • Can output to any dimensions and aspect ratio, e.g.Instagram post (1:1),Instagram story (9:16),YouTube (16:9), or any other dimensions you like.
  • Content is scaled and letterboxed automatically, even if the input aspect ratio is not the same and the framerate will be converted.
  • Speed up / slow down videos automatically to match thecutFrom/cutTo segment length with each clip'sduration
  • Overlay text and subtitles on videos, images or backgrounds
  • Accepts custom HTML5 Canvas / Fabric.js JavaScript code for custom screens or dynamic overlays
  • Render custom GL shaders (for example fromshadertoy)
  • Can output GIF
  • Overlay transparent images or even videos with alpha channel
  • Show different sub-clips for parts of a clips duration (B-roll)
  • Picture-in-picture
  • Vignette
  • Preserve/mix multiple audio sources
  • Automatic audio crossfading
  • Automatic audio ducking and normalization

Use cases

  • Create a slideshow from a set of pictures with text overlay
  • Create a fast-paced trailer or promo video
  • Create a tutorial video with help text
  • Create news stories
  • Create an animated GIF
  • Resize video to any size or framerate and with automatic letterboxing/cropping (e.g. if you need to upload a video somewhere but the site complainsVideo must be 1337x1000 30fps)
  • Create a podcast with multiple mixed tracks

Seeexamples

Requirements

Installing

npm i -g editly

Usage: Command line video editor

Runeditly --help for usage

Create a simple randomized video edit from videos, images and text with an 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.mp3

Or create an MP4 (or GIF) from a JSON or JSON5 edit spec(JSON5 is just a more user friendly JSON format):

editly my-spec.json5 --fast --keep-source-audio --out output.gif

For examples of how to make a JSON edit spec, see below orexamples.

Without--fast, it will default to using thewidth,height andframe rate from thefirst input video.All other clips will be converted to these dimensions. You can of course override any or all of these parameters.

  • TIP: Use this tool in conjunction withLosslessCut
  • TIP: If you need catchy music for your video, have a look atthis YouTube or theYouTube audio library. Then useyoutube-dl to download the video, and then point--audio-file-path at the video file.Be sure to respect their license!

JavaScript library

importeditlyfrom"editly";// See editSpec documentationawaiteditly(editSpec);

Edit spec

Edit specs are JavaScript / JSON objects describing the whole edit operation with the following structure:

{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,}

Parameters

ParameterCLI equivalentDescriptionDefault
outPath--outOutput path (mp4, mkv), can also be a.gif
width--widthWidth which all media will be converted to640
height--heightHeight which all media will be converted toauto based onwidth and aspect ratio offirst video
fps--fpsFPS which all videos will be converted toFirst video FPS or25
customOutputArgsSpecify custom output codec/format arguments for ffmpeg (Seeexample)auto (h264)
allowRemoteRequests--allow-remote-requestsAllow remote URLs as pathsfalse
fast--fast,-fFast mode (low resolution and FPS, useful for getting a quick preview ⏩)false
defaults.layer.fontPath--font-pathSet default font to a .ttfSystem font
defaults.layer.*Set any layer parameter that all layers will inherit
defaults.duration--clip-durationSet default clip duration for clips that don't have an own duration4sec
defaults.transitionAn object{ name, duration } describing the default transition. Set tonull to disable transitions
defaults.transition.duration--transition-durationDefault transition duration0.5sec
defaults.transition.name--transition-nameDefault transition type. SeeTransition typesrandom
defaults.transition.audioOutCurveDefaultfade out curve in audio cross fadestri
defaults.transition.audioInCurveDefaultfade in curve in audio cross fadestri
clips[]List of clip objects that will be played in sequence. Each clip can have one or more layers.
clips[].durationClip duration. Seedefaults.duration. If unset, the clip duration will be that of thefirst video layer.defaults.duration
clips[].transitionSpecify transition at theend of this clip. Seedefaults.transitiondefaults.transition
clips[].layers[]List of layers within the current clip that will be overlaid in their natural order (final layer on top)
clips[].layers[].typeLayer type, see below
clips[].layers[].startWhat time into the clip should this layer startsec
clips[].layers[].stopWhat time into the clip should this layer stopsec
audioTracks[]List of arbitrary audio tracks. Seeaudio tracks.[]
audioFilePath--audio-file-pathSet an audio track for the whole video. See alsoaudio tracks
loopAudio--loop-audioLoop the audio track if it is shorter than video?false
keepSourceAudio--keep-source-audioKeep source audio fromclips?false
clipsAudioVolumeVolume of audio fromclips relative toaudioTracks. Seeaudio tracks.1
outputVolume--output-volumeAdjust outputvolume (final stage). Seeexample1e.g.0.5 or10dB
audioNorm.enableEnable audio normalization? Seeaudio normalization.false
audioNorm.gaussSizeAudio normalization gauss size. Seeaudio normalization.5
audioNorm.maxGainAudio normalization max gain. Seeaudio normalization.30

Transition types

transition.name can be any ofgl-transitions, or any of the following:directional-left,directional-right,directional-up,directional-down,random ordummy.

Layer types

Seeexamples andcommonFeatures.json5

Layer type 'video'

For video layers, if parentclip.duration is specified, the video will be slowed/sped-up to matchclip.duration. IfcutFrom/cutTo is set, the resulting segment (cutTo-cutFrom) will be slowed/sped-up to fitclip.duration. If the layer has audio, it will be kept (and mixed with other audio layers if present.)

ParameterDescriptionDefault
pathPath to video file
resizeModeSeeResize modes
cutFromTime value to cut from0sec
cutToTime value to cut toend of videosec
widthWidth relative to screen width10 to1
heightHeight relative to screen height10 to1
leftX-position relative to screen width00 to1
topY-position relative to screen height00 to1
originXX anchorleftleft orright
originYY anchortoptop orbottom
mixVolumeRelative volume when mixing this video's audio track with others1

Layer type 'audio'

Audio layers will be mixed together. IfcutFrom/cutTo is set, the resulting segment (cutTo-cutFrom) will be slowed/sped-up to fitclip.duration. The slow down/speed-up operation is limited to values between0.5x and100x.

ParameterDescriptionDefault
pathPath to audio file
cutFromTime value to cut from0sec
cutToTime value to cut toclip.durationsec
mixVolumeRelative volume when mixing this audio track with others1

Layer type 'detached-audio'

This is a special case ofaudioTracks that makes it easier to start the audio relative toclips start times without having to calculate global start times.

detached-audio has the exact same properties asaudioTracks, exceptstart time is relative to the clip's start.

Example of detached audio tracks

Layer type 'image'

Full screen image

ParameterDescriptionDefault
pathPath to image file
resizeModeSeeResize modes

See also SeeKen Burns parameters.

Layer type 'image-overlay'

Image overlay with a custom position and size on the screen. NOTE: If you want to use animated GIFs usevideo instead.

ParameterDescriptionDefault
pathPath to image file
positionSeePosition parameter
widthWidth (from 0 to 1) where 1 is screen width
heightHeight (from 0 to 1) where 1 is screen height

See alsoKen Burns parameters.

Layer type 'title'

  • fontPath - Seedefaults.layer.fontPath
  • text - Title text to show, keep it short
  • textColor - default#ffffff
  • position - SeePosition parameter

See alsoKen Burns parameters

Layer type 'subtitle'

  • fontPath - Seedefaults.layer.fontPath
  • text - Subtitle text to show
  • textColor - default#ffffff

Layer type 'title-background'

Title with background

  • text - See typetitle
  • textColor - See typetitle
  • background -{ type, ... } - See typeradial-gradient,linear-gradient orfill-color
  • fontPath - See typetitle

Layer type 'news-title'

  • fontPath - Seedefaults.layer.fontPath
  • text
  • textColor - default#ffffff
  • backgroundColor - default#d02a42
  • position - SeePosition parameter

Layer type 'slide-in-text'

  • fontPath - Seedefaults.layer.fontPath
  • text
  • fontSize
  • charSpacing
  • color
  • position - SeePosition parameter

Layer type 'fill-color', 'pause'

  • color - Color to fill background, default: randomize

Layer type 'radial-gradient'

  • colors - Array of two colors, default: randomize

Layer type 'linear-gradient'

  • colors - Array of two colors, default: randomize

Layer type 'rainbow-colors'

🌈🌈🌈

Layer type 'canvas'

SeecustomCanvas.js

  • func - Custom JavaScript function

Layer type 'fabric'

SeecustomFabric.js

  • func - Custom JavaScript function

Layer type 'gl'

Loads a GLSL shader. Seegl.json5 andrainbow-colors.frag

  • fragmentPath
  • vertexPath (optional)

Arbitrary audio tracks

audioTracks property can optionally contain a list of objects which specify audio tracks that can be started at arbitrary times in the final video. These tracks will be mixed together (mixVolume specifying a relative number for how loud each track is compared to the other tracks). Because audio fromclips will be mixed separately fromaudioTracks,clipsAudioVolume specifies the volume of thecombined audio fromclips relative to the volume ofeach of the audio tracks fromaudioTracks.

ParameterDescriptionDefault
audioTracks[].pathFile path for this track
audioTracks[].mixVolumeRelative volume for this track1
audioTracks[].cutFromTime value to cut source filefrom0sec
audioTracks[].cutToTime value to cut source filetosec
audioTracks[].startHow many seconds into video to start this audio track0sec

The difference betweenaudioTracks andLayer type 'audio' is thataudioTracks will continue to play across multipleclips and can start and stop whenever needed.

SeeaudioTracksexample

See alsoLayer type 'detached-audio'.

Audio normalization

You can enable audio normalization of the final output audio. This is useful if you want to achieve Audio Ducking (e.g. automatically lower volume of all other tracks when voice-over speaks).

audioNorm parameters aredocumented here.

Example of audio ducking

Resize modes

resizeMode - How to fit image to screen. Can be one of:

  • contain - All the video will be contained within the frame and letterboxed
  • contain-blur - Likecontain, but with a blurred copy as the letterbox
  • cover - Video be cropped to cover the whole screen (aspect ratio preserved)
  • stretch - Video will be stretched to cover the whole screen (aspect ratio ignored).

Defaultcontain-blur.

See:

Position parameter

Certain layers support the position parameter

position can be one of either:

  • top,bottomcenter,top-left,top-right,center-left,center-right,bottom-left,bottom-right
  • An object{ x, y, originX = 'left', originY = 'top' }, where{ x: 0, y: 0 } is the upper left corner of the screen, and{ x: 1, y: 1 } is the lower right corner,x is relative to video width,y to video height.originX andoriginY are optional, and specify the position's origin (anchor position) of the object.

Seeposition.json5

Ken Burns parameters

ParameterDescriptionDefault
zoomDirectionZoom direction for Ken Burns effect:in,out,left,right ornull to disable
zoomAmountZoom amount for Ken Burns effect0.1

Docker

This should help you use editly as a containerized CLI, without worrying aboutgetting all the right versions of dependencies on your system.

$ 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.

Troubleshooting

  • If you getError: The specified module could not be found., try:npm un -g editly && npm i -g --build-from-source editly (see#15)
  • If you get an error about gl returning null, see Requirements.
  • If you get an error/bin/sh: pkg-config: command not found, try to use newest Node.js LTS version

Donate 🙏

This project is maintained by me alone. The project will always remain free and open source, but if it's useful for you, consider supporting me. :) It will give me extra motivation to improve it.

Paypal

Thanks

This package would not exist without the support and help from all the contributors and sponsors!

Special thanks to:

See also

Videos made by you

Submit a PR if you want to share your videos or project created with editly here.


Made with ❤️ in 🇳🇴

More apps by mifi.no

Follow me onGitHub,YouTube,IG,Twitter for more awesome content!


[8]ページ先頭

©2009-2026 Movatter.jp