editly是使用node.js和ffmpeg的声明性NLE(非线性视频编辑)的工具和框架。 editly允许您轻松,编程地从一组剪辑,图像,音频和标题中创建视频,并具有平稳的过渡和音乐叠加。
editly有一个简单的CLI,可快速从一组剪辑或图像中组装视频,或者您可以使用其更灵活的JavaScript API。
受FFMPEG-CONCAT的启发, editly更快,并且不需要太多存储,因为它使用了流编辑。 editly目的是非常可扩展,并具有富含可插入的接口,可添加新的动态内容。
此gif / youtube是使用此命令创建的:“ editly communfeatures.json5”。在此处查看更多示例。
特征
- 用代码编辑视频! ?
- 声明性的API带有有趣的默认
- 创建具有由美学上令人愉悦的调色板和随机效果产生的随机颜色的彩色视频
- 支持任何输入大小,例如4K视频和数码单反相机照片
- 可以输出到任何维度和纵横比,例如Instagram帖子(1:1), Instagram故事(9:16), YouTube (16:9)或您喜欢的任何其他维度。
- 即使输入纵横比不相同,并且将转换内容,并且将自动缩放内容并自动箱。
- 自动加速 /放慢视频,以使每个剪辑的持续时间匹配cutfrom / cutto段长度
- 视频,图像或背景上的覆盖文字和字幕
- 接受自定义html5 canvas / fabric.js javascript代码的自定义屏幕或动态覆盖
- 渲染自定义的GL着色器(例如Shadertoy的)
- 可以输出GIF
- 覆盖透明的图像,甚至是Alpha频道的视频
- 显示夹子持续时间(B卷)的不同子剪接
- 图片中的图片
- 小插图
- 保存/混合多个音频源
- 自动音频交叉装饰
- 自动音频鸭子和归一化
用例
- 从一组带有文本覆盖的图片创建幻灯片
- 创建快节奏的预告片或促销视频
- 创建一个带有帮助文本的教程视频
- 创建新闻故事
- 创建动画gif
- 将视频大小调整到任何大小或帧速率,并带有自动信箱/裁剪(例如,如果您需要在某处上传视频,但是网站抱怨视频必须为1337×1000 30fps)
- 创建一个带有多个混合曲目的播客
见示例
要求
- Windows,MacOS或Linux
- 安装了Node.js(建议使用最新的LTS版本,v12.16.2或MacOS上的较新。)
- FFMPEG(和FFProbe)已安装并在路径中可用
- (Linux)可能需要一些额外的步骤。请参阅无头GL。
- 现在仅editly是ESM
安装
npm i -g editly
用法:命令行视频编辑器
editly – 使用
用音频曲目从视频,图像和文本中创建一个简单的随机视频编辑:
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\”>
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,它将默认使用第一个输入视频中使用宽度,高度和帧速率。所有其他剪辑将转换为这些维度。您当然可以覆盖任何或全部这些参数。
- 提示:将此工具与LosslessCut结合使用
- 提示:如果您需要吸引人的视频音乐,请查看此YouTube或YouTube音频库。然后使用youtube-dl下载视频,然后在视频文件上指向 – audio-file-path。一定要尊重他们的许可证!
JavaScript库
editly \”;
// See editSpec documentation
await editly (editSpec);\”>
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 | 描述 | 默认 | |
|---|---|---|---|---|
| 出现 | – 出去 | 输出路径(MP4,MKV)也可以是.gif | ||
| 宽度 | – 宽度 | 所有媒体将转换为 | 640 | |
| 高度 | – 高度 | 所有媒体将转换为的高度 | 根据第一个视频的宽度和纵横比的自动 | |
| FPS | -fps | FPS所有视频将转换为 | 第一个视频FPS或25 | |
| 自定义输出 | 为FFMPEG指定自定义输出编解码器/格式参数(请参阅示例) | 自动(H264) | ||
| 允许的雷群 | – 允许释放remequequests | 允许远程URL作为路径 | 错误的 | |
| 快速地 | -fast,-f | 快速模式(低分辨率和FPS,可用于获得快速预览⏩) | 错误的 | |
| defaults.layer.fontpath | – 前路 | 将默认字体设置为.ttf | 系统字体 | |
| defaults.layer。* | 设置所有图层都将继承的任何图层参数 | |||
| 默认值 | – 剪裁 | 设置没有自己持续时间的剪辑的默认剪辑持续时间 | 4 | 秒 |
| defaults.transition | 描述默认过渡的对象{名称,持续时间}。设置为null以禁用过渡 | |||
| defaults.transition.duration | – 转变 | 默认过渡持续时间 | 0.5 | 秒 |
| defaults.transition.name | – Transition-Name | 默认过渡类型。请参阅过渡类型 | 随机的 | |
| defaults.transition.audiooutcurve | 音频交叉中的默认淡出曲线淡出 | 三 | ||
| defaults.transition.AudioCincurve | 音频交叉中曲线中的默认淡出淡出 | 三 | ||
| 剪辑[] | 将按顺序播放的夹子对象列表。每个夹子可以具有一个或多个层。 | |||
| 剪辑[]。持续时间 | 剪辑持续时间。请参阅默认值。如果尚不确定,则剪辑持续时间将是第一个视频层的持续时间。 | 默认值 | ||
| 剪辑[]。过渡 | 在此剪辑的末尾指定过渡。请参阅默认设备 | defaults.transition | ||
| 剪辑[]。层[] | 当前夹中的层列表将以自然顺序覆盖(最终层) | |||
| 剪辑[]。层[]。类型 | 图层类型,见下文 | |||
| 剪辑[]。层[]。开始 | 该层的片段什么时间开始 | 秒 | ||
| 剪辑[]。层[]。停止 | 剪辑什么时间应停止 | 秒 | ||
| 录音带[] | 任意音轨列表。请参阅音轨。 | [] | ||
| 有声性 | – audio-file-path | 为整个视频设置音轨。另请参阅音轨 | ||
| Loopaudio | – 卢普·奥德奥(Loop-Audio) | 循环音轨是否比视频短? | 错误的 | |
| 保留 | – 保存源代码 | 保留夹子的源音频? | 错误的 | |
| Clipsaudiovolume | 剪辑相对于录音机的音频音量量。请参阅音轨。 | 1 | ||
| 输出卷 | – 输出体积 | 调整输出量(最终阶段)。请参见示例 | 1 | 例如0.5或10dB |
| audionorm.enable | 启用音频归一化?请参阅音频归一化。 | 错误的 | ||
| Audionorm.gausssize | 音频归一化高斯尺寸。请参阅音频归一化。 | 5 | ||
| Audionorm.maxgain | 音频归一化最大增益。请参阅音频归一化。 | 30 |
过渡类型
transition.name可以是任何GL-过渡中的任何一个,也可以是以下任何一个:方向左,定向,定向,定向向下,随机或虚拟。
层类型
请参阅示例和commonFeatures.json5
图层类型“视频”
对于视频层,如果指定了parent clip.duration,则视频将放慢/加速以匹配剪辑。如果设置了cutfrom/cutto,则将结果段(切割)放慢/加速以拟合夹。如果图层具有音频,则将保留(并与其他音频层混合。)
| 范围 | 描述 | 默认 | |
|---|---|---|---|
| 小路 | 视频文件的路径 | ||
| RESIZEMODE | 请参阅调整大小模式 | ||
| cutfrom | 缩短的时间价值 | 0 | 秒 |
| cutto | 剪切的时间价值 | 视频的结尾 | 秒 |
| 宽度 | 相对于屏幕宽度的宽度 | 1 | 0到1 |
| 高度 | 高度相对于屏幕高度 | 1 | 0到1 |
| 左边 | X位相对于屏幕宽度 | 0 | 0到1 |
| 顶部 | Y位置相对于屏幕高度 | 0 | 0到1 |
| Originx | X锚 | 左边 | 左右 |
| 起源 | y锚 | 顶部 | 顶部或底部 |
| 混音卷 | 将该视频的音轨与他人混合时相对量 | 1 |
层类型“音频”
音频层将混合在一起。如果设置了cutfrom/cutto,则将结果段(切割)放慢/加速以拟合夹。减速/加速操作限于0.5倍至100倍之间的值。
| 范围 | 描述 | 默认 | |
|---|---|---|---|
| 小路 | 音频文件的路径 | ||
| cutfrom | 缩短的时间价值 | 0 | 秒 |
| cutto | 剪切的时间价值 | 剪辑 | 秒 |
| 混音卷 | 将此音轨与他人混合时相对体积 | 1 |
层类型的“分离aaudio”
这是录音带的一种特殊情况,可以使启动音频相对于剪辑的启动时间变得更加容易,而无需计算全球启动时间。
独立的Audio具有与Audiotracks完全相同的属性,除了开始时间相对于剪辑的开始。
独立音轨的示例
图层类型“图像”
全屏图像
| 范围 | 描述 | 默认 | |
|---|---|---|---|
| 小路 | 图像文件的路径 | ||
| RESIZEMODE | 请参阅调整大小模式 |
另请参见Ken Burns参数。
图层类型“图像反射”
在屏幕上具有自定义位置和大小的图像覆盖层。注意:如果要使用动画gifs,请改用视频。
| 范围 | 描述 | 默认 | |
|---|---|---|---|
| 小路 | 图像文件的路径 | ||
| 位置 | 请参阅位置参数 | ||
| 宽度 | 宽度(从0到1)其中1是屏幕宽度 | ||
| 高度 | 高度(从0到1),其中1是屏幕高度 |
另请参见Ken Burns参数。
图层类型“标题”
- fontpath-请参阅defaults.layer.fontpath
- 文字 – 标题文本要显示,简短
- TextColor-默认#FFFFFF
- 位置 – 请参阅位置参数
另请参阅Ken Burns参数
图层类型的“字幕”
- fontpath-请参阅defaults.layer.fontpath
- 文字 – 要显示的字幕文字
- TextColor-默认#FFFFFF
层类型的“标题 – 背景”
带有背景的标题
- 文字 – 请参阅类型标题
- TextColor-请参阅类型标题
- 背景 – {type,…} – 请参阅类型径向级别,线性级别或填充色
- fontpath-请参阅类型标题
层类型的“新闻标题”
- fontpath-请参阅defaults.layer.fontpath
- 文本
- TextColor-默认#FFFFFF
- 背景色 – 默认#D02A42
- 位置 – 请参阅位置参数
图层类型“文本幻灯片”
- fontpath-请参阅defaults.layer.fontpath
- 文本
- 字体大小
- charpacing
- 颜色
- 位置 – 请参阅位置参数
层类型的“填充色”,“暂停”
- 颜色 – 填充背景的颜色,默认值:随机化
层类型“径向梯度”
- 颜色 – 两种颜色的数组,默认值:随机化
层类型“线性梯度”
- 颜色 – 两种颜色的数组,默认值:随机化
层类型的“彩虹色”
???
层类型的“画布”
请参阅CustomCanvas.js
- func-自定义JavaScript功能
层类型的“织物”
请参阅CustomFabric.js
- func-自定义JavaScript功能
层类型“ GL”
加载GLSL着色器。请参阅GL.JSON5和Rainbow-Colors.Frag
- 片段路
- VertexPath(可选)
任意音轨
Idiotracks属性可以选择包含一个对象列表,这些对象指定音频轨道可以在最终视频中的任意时间启动。这些轨道将混合在一起(Mixvolume指定每个曲目与其他轨道的相对数字)。由于夹子的音频将与录音机分开混合,因此剪贴画指定了剪辑中的组合音频相对于audiotracks的每个音轨的音量的组合音量。
| 范围 | 描述 | 默认 | |
|---|---|---|---|
| 录音带[]。路径 | 此轨道的文件路径 | ||
| 录音带[]。混合卷 | 此曲目的相对体积 | 1 | |
| 录音带[]。cutfrom | 从剪切源文件从 | 0 | 秒 |
| 录音带[] | 将源文件剪切到的时间值 | 秒 | |
| 录音机[]。开始 | 启动此音轨的视频有多少秒 | 0 | 秒 |
录音机和层类型“音频”之间的区别在于,录音机将继续跨多个夹子播放,并且可以在需要时开始和停止。
请参阅录音机示例
另请参见层类型的“分离audio” 。
音频归一化
您可以启用最终输出音频的音频归一化。如果您想实现音频鸭子(例如,当画外音时,所有其他曲目的体积会自动降低)。
此处记录了Audionorm参数。
音频鸭子的示例
调整大小模式
RESIZEMODE-如何将图像拟合到屏幕。可以是:
- 包含 – 所有视频将包含在框架内和信箱中
- 包含Blur-喜欢包含,但具有模糊的副本作为信箱
- 封面 – 视频裁剪以覆盖整个屏幕(保留纵横比)
- 伸展 – 视频将被拉伸以覆盖整个屏幕(忽略宽高比)。
默认包含blur。
看:
- image.json5
- videos.json5
位置参数
某些层支持位置参数
位置可以是:
- 顶部,底部中心,左上,右上,左侧,中右,左下,右下角
- 一个对象{x,y,orientx =\’left\’,onecty =\’top\’},其中{x:0,y:0}是屏幕的左上角,{x:1,y:1}是右下角,x是相对于视频宽度,y到视频高度。 Originx和Originy是可选的,并指定对象的位置的原点(锚定位)。
请参阅位置。JSON5
肯·伯恩斯参数
| 范围 | 描述 | 默认 | |
|---|---|---|---|
| 变焦 | 缩放方向的肯·伯恩斯效应:内,向左,右或无效以禁用 | ||
| Zoomamount | ken burns效果的缩放金额 | 0.1 |
Docker
这应该可以帮助您editly用作容器化的CLI,而不必担心将所有正确版本的依赖项都带到系统上。
editly/examples
$ git clone https://gith**ub.*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 .\”>
$ git clone https://gi***thub.com/mifi/editly.git $ cd editly /examples $ git clone https://gith**ub.*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 .
故障排除
- 如果您收到错误: editly指定的模块editly
- 如果您遇到有关GL返回空的错误,请参见要求。
- 如果您遇到错误 /bin /sh:pkg-config:找不到命令,请尝试使用最新的node.js lts版本
捐
这个项目仅由我维护。该项目将始终保持免费和开源,但是如果对您有用,请考虑支持我。 :)这将使我有更多的动力来改善它。
贝宝
谢谢
如果没有所有贡献者和赞助商的支持和帮助,就不会存在此软件包!
特别感谢:
- 帕特里克·康诺利(Patrick Connolly)-Docker -Compose支持
- Skayo-打字稿支持
参见
- https://g*ithub**.com/mifi/reactive-video-基于react的替代方案
- https://*github.*co*m/jonnyburger/remotion-基于react的替代替代(不是开源)
- https://github.***com/pankod/canvas2video-基于开罗的类似项目
- https://g**it*hub.com/h2non/videoshow-启发性编辑
- https://**github.*com/transitive-bullshit/ffmpeg-concat-启发性编辑
- http://www.quasi*m*o*ndo.com/boxblurforcanvas/fastblurdemo.html-编辑中使用的快速模糊效果
- https://*github*.c*om/transitive-bullshit/awesome-ffmpeg
- https://github.***com/sjfricke/awesome-webgl
- https://www.mltfra**m*ework.org/docs/melt/
- Freepik从www.flaticon.com制作的图标
您制作的视频
如果您想与此处editly共享您的视频或项目,请提交PR。
- https://www.yout*u**be.com/channel/ucduauyxuy5cv1z6aud3ugdw?view_as=subscriber
用❤️在??中制成
Mifi.no的更多应用程序
在GitHub,YouTube,IG,Twitter上关注我,以获取更多很棒的内容!
