Editly adalah alat dan kerangka kerja untuk Deklaratif NLE ( pengeditan video non-linear ) menggunakan Node.js dan FFMPEG. Editly memungkinkan Anda untuk dengan mudah dan terprogram membuat video dari satu set klip, gambar, audio dan judul , dengan transisi yang halus dan musik yang dilapisi.
Editly memiliki CLI sederhana untuk dengan cepat merakit video dari satu set klip atau gambar, atau Anda dapat menggunakan JavaScript API yang lebih fleksibel.
Terinspirasi oleh FFMPEG-CONCAT, editly jauh lebih cepat dan tidak memerlukan banyak penyimpanan karena menggunakan pengeditan streaming . Editly bertujuan untuk menjadi sangat dapat diperluas dan fitur kaya dengan antarmuka pluggable untuk menambahkan konten dinamis baru.

GIF / YouTube ini dibuat dengan perintah ini: "Editly CommonFeatures.json5". Lihat lebih banyak contoh di sini.
cutFrom / cutTo dengan duration masing -masing klipVideo must be 1337x1000 30fps )Lihat contoh
ffmpeg (dan ffprobe ) diinstal dan tersedia di PATH npm i -g editly
Jalankan editly --help untuk digunakan
Buat edit video acak sederhana dari video, gambar, dan teks dengan trek audio:
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.mp3Atau Buat MP4 (atau GIF) dari JSON atau JSON5 Edit Spec (JSON5 hanyalah format JSON yang lebih ramah pengguna) :
editly my-spec.json5 --fast --keep-source-audio --out output.gifUntuk contoh cara membuat spek edit JSON, lihat di bawah atau contoh.
Tanpa --fast , akan default menggunakan lebar , tinggi dan laju bingkai dari video input pertama . Semua klip lain akan dikonversi ke dimensi ini. Anda tentu saja dapat mengesampingkan salah satu atau semua parameter ini.
--audio-file-path di file video. Pastikan untuk menghormati lisensi mereka! import editly from 'editly' ;
// See editSpec documentation
await editly ( editSpec ) Edit spesifikasi adalah objek JavaScript / JSON yang menggambarkan seluruh operasi edit dengan struktur berikut:
{
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 ,
}| Parameter | Setara CLI | Keterangan | Bawaan | |
|---|---|---|---|---|
outPath | --out | Jalur output (mp4, mkv), juga bisa menjadi .gif | ||
width | --width | Lebar yang akan dikonversi semua media | 640 | |
height | --height | Tinggi yang semua media akan dikonversi | Auto Berdasarkan Rasio width dan Aspek Video Pertama | |
fps | --fps | Fps yang semua video akan dikonversi | FPS Video Pertama atau 25 | |
customOutputArgs | Tentukan Argumen Codec/Format Output Kustom untuk FFMPEG (lihat contoh) | Auto (H264) | ||
allowRemoteRequests | --allow-remote-requests | Izinkan URL jarak jauh sebagai jalur | false | |
fast | --fast , -f | Mode cepat (resolusi rendah dan FPS, berguna untuk mendapatkan pratinjau cepat ⏩) | false | |
defaults.layer.fontPath | --font-path | Atur font default ke .ttf | Font Sistem | |
defaults.layer.* | Tetapkan parameter lapisan apa pun yang akan diwariskan semua lapisan | |||
defaults.duration | --clip-duration | Atur durasi klip default untuk klip yang tidak memiliki durasi sendiri | 4 | detik |
defaults.transition | Objek { name, duration } yang menggambarkan transisi default. Diatur ke null untuk menonaktifkan transisi | |||
defaults.transition.duration | --transition-duration | Durasi transisi default | 0.5 | detik |
defaults.transition.name | --transition-name | Jenis transisi default. Lihat jenis transisi | random | |
defaults.transition.audioOutCurve | Kurva Fade Out Default Di Audio Cross memudar | tri | ||
defaults.transition.audioInCurve | Default memudar dalam kurva di silang audio memudar | tri | ||
clips[] | Daftar objek klip yang akan diputar secara berurutan. Setiap klip dapat memiliki satu atau lebih lapisan. | |||
clips[].duration | Durasi klip. Lihat defaults.duration . Jika tidak ada, durasi klip akan menjadi lapisan video pertama . | defaults.duration | ||
clips[].transition | Tentukan transisi di akhir klip ini. Lihat defaults.transition | defaults.transition | ||
clips[].layers[] | Daftar lapisan dalam klip saat ini yang akan dilapis dalam urutan alami mereka (lapisan akhir di atas) | |||
clips[].layers[].type | Jenis Lapisan, lihat di bawah | |||
clips[].layers[].start | Jam berapa ke dalam klip seharusnya lapisan ini dimulai | detik | ||
clips[].layers[].stop | Jam berapa ke dalam klip harus berhenti lapisan ini | detik | ||
audioTracks[] | Daftar trek audio sewenang -wenang. Lihat trek audio. | [] | ||
audioFilePath | --audio-file-path | Tetapkan trek audio untuk seluruh video. Lihat juga trek audio | ||
loopAudio | --loop-audio | Loop trek audio jika lebih pendek dari video? | false | |
keepSourceAudio | --keep-source-audio | Simpan audio sumber dari clips ? | false | |
clipsAudioVolume | Volume audio dari clips relatif terhadap audioTracks . Lihat trek audio. | 1 | ||
outputVolume | --output-volume | Sesuaikan volume output (tahap akhir). Lihat contoh | 1 | misalnya 0.5 atau 10dB |
audioNorm.enable | Mengaktifkan normalisasi audio? Lihat normalisasi audio. | false | ||
audioNorm.gaussSize | Ukuran Gauss Normalisasi Audio. Lihat normalisasi audio. | 5 | ||
audioNorm.maxGain | Normalisasi audio Gain maks. Lihat normalisasi audio. | 30 |
transition.name dapat berupa transisi GL, atau salah satu dari yang berikut: directional-left , directional-right , directional-up , directional-down , random atau dummy .
Lihat contoh dan CommonFeatures.json5
Untuk lapisan video, jika clip.duration induk. Durasi ditentukan, video akan diperlambat/diperpendek untuk mencocokkan clip.duration . Jika cutFrom / cutTo diatur, segmen yang dihasilkan ( cutTo - cutFrom ) akan diperlambat / diperpendek agar sesuai dengan clip.duration . Jika lapisan memiliki audio, itu akan disimpan (dan dicampur dengan lapisan audio lainnya jika ada.)
| Parameter | Keterangan | Bawaan | |
|---|---|---|---|
path | Jalur ke file video | ||
resizeMode | Lihat mode Ubah Ulang | ||
cutFrom | Nilai waktu untuk dipotong dari | 0 | detik |
cutTo | Nilai waktu untuk dipotong | akhir video | detik |
width | Lebar relatif terhadap lebar layar | 1 | 0 hingga 1 |
height | Tinggi relatif terhadap tinggi layar | 1 | 0 hingga 1 |
left | X-POSISI relatif terhadap lebar layar | 0 | 0 hingga 1 |
top | Posisi-y relatif terhadap tinggi layar | 0 | 0 hingga 1 |
originX | X jangkar | left | left atau right |
originY | Y jangkar | top | top atau bottom |
mixVolume | Volume relatif saat mencampur trek audio video ini dengan orang lain | 1 |
Lapisan audio akan dicampur bersama. Jika cutFrom / cutTo diatur, segmen yang dihasilkan ( cutTo - cutFrom ) akan diperlambat / diperpendek agar sesuai dengan clip.duration . Operasi perlambatan/speed-up terbatas pada nilai antara 0.5x dan 100x .
| Parameter | Keterangan | Bawaan | |
|---|---|---|---|
path | Jalur ke file audio | ||
cutFrom | Nilai waktu untuk dipotong dari | 0 | detik |
cutTo | Nilai waktu untuk dipotong | clip.duration | detik |
mixVolume | Volume relatif saat mencampur trek audio ini dengan orang lain | 1 |
Ini adalah kasus khusus dari audioTracks yang membuatnya lebih mudah untuk memulai audio relatif terhadap clips waktu mulai tanpa harus menghitung waktu mulai global.
detached-audio memiliki sifat yang sama persis dengan audioetracks, kecuali waktu start relatif terhadap awal klip.
Contoh trek audio terpisah
Gambar layar penuh
| Parameter | Keterangan | Bawaan | |
|---|---|---|---|
path | Jalur ke file gambar | ||
resizeMode | Lihat mode Ubah Ulang |
Lihat juga lihat parameter Ken Burns.
Overlay gambar dengan posisi dan ukuran khusus di layar. Catatan: Jika Anda ingin menggunakan gif animasi, gunakan video sebagai gantinya.
| Parameter | Keterangan | Bawaan | |
|---|---|---|---|
path | Jalur ke file gambar | ||
position | Lihat Parameter Posisi | ||
width | Lebar (dari 0 hingga 1) di mana 1 adalah lebar layar | ||
height | Tinggi (dari 0 hingga 1) di mana 1 adalah tinggi layar |
Lihat juga parameter Ken Burns.
fontPath - lihat defaults.layer.fontPathtext - Judul Teks untuk Ditampilkan, Tetap SingkattextColor - Default #ffffffposition - Lihat Parameter PosisiLihat juga parameter Ken Burns
fontPath - lihat defaults.layer.fontPathtext - teks subtitle untuk ditampilkantextColor - Default #ffffff Judul dengan latar belakang
text - Lihat title JenistextColor - Lihat title Jenisbackground { type, ... } -Lihat Jenis radial-gradient , linear-gradient atau fill-colorfontPath - Lihat title Jenis fontPath - lihat defaults.layer.fontPathtexttextColor - Default #ffffffbackgroundColor - Default #d02a42position - Lihat Parameter Posisi fontPath - lihat defaults.layer.fontPathtextfontSizecharSpacingcolorposition - Lihat Parameter Posisi color - Warna untuk mengisi latar belakang, default: acak colors - Array Dua Warna, Default: Randomisasi colors - Array Dua Warna, Default: Randomisasi ???
Lihat CustomCanvas.js
func - Fungsi JavaScript Kustom Lihat CustomFabric.js
func - Fungsi JavaScript Kustom Memuat shader GLSL. Lihat Gl.Json5 dan Rainbow-Colors.Frag
fragmentPathvertexPath (opsional) Properti audioTracks secara opsional dapat berisi daftar objek yang menentukan trek audio yang dapat dimulai pada waktu sewenang -wenang dalam video akhir. Lagu -lagu ini akan dicampur bersama ( mixVolume menentukan angka relatif untuk seberapa keras setiap trek dibandingkan dengan trek lainnya). Karena audio dari clips akan dicampur secara terpisah dari audioTracks , clipsAudioVolume menentukan volume audio gabungan dari clips relatif terhadap volume masing -masing trek audio dari audioTracks .
| Parameter | Keterangan | Bawaan | |
|---|---|---|---|
audioTracks[].path | Jalur file untuk trek ini | ||
audioTracks[].mixVolume | Volume relatif untuk trek ini | 1 | |
audioTracks[].cutFrom | Nilai waktu untuk memotong file sumber dari | 0 | detik |
audioTracks[].cutTo | Nilai waktu untuk memotong file sumber ke | detik | |
audioTracks[].start | Berapa detik ke dalam video untuk memulai trek audio ini | 0 | detik |
Perbedaan antara audioTracks dan tipe layer 'audio' adalah bahwa audioTracks akan terus bermain di beberapa clips dan dapat mulai dan berhenti kapan pun diperlukan.
Lihat contoh audioTracks
Lihat juga tipe layer 'terlepas-audio' .
Anda dapat mengaktifkan normalisasi audio dari audio output akhir. Ini berguna jika Anda ingin mencapai ducking audio (misalnya secara otomatis lebih rendah volume semua trek lain ketika voice-over berbicara).
Parameter audioNorm didokumentasikan di sini.
Contoh Audio Ducking
resizeMode - Cara menyesuaikan gambar ke layar. Bisa menjadi salah satu dari:
contain - semua video akan terkandung dalam bingkai dan kotak suratcontain-blur - suka contain , tetapi dengan salinan kabur sebagai kotak suratcover - Video dipotong untuk menutupi seluruh layar (rasio aspek yang dipertahankan)stretch - Video akan diregangkan untuk menutupi seluruh layar (rasio aspek diabaikan). Default contain-blur .
Melihat:
Lapisan tertentu mendukung parameter posisi
position bisa menjadi salah satu dari keduanya:
top , center bottom , top-left , top-right , center-left , center-right , bottom-left , bottom-right{ x, y, originX = 'left', originY = 'top' } , di mana { x: 0, y: 0 } adalah sudut kiri atas layar, dan { x: 1, y: 1 } adalah sudut kanan bawah, x relatif terhadap lebar video, y ke ketinggian video. originX dan originY adalah opsional, dan tentukan asal posisi (posisi jangkar) dari objek.Lihat Posisi.json5
| Parameter | Keterangan | Bawaan | |
|---|---|---|---|
zoomDirection | Arah zoom untuk efek Ken Burns: in , out , left , right atau null untuk menonaktifkan | ||
zoomAmount | Jumlah zoom untuk efek Ken Burns | 0.1 |
Ini akan membantu Anda menggunakan CLI yang diawasi, tanpa khawatir mendapatkan semua versi dependensi yang tepat pada sistem Anda.
$ 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. , coba: npm un -g editly && npm i -g --build-from-source editly (lihat #15)/bin/sh: pkg-config: command not found , coba gunakan versi node.js lts terbaru Proyek ini dipertahankan oleh saya sendiri. Proyek ini akan selalu tetap bebas dan open source, tetapi jika itu berguna untuk Anda, pertimbangkan untuk mendukung saya. :) Ini akan memberi saya motivasi ekstra untuk memperbaikinya.
Paypal
Paket ini tidak akan ada tanpa dukungan dan bantuan dari semua kontributor dan sponsor!
Terima kasih khusus kepada:
Kirimkan PR jika Anda ingin membagikan video atau proyek Anda yang dibuat dengan edit di sini.
Dibuat dengan ❤️ di ??
Lebih banyak aplikasi oleh mifi.no
Ikuti saya di GitHub, YouTube, IG, Twitter untuk konten yang lebih luar biasa!