編輯是使用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 | |
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上關注我,以獲取更多很棒的內容!