Editly هي أداة وإطار عمل لـ NLE ( تحرير الفيديو غير الخطي ) باستخدام Node.js و FFMPEG. يتيح لك Editly إنشاء مقطع فيديو بسهولة وبرمجي من مجموعة من المقاطع والصور والصوت والعناوين ، مع تحولات سلسة وموسيقى متداخلة.
يحتوي Editly على CLI بسيط لتجميع مقطع فيديو بسرعة من مجموعة من المقاطع أو الصور ، أو يمكنك استخدام واجهة برمجة تطبيقات JavaScript الأكثر مرونة.
مستوحى من FFMPEG-Concat ، يعد تحريره أسرع بكثير ولا يتطلب تخزينًا كبيرًا لأنه يستخدم تحرير البث . يهدف Editly إلى أن تكون قابلاً للتوسعة للغاية وأن تكون غنية بواجهة قابلة للتوصيل لإضافة محتوى ديناميكي جديد.

تم إنشاء هذا GIF / YouTube مع هذا الأمر: "editly commonfeatures.json5". رؤية المزيد من الأمثلة هنا.
cutFrom / cutTo مع duration كل مقطعVideo must be 1337x1000 30fps )انظر الأمثلة
ffmpeg (و ffprobe ) مثبتة ومتاحة في PATH npm i -g editly
Runly 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 (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
بالنسبة لطبقات الفيديو ، إذا تم تحديد 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-Position بالنسبة لعرض الشاشة | 0 | 0 إلى 1 |
top | y الموضع بالنسبة لارتفاع الشاشة | 0 | 0 إلى 1 |
originX | x مرساة | left | left أو right |
originY | ص مرساة | 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 | انظر أوضاع تغيير الحجم |
انظر أيضا انظر معلمات كين بيرنز.
تراكب الصورة مع موضع وحجم مخصص على الشاشة. ملاحظة: إذا كنت ترغب في استخدام صور متحركة ، فاستخدم video بدلاً من ذلك.
| المعلمة | وصف | تقصير | |
|---|---|---|---|
path | مسار إلى ملف الصورة | ||
position | انظر المعلمة الموضع | ||
width | العرض (من 0 إلى 1) حيث 1 هو عرض الشاشة | ||
height | الارتفاع (من 0 إلى 1) حيث 1 هو ارتفاع الشاشة |
انظر أيضا كين بيرنز المعلمات.
fontPath - انظر defaults.layer.fontPathtext - نص العنوان لإظهاره ، اجعله قصيرًاtextColor - الافتراضي #ffffffposition - انظر معلمة الموضعانظر أيضًا معلمات كين بيرنز
fontPath - انظر defaults.layer.fontPathtext - نص الترجمة لإظهارtextColor - الافتراضي #ffffff العنوان مع الخلفية
text - انظر title النوعtextColor - انظر title النوعbackground { 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 ونوع الطبقة "Audio" هو أن audioTracks سيستمر في اللعب عبر clips متعددة ويمكن أن تبدأ وتتوقف عند الحاجة.
انظر مثال audioTracks
انظر أيضًا نوع الطبقة "المنفصل-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 اختياريين ، وحدد أصل الموضع (موضع المرساة) للكائن.انظر الموضع. json5
| المعلمة | وصف | تقصير | |
|---|---|---|---|
zoomDirection | اتجاه التكبير لتأثير كين بيرنز: in ، out ، left ، right أو null لتعطيل | ||
zoomAmount | تكبير المبلغ لتأثير كين بيرنز | 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
لن تكون هذه الحزمة موجودة بدون الدعم والمساعدة من جميع المساهمين والرعاة!
شكر خاص ل:
أرسل العلاقات العامة إذا كنت ترغب في مشاركة مقاطع الفيديو الخاصة بك أو المشروع الذي تم إنشاؤه مع تحرير هنا.
مصنوعة مع ❤ في ؟؟
المزيد من التطبيقات من قبل mifi.no
اتبعني على Github و YouTube و IG و Twitter لمزيد من المحتوى الرائع!