Editly เป็นเครื่องมือและกรอบสำหรับการประกาศ NLE ( การแก้ไขวิดีโอที่ไม่ใช่เชิงเส้น ) โดยใช้ node.js และ ffmpeg แก้ไขให้คุณ สร้างวิดีโอได้อย่างง่ายดายและเป็นโปรแกรม จาก ชุดคลิปรูปภาพเสียงและชื่อเรื่อง ด้วยการเปลี่ยนที่ราบรื่นและเพลงซ้อนทับ
Editly มี CLI อย่างง่ายสำหรับการประกอบวิดีโออย่างรวดเร็วจากชุดคลิปหรือรูปภาพหรือคุณสามารถใช้ JavaScript API ที่ยืดหยุ่นได้มากขึ้น
แรงบันดาลใจจาก FFMPEG-CONCAT การแก้ไขเร็วกว่ามากและไม่ต้องการพื้นที่เก็บข้อมูลมากนักเนื่องจากใช้การแก้ไข สตรีมมิ่ง แก้ไขมีจุดมุ่งหมายที่จะขยายได้มากและมีคุณลักษณะที่อุดมไปด้วยอินเทอร์เฟซที่สามารถเพิ่มได้สำหรับการเพิ่ม เนื้อหาแบบไดนามิก ใหม่

GIF / YouTube นี้ถูกสร้างขึ้นด้วยคำสั่งนี้: "Editly CommonFeatures.json5" ดูตัวอย่างเพิ่มเติมที่นี่
cutFrom / cutTo กับ duration ของแต่ละคลิป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หรือสร้าง MP4 (หรือ GIF) จาก JSON หรือ JSON5 EDIT SPEC (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 | ค่าเริ่มต้นจางหายไปเส้นโค้งใน Audio Cross Fades | tri | ||
defaults.transition.audioInCurve | ค่าเริ่มต้นจางหายไปในเส้นโค้งใน Audio Cross Fades | tri | ||
clips[] | รายชื่อวัตถุคลิปที่จะเล่นตามลำดับ แต่ละคลิปสามารถมีหนึ่งชั้นขึ้นไป | |||
clips[].duration | ระยะเวลาคลิป ดู defaults.duration หาก UNSET ระยะเวลาคลิปจะเป็นของ ชั้นวิดีโอแรก | 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-transitions หรือสิ่งใด ๆ ต่อไปนี้: directional-left directional-right directional-up directional-down สุ่มหรือ dummy random
ดูตัวอย่างและ CommonFeatures.json5
สำหรับเลเยอร์วิดีโอหากมีการระบุ 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 anchor | left | left หรือ right |
originY | y anchor | 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
ภาพซ้อนทับด้วยตำแหน่งและขนาดที่กำหนดเองบนหน้าจอ หมายเหตุ: หากคุณต้องการใช้ GIF แบบเคลื่อนไหวให้ใช้ 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 shader ดู gl.json5 และสีรุ้ง
fragmentPathvertexPath (ไม่บังคับ) คุณสมบัติ audioTracks สามารถเลือกรายการวัตถุที่ระบุแทร็กเสียงที่สามารถเริ่มต้นได้ในเวลาที่กำหนดในวิดีโอสุดท้าย แทร็กเหล่านี้จะผสมเข้าด้วยกัน ( mixVolume ระบุหมายเลขสัมพัทธ์สำหรับความดังแต่ละแทร็กเมื่อเปรียบเทียบกับแทร็กอื่น ๆ ) เนื่องจากเสียงจาก clips จะถูกผสมแยกต่างหากจาก audioTracks clipsAudioVolume จึงระบุปริมาณของเสียง รวม จาก clips ที่สัมพันธ์กับปริมาตรของ แทร็กเสียงแต่ละแทร็ก จาก audioTracks
| พารามิเตอร์ | คำอธิบาย | ค่าเริ่มต้น | |
|---|---|---|---|
audioTracks[].path | เส้นทางไฟล์สำหรับแทร็กนี้ | ||
audioTracks[].mixVolume | ปริมาณสัมพัทธ์สำหรับแทร็กนี้ | 1 | |
audioTracks[].cutFrom | ค่าเวลาในการตัดไฟล์ต้นฉบับ จาก | 0 | วินาที |
audioTracks[].cutTo | ค่าเวลาในการตัดไฟล์ต้นฉบับ เป็น | วินาที | |
audioTracks[].start | กี่วินาทีในวิดีโอเพื่อเริ่มแทร็กเสียงนี้ | 0 | วินาที |
ความแตกต่างระหว่าง audioTracks และ Layer Type 'Audio' คือ audioTracks จะยังคงเล่นในหลาย clips และสามารถเริ่มต้นและหยุดเมื่อต้องการ
ดูตัวอย่าง audioTracks
ดูเพิ่มเติมที่ เลเยอร์ประเภท 'detached-audio'
คุณสามารถเปิดใช้งานการทำให้เสียงเป็นมาตรฐานของเสียงสุดท้าย สิ่งนี้มีประโยชน์หากคุณต้องการให้ได้เสียงการพกพาเสียง (เช่นปริมาณแทร็กอื่น ๆ ที่ลดลงโดยอัตโนมัติเมื่อพูดถึงเสียง)
พารามิเตอร์ audioNorm มีการบันทึกไว้ที่นี่
ตัวอย่างของเสียง
resizeMode - วิธีการพอดีกับภาพกับหน้าจอ สามารถเป็นหนึ่งใน:
contain - วิดีโอทั้งหมดจะอยู่ในเฟรมและกล่องจดหมายcontain-blur - เหมือน contain แต่มีสำเนาเบลอเป็นกล่องจดหมายcover - วิดีโอถูกตัดเพื่อครอบคลุมทั้งหน้าจอstretch - วิดีโอจะถูกยืดออกเพื่อครอบคลุมทั้งหน้าจอ (ละเว้นอัตราส่วนภาพ) ค่าเริ่มต้น contain-blur
ดู:
เลเยอร์บางชั้นรองรับพารามิเตอร์ตำแหน่ง
position สามารถเป็นหนึ่งใน:
top , center bottom , 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 เป็นตัวเลือกและระบุที่มาของตำแหน่ง (ตำแหน่งจุดยึด) ของวัตถุดู position.json5
| พารามิเตอร์ | คำอธิบาย | ค่าเริ่มต้น | |
|---|---|---|---|
zoomDirection | ทิศทางการซูมสำหรับเคนเบิร์นส์เอฟเฟกต์: in , out , left , 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 ใหม่ล่าสุดล่าสุด โครงการนี้ได้รับการดูแลโดยฉันคนเดียว โครงการจะยังคงเป็นอิสระและโอเพ่นซอร์สอยู่เสมอ แต่ถ้ามันมีประโยชน์สำหรับคุณให้พิจารณาสนับสนุนฉัน :) มันจะให้แรงจูงใจพิเศษแก่ฉันในการปรับปรุง
paypal
แพ็คเกจนี้จะไม่มีอยู่จริงหากปราศจากการสนับสนุนและความช่วยเหลือจากผู้มีส่วนร่วมและผู้สนับสนุนทั้งหมด!
ขอขอบคุณเป็นพิเศษ:
ส่ง PR หากคุณต้องการแบ่งปันวิดีโอหรือโครงการที่สร้างขึ้นด้วยการแก้ไขที่นี่
ทำด้วย❤ใน ??
แอพเพิ่มเติมโดย mifi.no
ติดตามฉันบน GitHub, YouTube, IG, Twitter สำหรับเนื้อหาที่ยอดเยี่ยมมากขึ้น!