编辑是使用node.js和ffmpeg的声明性NLE(非线性视频编辑)的工具和框架。编辑允许您轻松,编程地从一组剪辑,图像,音频和标题中创建视频,并具有平稳的过渡和音乐叠加。
编辑有一个简单的CLI,可快速从一组剪辑或图像中组装视频,或者您可以使用其更灵活的JavaScript API。
受FFMPEG-CONCAT的启发,编辑速度更快,并且不需要太多存储,因为它使用了流编辑。编辑的目的是非常可扩展,并具有富含可插入的接口,可添加新的动态内容。

此gif / youtube是使用此命令创建的:“ editly communfeatures.json5”。在此处查看更多示例。
duration匹配cutFrom / cutTo段长度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或从JSON或JSON5编辑规范创建MP4(或GIF) (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 | 为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可以是任何GL-过渡中的任何一个,也可以是以下任何一个: directional-left , directional-right , directional-up , directional-down , random或dummy 。
请参阅示例和commonFeatures.json5
对于视频层,如果指定了parent 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 | 请参阅调整大小模式 |
另请参见Ken Burns参数。
在屏幕上具有自定义位置和大小的图像覆盖层。注意:如果要使用动画gifs,请改用video 。
| 范围 | 描述 | 默认 | |
|---|---|---|---|
path | 图像文件的路径 | ||
position | 请参阅位置参数 | ||
width | 宽度(从0到1)其中1是屏幕宽度 | ||
height | 高度(从0到1),其中1是屏幕高度 |
另请参见Ken Burns参数。
fontPath请参阅defaults.layer.fontPathtext - 标题文本要显示,简短textColor默认#ffffffposition - 请参阅位置参数另请参阅Ken Burns参数
fontPath请参阅defaults.layer.fontPathtext - 要显示的字幕文字textColor默认#ffffff 带有背景的标题
text - 请参阅类型titletextColor请参阅类型titlebackground - { 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和层类型“音频”之间的区别在于, audioTracks将继续跨多个clips播放,并且可以在需要时开始和停止。
请参阅audioTracks示例
另请参见层类型的“分离audio” 。
您可以启用最终输出音频的音频归一化。如果您想实现音频鸭子(例如,当画外音时,所有其他曲目的体积会自动降低)。
此处记录了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是可选的,并指定对象的位置的原点(锚定位)。请参阅位置。JSON5
| 范围 | 描述 | 默认 | |
|---|---|---|---|
zoomDirection | 缩放方向的肯left伯恩斯效应: in , out , right或null以禁用 | ||
zoomAmount | ken burns效果的缩放金额 | 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版本这个项目仅由我维护。该项目将始终保持免费和开源,但是如果对您有用,请考虑支持我。 :)这将使我有更多的动力来改善它。
贝宝
如果没有所有贡献者和赞助商的支持和帮助,就不会存在此软件包!
特别感谢:
如果您想与此处的编辑共享您的视频或项目,请提交PR。
用❤️制成?
Mifi.no的更多应用程序
在GitHub,YouTube,IG,Twitter上关注我,以获取更多很棒的内容!