
نظام قوالب Rendervid - قوالب JSON، المتغيرات، الرسوم المتحركة والانتقالات
دليل شامل لنظام قوالب Rendervid. تعلم كيفية إنشاء قوالب فيديو JSON، استخدام المتغيرات الديناميكية بصيغة {{variable}}، تكوين أكثر من 40 إعداد مسبق للرسوم المتحرك...

انشر Rendervid في أي مكان: العرض في المتصفح للمعاينات، Node.js لمعالجة الدفعات من جانب الخادم، أو العرض السحابي على AWS Lambda وAzure Functions وGCP وDocker للحصول على عرض متوازٍ أسرع بـ 10-50 مرة.
تم تصميم Rendervid للعرض في أي مكان يتطلبه سير عملك. سواء كنت بحاجة إلى معاينات فورية في المتصفح، أو ترميز فيديو بجودة إنتاجية على الخادم، أو عرض متوازٍ بشكل كبير عبر البنية التحتية السحابية، يوفر Rendervid حزمة مخصصة لكل بيئة. تشترك جميع أهداف النشر في نفس نظام القوالب ومكتبة المكونات ، لذا فإن القالب الذي يعمل في المتصفح يعمل بشكل مماثل على AWS Lambda أو في حاوية Docker.
يغطي هذا الدليل جميع بيئات النشر الأربع، وخيارات العرض المتاحة في كل منها، والميزات المتقدمة مثل ضبابية الحركة، وتصدير GIF، وتحسين الأداء. بحلول النهاية، ستعرف بالضبط أي مسار نشر يناسب مشروعك وكيفية تكوينه.
+---------------------+
| JSON Template |
+----------+----------+
|
+--------------------+--------------------+
| | |
+--------v--------+ +-------v--------+ +-------v---------+
| Browser | | Node.js | | Cloud |
| @rendervid/ | | @rendervid/ | | @rendervid/ |
| renderer-browser | | renderer-node | | cloud-rendering |
+---------+--------+ +-------+--------+ +-------+---------+
| | |
Canvas / WebM FFmpeg / Playwright Parallel Workers
| | |
+---------v--------+ +------v---------+ +-------v---------+
| MP4, WebM, PNG, | | MP4, WebM, MOV,| | AWS Lambda |
| JPEG, WebP | | GIF, H.265 | | Azure Functions |
+------------------+ +----------------+ | GCP Functions |
| Docker |
+-----------------+
تتعامل حزمة @rendervid/renderer-browser مع العرض من جانب العميل بالكامل داخل متصفح المستخدم. لا يلزم وجود بنية تحتية للخادم. هذا يجعلها أسرع مسار من القالب إلى المعاينة.
npm install @rendervid/renderer-browser
يستخدم العرض في المتصفح HTML Canvas API لرسم كل إطار من القالب. يمر العارض عبر كل مشهد وطبقة، ويطبق الرسوم المتحركة ووظائف التخفيف، ويركب النتيجة على عنصر canvas، ويلتقط كل إطار. لإخراج الفيديو، يتم ترميز الإطارات باستخدام واجهة برمجة التطبيقات MediaRecorder المدمجة في المتصفح (WebM) أو مشفر MP4 القائم على WebAssembly.
| التنسيق | الامتداد | ملاحظات |
|---|---|---|
| MP4 | .mp4 | H.264 عبر مشفر WebAssembly |
| WebM | .webm | VP8/VP9 عبر MediaRecorder API |
| PNG | .png | إطار واحد أو تسلسل صور |
| JPEG | .jpeg | إطار واحد، جودة قابلة للتكوين |
| WebP | .webp | إطار واحد، حجم ملف أصغر |
import { BrowserRenderer } from "@rendervid/renderer-browser";
const renderer = new BrowserRenderer();
const template = {
width: 1920,
height: 1080,
fps: 30,
scenes: [
{
duration: 5,
layers: [
{
type: "text",
text: "Hello from the Browser",
fontSize: 72,
color: "#ffffff",
position: { x: 960, y: 540 },
animation: {
entrance: { type: "fadeIn", duration: 1 },
},
},
],
},
],
};
// العرض على عنصر canvas للمعاينة
const canvas = document.getElementById("preview") as HTMLCanvasElement;
await renderer.preview(template, canvas);
// التصدير كـ MP4
const mp4Blob = await renderer.render(template, {
format: "mp4",
quality: "standard",
});
// تصدير إطار واحد كـ PNG
const pngBlob = await renderer.renderFrame(template, {
format: "png",
frameNumber: 0,
});
توفر حزمة @rendervid/renderer-node العرض من جانب الخادم مع تكامل FFmpeg الكامل. تستخدم Playwright أو Puppeteer لعرض كل إطار في متصفح بدون رأس، ثم توجه الإطارات إلى FFmpeg لترميز فيديو بجودة احترافية.
# تثبيت العارض
npm install @rendervid/renderer-node
# تثبيت Playwright (يشمل ملفات المتصفح الثنائية)
npx playwright install chromium
# تثبيت FFmpeg (مطلوب لترميز الفيديو)
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt-get install ffmpeg
# Windows (عبر Chocolatey)
choco install ffmpeg
| التنسيق | الامتداد | Codec | ملاحظات |
|---|---|---|---|
| MP4 | .mp4 | H.264 | توافق عالمي |
| MP4 | .mp4 | H.265/HEVC | ملفات أصغر بنسبة 50٪، أجهزة أحدث |
| WebM | .webm | VP8/VP9 | محسّن للويب |
| MOV | .mov | ProRes | سير عمل التحرير الاحترافي |
| GIF | .gif | قائم على اللوحة | متحرك مع التحسين |
| PNG | .png | بدون فقدان | تسلسل صور أو إطار واحد |
| JPEG | .jpeg | مع فقدان | جودة قابلة للتكوين |
| WebP | .webp | مع/بدون فقدان | تنسيق ويب حديث |
يوفر Rendervid أربعة إعدادات مسبقة للجودة تتحكم في معلمات الترميز:
| الإعداد المسبق | معدل البت | حالة الاستخدام |
|---|---|---|
draft | منخفض | معاينات سريعة أثناء التطوير |
standard | متوسط | إخراج للأغراض العامة، جودة/حجم جيد |
high | عالي | مواد تسويقية، تسليمات نهائية |
lossless | أقصى | أرشفة، مزيد من التحرير، بدون فقدان جودة |
يدعم عارض Node.js التسريع بالأجهزة لتفريغ الترميز على GPU. هذا يقلل بشكل كبير من وقت العرض للقوالب المعقدة ذات الطبقات المتعددة والدقة العالية والتأثيرات.
const result = await renderer.render(template, {
format: "mp4",
quality: "high",
outputPath: "/output/video.mp4",
hardwareAcceleration: true,
});
يتوفر تسريع GPU على الأنظمة ذات أجهزة NVIDIA (NVENC) أو AMD (AMF) أو Intel (Quick Sync) المتوافقة. يجب تجميع FFmpeg مع دعم المشفر المقابل.
import { NodeRenderer } from "@rendervid/renderer-node";
const renderer = new NodeRenderer();
const template = {
width: 1920,
height: 1080,
fps: 60,
scenes: [
{
duration: 10,
layers: [
{
type: "video",
src: "/assets/background.mp4",
fit: "cover",
},
{
type: "text",
text: "{{headline}}",
fontSize: 64,
color: "#ffffff",
fontFamily: "Inter",
position: { x: 960, y: 540 },
animation: {
entrance: { type: "slideInUp", duration: 0.8 },
exit: { type: "fadeOut", duration: 0.5 },
},
},
],
},
],
inputs: {
headline: {
type: "text",
label: "Headline",
default: "Your Product, Elevated",
},
},
};
// العرض مع مدخلات مخصصة
const result = await renderer.render(template, {
format: "mp4",
quality: "high",
outputPath: "/output/promo.mp4",
renderWaitTime: 2000, // انتظر ثانيتين لتحميل الوسائط
inputs: {
headline: "Summer Sale — 50% Off Everything",
},
});
console.log(`Rendered: ${result.outputPath}`);
console.log(`Duration: ${result.duration}s`);
console.log(`File size: ${(result.fileSize / 1024 / 1024).toFixed(2)} MB`);
لمعالجة العديد من القوالب بالتسلسل، استخدم واجهة برمجة التطبيقات للدفعات:
import { NodeRenderer } from "@rendervid/renderer-node";
const renderer = new NodeRenderer();
const templates = [
{ template: socialTemplate, inputs: { name: "Alice" }, output: "alice.mp4" },
{ template: socialTemplate, inputs: { name: "Bob" }, output: "bob.mp4" },
{ template: socialTemplate, inputs: { name: "Carol" }, output: "carol.mp4" },
];
for (const job of templates) {
await renderer.render(job.template, {
format: "mp4",
quality: "standard",
outputPath: `/output/${job.output}`,
inputs: job.inputs,
});
}
للعرض المتوازي الحقيقي على جهاز واحد، راجع قسم العرض المحلي بـ Docker أدناه.
تتيح حزمة @rendervid/cloud-rendering العرض الموزع والمتوازي عبر البنية التحتية السحابية. بدلاً من عرض الإطارات بشكل تسلسلي على جهاز واحد، يقسم العرض السحابي العمل عبر العديد من وظائف العمال التي تعرض الإطارات في وقت واحد، ثم يدمجها في الإخراج النهائي.
+------------------+
| Your App |
| (Coordinator) |
+--------+---------+
|
| 1. Split video into frame chunks
v
+--------+---------+
| Chunk Splitter |
+--------+---------+
|
| 2. Distribute chunks to workers
v
+--------+---+---+---+---+--------+
| Worker 1 | Worker 2 | Worker N |
| (Lambda/ | (Lambda/ | (Lambda/ |
| Azure/ | Azure/ | Azure/ |
| GCP) | GCP) | GCP) |
+-----+------+----+------+----+----+
| | |
| 3. Each worker renders its frames
v v v
+-----+------+----+------+----+----+
| Frames | Frames | Frames |
| 001-030 | 031-060 | 061-090|
+-----+------+----+------+----+----+
| | |
+------+-----+-----+----+
|
v
+-------+--------+
| Merger |
| (FFmpeg concat) |
+-------+---------+
|
| 4. Combine into final video
v
+-------+---------+
| Object Storage |
| S3 / Blob / GCS |
+------------------+
|
| 5. Download or serve
v
+-------+---------+
| Final Output |
| video.mp4 |
+------------------+
كيف يعمل خطوة بخطوة:
import { CloudRenderer } from "@rendervid/cloud-rendering";
const cloudRenderer = new CloudRenderer({
provider: "aws", // "aws" | "azure" | "gcp" | "docker"
quality: "standard", // "draft" | "standard" | "high"
downloadToLocal: true,
outputPath: "/output/final.mp4",
});
واجهة التكوين الكاملة:
interface CloudRenderConfig {
provider: "aws" | "azure" | "gcp" | "docker";
quality: "draft" | "standard" | "high";
downloadToLocal: boolean;
outputPath: string;
awsConfig?: {
region: string;
s3Bucket: string;
s3Prefix: string;
};
azureConfig?: {
resourceGroup: string;
storageAccount: string;
containerName: string;
};
gcpConfig?: {
projectId: string;
bucketName: string;
region: string;
};
dockerConfig?: {
volumePath: string;
workersCount: number;
};
}
AWS Lambda هو هدف النشر السحابي الأكثر شيوعًا. تعمل كل وظيفة عامل في استدعاء Lambda منفصل، مما يتيح التوازي الهائل.
المتطلبات الأساسية:
التكوين:
import { CloudRenderer } from "@rendervid/cloud-rendering";
const renderer = new CloudRenderer({
provider: "aws",
quality: "high",
downloadToLocal: true,
outputPath: "/output/video.mp4",
awsConfig: {
region: "us-east-1",
s3Bucket: "my-rendervid-output",
s3Prefix: "renders/",
},
});
const result = await renderer.render(template);
console.log(`Rendered in ${result.renderTime}ms`);
console.log(`Workers used: ${result.workersUsed}`);
console.log(`Output: ${result.outputUrl}`);
تكوين AWS Lambda النموذجي:
const renderer = new CloudRenderer({
provider: "azure",
quality: "standard",
downloadToLocal: true,
outputPath: "/output/video.mp4",
azureConfig: {
resourceGroup: "rendervid-rg",
storageAccount: "rendervidstore",
containerName: "renders",
},
});
const result = await renderer.render(template);
const renderer = new CloudRenderer({
provider: "gcp",
quality: "standard",
downloadToLocal: true,
outputPath: "/output/video.mp4",
gcpConfig: {
projectId: "my-project-id",
bucketName: "rendervid-output",
region: "us-central1",
},
});
const result = await renderer.render(template);
| المزود | التكلفة لكل دقيقة | التكلفة لكل ساعة | ملاحظات |
|---|---|---|---|
| AWS Lambda | ~0.02 دولار | ~1.00 دولار | الدفع لكل 1 ميلي ثانية من الحوسبة |
| Azure Functions | ~0.02 دولار | ~1.00 دولار | تسعير خطة الاستهلاك |
| Google Cloud Functions | ~0.02 دولار | ~1.00 دولار | الدفع لكل 100 ميلي ثانية من الحوسبة |
| Docker (محلي) | مجاني | مجاني | يستخدم أجهزتك الخاصة |
تقدم جميع مزودي السحابة مستويات مجانية تغطي أحمال عمل العرض الكبيرة أثناء التطوير والإنتاج منخفض الحجم.
يحقق العرض السحابي تسريعًا بمقدار 10-50 مرة مقارنة بالعرض التسلسلي على جهاز واحد. يعتمد التسريع الدقيق على عدد العمال وتعقيد القالب ومدة الفيديو.
| مدة الفيديو | التسلسلي (جهاز واحد) | السحابة (50 عاملاً) | التسريع |
|---|---|---|---|
| 30 ثانية | ~90 ثانية | ~5 ثوانٍ | 18x |
| دقيقتان | ~6 دقائق | ~15 ثانية | 24x |
| 10 دقائق | ~30 دقيقة | ~45 ثانية | 40x |
| 30 دقيقة | ~90 دقيقة | ~دقيقتان | 45x |
تستفيد مقاطع الفيديو الأطول أكثر من التوازي لأن تكلفة بدء تشغيل العامل ودمج الإطار يتم توزيعها على المزيد من الإطارات.
يمنحك العرض القائم على Docker نفس بنية العرض المتوازي مثل العرض السحابي، ولكنه يعمل بالكامل على جهازك المحلي. إنه مجاني تمامًا، ولا يستخدم حسابات سحابية، وهو مثالي للإعدادات المستضافة ذاتيًا والتطوير والفرق التي تريد عرضًا متوازيًا بدون تكاليف سحابية.
# تأكد من تثبيت Docker وتشغيله
docker --version
# تثبيت حزمة العرض السحابي
npm install @rendervid/cloud-rendering
import { CloudRenderer } from "@rendervid/cloud-rendering";
const renderer = new CloudRenderer({
provider: "docker",
quality: "high",
downloadToLocal: true,
outputPath: "/output/video.mp4",
dockerConfig: {
volumePath: "/tmp/rendervid-work",
workersCount: 8, // عدد حاويات Docker للتشغيل بالتوازي
},
});
const result = await renderer.render(template);
console.log(`Rendered in ${result.renderTime}ms using ${result.workersUsed} workers`);
اختيار workersCount: اضبط هذا على عدد أنوية وحدة المعالجة المركزية المتاحة على جهازك. على سبيل المثال، يعمل جهاز بـ 8 أنوية بشكل جيد مع 8 عمال. الذهاب إلى ما بعد عدد الأنوية يضيف تكلفة من تبديل السياق دون تحسين الإنتاجية.
+------------------+
| Coordinator |
| (your process) |
+--------+---------+
|
+-----+-----+-----+-----+
| | | | |
+--v--+ +--v-+ +-v--+ +-v--+
| C1 | | C2 | | C3 | | C4 | ... Docker containers
+--+--+ +--+-+ +-+--+ +-+--+
| | | |
v v v v
+--+------+-----+------+--+
| Shared Volume |
| /tmp/rendervid-work |
+-------------+-------------+
|
v
+-------+--------+
| Merger |
+-------+---------+
|
v
+-------+---------+
| /output/video |
+-----------------+
كل حاوية Docker هي عامل مستقل مع Node.js وPlaywright وFFmpeg مثبتة مسبقًا. يقرأ العمال تعييناتهم من الإطارات من المجلد المشترك، ويعرضون الإطارات، ويكتبون النتائج مرة أخرى. ثم يدمج المنسق جميع المقاطع في الإخراج النهائي.
يدعم Rendervid ضبابية الحركة من خلال العينات الفائقة الزمنية. بدلاً من عرض لحظة واحدة لكل إطار، يلتقط العارض إطارات فرعية متعددة في نقاط زمنية مختلفة قليلاً ويمزجها معًا. ينتج عن هذا الضبابية الطبيعية التي تنشئها الكاميرات عندما تتحرك الكائنات أثناء التعرض.
| الإعداد المسبق | العينات لكل إطار | مضاعف وقت العرض | جودة بصرية |
|---|---|---|---|
low | 5 | 5x | تنعيم خفيف |
medium | 10 | 10x | ضبابية ملحوظة على الحركة السريعة |
high | 16 | 16x | ضبابية حركة سينمائية |
ultra | 32 | 32x | درجة فيلم، ضبابية كثيفة |
const result = await renderer.render(template, {
format: "mp4",
quality: "high",
outputPath: "/output/cinematic.mp4",
motionBlur: {
enabled: true,
quality: "high", // 16 عينة لكل إطار
},
});
Frame N (no motion blur): Frame N (with motion blur, 5 samples):
Single instant: 5 sub-frames blended:
+--------+ +--------+ +--------+ +--------+
| O | | O | + | O | + | O | ...
+--------+ +--------+ +--------+ +--------+
|
v
+--------+
| ~O~ | <- Blended result
+--------+
يدفع كل إطار فرعي الجدول الزمني للرسوم المتحركة بزيادة صغيرة (1/fps مقسومًا على عدد العينات). ثم يتم مزج الإطارات الفرعية بألفا لإنتاج الإطار النهائي. تظهر الكائنات التي تحركت بين الإطارات الفرعية ضبابية على طول مسار حركتها، بينما تظل العناصر الثابتة حادة.
تضاعف ضبابية الحركة وقت العرض بشكل متناسب مع عدد العينات. يحتوي فيديو مدته 10 ثوانٍ بمعدل 30 إطارًا في الثانية على 300 إطار. مع جودة high (16 عينة)، يجب على العارض إنشاء 4,800 إطار فرعي بدلاً من 300. استخدم جودة draft أثناء التطوير وانتقل إلى high أو ultra للصادرات النهائية فقط.
يعمل العرض السحابي وعرض Docker المتوازي بشكل جيد مع ضبابية الحركة لأن تكلفة كل إطار يتم توزيعها عبر العمال. زيادة 16 مرة لكل إطار مقسومة على 16 عاملاً تؤدي إلى نفس وقت العرض الإجمالي تقريبًا كعرض غير ضبابي على جهاز واحد.
يتجاوز تصدير GIF في Rendervid مجرد تحويل إطار إلى GIF بسيط. يستخدم خط أنابيب توليد اللوحة في FFmpeg لإنتاج صور GIF متحركة محسّنة عالية الجودة مع تدرج قابل للتكوين وأعداد ألوان وقيود حجم الملف.
يستخدم ترميز GIF القياسي لوحة عالمية واحدة من 256 لونًا، مما يؤدي غالبًا إلى شرائط وإعادة إنتاج ألوان ضعيفة. يستخدم Rendervid نهجًا من مرحلتين:
| الإعداد المسبق | الدقة | الحد الأقصى للألوان | حالة الاستخدام المستهدفة |
|---|---|---|---|
social | 480x480 | 256 | Instagram وTwitter وSlack |
web | 640x480 | 256 | منشورات المدونة، التوثيق |
email | 320x240 | 128 | حملات البريد الإلكتروني، النشرات الإخبارية |
| الخوارزمية | الجودة | حجم الملف | الوصف |
|---|---|---|---|
floyd_steinberg | الأفضل | الأكبر | تدرج انتشار الخطأ، تدرجات سلسة |
bayer | جيد | متوسط | تدرج مرتب، نمط متسق |
none | الأدنى | الأصغر | لا تدرج، مناطق ألوان مسطحة |
const result = await renderer.render(template, {
format: "gif",
outputPath: "/output/animation.gif",
gif: {
preset: "social", // دقة 480x480
colors: 256, // لوحة ألوان 2-256
dithering: "floyd_steinberg",
targetSizeKB: 5000, // تحسين تلقائي للبقاء تحت 5 ميجابايت
fps: 15, // FPS أقل = ملف أصغر
},
});
console.log(`GIF size: ${(result.fileSize / 1024).toFixed(0)} KB`);
console.log(`Estimated size was: ${result.estimatedSizeKB} KB`);
عندما تعين targetSizeKB، يقدر Rendervid حجم ملف الإخراج قبل العرض ويضبط المعلمات تلقائيًا (عدد الألوان، الدقة، FPS) لتلبية الهدف. هذا مفيد بشكل خاص للمنصات ذات حدود حجم الملف (مثل حد Slack البالغ 50 ميجابايت، قيد البريد الإلكتروني النموذجي البالغ 10 ميجابايت).
// تحسين تلقائي للتناسب ضمن قيد البريد الإلكتروني البالغ 2 ميجابايت
const result = await renderer.render(template, {
format: "gif",
outputPath: "/output/email-banner.gif",
gif: {
preset: "email",
targetSizeKB: 2000,
},
});
تم تنظيم Rendervid كمستودع أحادي مع 13 حزمة. كل حزمة لها مسؤولية مركزة، وتتكون معًا لدعم كل سيناريو نشر.
@rendervid/
├── core المحرك، الأنواع، التحقق، نظام الرسوم المتحركة
│ ├── محلل ومدقق القالب (AJV + JSON Schema)
│ ├── محرك الرسوم المتحركة (أكثر من 40 إعدادًا مسبقًا، أكثر من 30 وظيفة تخفيف)
│ ├── نظام الطبقات (نص، صورة، فيديو، شكل، صوت، مجموعة، lottie، مخصص)
│ └── إدارة المشهد والانتقالات (17 نوعًا)
│
├── renderer-browser العرض من جانب العميل
│ ├── عرض إطار قائم على Canvas
│ ├── MediaRecorder لتصدير WebM
│ └── مشفر MP4 WebAssembly
│
├── renderer-node العرض من جانب الخادم
│ ├── متصفح بدون رأس Playwright/Puppeteer
│ ├── تكامل FFmpeg (fluent-ffmpeg)
│ ├── تسريع GPU
│ └── خط أنابيب تحسين GIF
│
├── cloud-rendering تنسيق متعدد السحابة
│ ├── مزود AWS Lambda
│ ├── مزود Azure Functions
│ ├── مزود Google Cloud Functions
│ ├── مزود Docker المحلي
│ ├── مقسم الأجزاء والدامج
│ └── محولات تخزين الكائنات (S3، Blob، GCS)
│
├── player مكون مشغل الفيديو/القالب
├── editor محرر القالب المرئي (حالة Zustand)
├── components مكونات React مسبقة الصنع
│ ├── AnimatedLineChart
│ ├── AuroraBackground
│ ├── WaveBackground
│ ├── SceneTransition
│ └── TypewriterEffect
│
├── templates تعريفات القوالب والأمثلة (أكثر من 100)
├── testing أدوات الاختبار
│ ├── مطابقات Vitest المخصصة
│ ├── مساعدي اختبار اللقطة
│ └── أدوات الانحدار البصري
│
├── editor-playground بيئة تطوير المحرر
├── player-playground بيئة تطوير المشغل
├── mcp خادم بروتوكول سياق النموذج
└── docs موقع توثيق VitePress
renderer-node ويوزع عمله عبر وظائف السحابة أو حاويات Docker.تم بناء Rendervid على مجموعة TypeScript حديثة تم اختيارها للموثوقية والأداء وتجربة المطور.
| الطبقة | التكنولوجيا | الغرض |
|---|---|---|
| اللغة | TypeScript | أمان الأنواع عبر جميع الحزم الـ 13 |
| البناء | tsup, Vite | بناء سريع، تقليم الأشجار، إخراج ESM/CJS |
| الاختبار | Vitest | اختبارات الوحدة، اختبارات اللقطة، مطابقات مخصصة |
| إطار واجهة المستخدم | React 18.3.1 | عرض المكونات، تكوين القالب |
| إدارة الحالة | Zustand | حالة المحرر (خفيفة الوزن، بدون نموذج) |
| التنسيق | Tailwind CSS | واجهة مستخدم المحرر والمشغل |
| التحقق | AJV with JSON Schema | التحقق من صحة القالب قبل العرض |
| عرض المتصفح | HTML Canvas API | رسم إطار تلو الآخر في المتصفح |
| متصفح بدون رأس | Playwright, Puppeteer | التقاط الإطار من جانب الخادم |
| ترميز الفيديو | FFmpeg (fluent-ffmpeg) | ترميز H.264، H.265، VP9، ProRes، GIF |
| رسومات ثلاثية الأبعاد | Three.js (اختياري), CSS 3D | مشاهد ثلاثية الأبعاد وتحويلات المنظور |
| التوثيق | VitePress | موقع توثيق الحزمة |
يتضمن Rendervid حزمة اختبار مخصصة (@rendervid/testing) توفر مطابقات Vitest المخصصة ومساعدي اختبار اللقطة وأدوات الانحدار البصري للتحقق من صحة القوالب.
import { describe, it, expect } from "vitest";
import "@rendervid/testing/matchers";
describe("Product Showcase Template", () => {
it("should be a valid template", () => {
expect(template).toBeValidTemplate();
});
it("should have the correct dimensions", () => {
expect(template).toHaveResolution(1920, 1080);
});
it("should contain at least one text layer", () => {
expect(template).toContainLayerOfType("text");
});
it("should have animations on the headline", () => {
expect(template.scenes[0].layers[0]).toHaveAnimation("entrance");
});
});
يعرض اختبار اللقطة قالبًا إلى صورة ويقارنه بمرجع مخزن. يتسبب أي تغيير بصري في فشل الاختبار، مما يسهل اكتشاف الانحدارات غير المقصودة.
import { describe, it } from "vitest";
import { renderSnapshot } from "@rendervid/testing";
describe("Template Visual Regression", () => {
it("should match the reference snapshot at frame 0", async () => {
const snapshot = await renderSnapshot(template, { frame: 0 });
expect(snapshot).toMatchImageSnapshot();
});
it("should match the reference snapshot at the midpoint", async () => {
const totalFrames = template.fps * template.scenes[0].duration;
const snapshot = await renderSnapshot(template, {
frame: Math.floor(totalFrames / 2),
});
expect(snapshot).toMatchImageSnapshot();
});
});
دمج اختبارات الانحدار البصري في خط أنابيب CI/CD الخاص بك لاكتشاف تغييرات العرض قبل وصولها إلى الإنتاج:
# .github/workflows/visual-regression.yml
name: Visual Regression Tests
on: [pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18
- run: npx playwright install chromium
- run: npm ci
- run: npm run test:visual
الحصول على أسرع أوقات العرض الممكنة يتطلب فهم أين يتم قضاء الوقت وأي الرافعات يمكنك سحبها. فيما يلي استراتيجيات التحسين الأكثر تأثيرًا.
| السيناريو | أفضل هدف |
|---|---|
| معاينة سريعة أثناء التحرير | المتصفح |
| فيديو واحد، جودة إنتاجية | Node.js |
| دفعة من 10-100 فيديو | Node.js أو Docker |
| دفعة من أكثر من 100 فيديو أو حرجة زمنيًا | السحابة (AWS/Azure/GCP) |
draft أثناء التطوير والاختبار. انتقل إلى high أو lossless فقط للصادرات النهائية.renderWaitTime بحكمةيوقف خيار renderWaitTime العرض للسماح بتحميل الوسائط الخارجية (الصور، مقاطع الفيديو، الخطوط). اضبط هذا على الحد الأدنى من القيمة التي تضمن تحميل جميع الأصول. قيمة 500-2000 ميلي ثانية نموذجية. تعيينها عالية جدًا يضيع الوقت على كل إطار.
await renderer.render(template, {
renderWaitTime: 1000, // ثانية واحدة عادة ما تكون كافية
});
لأي فيديو أطول من 10 ثوانٍ، سيكون العرض المتوازي (Docker أو السحابة) أسرع من العرض التسلسلي. تعتمد نقطة التعادل على أجهزتك وتكوين السحابة، ولكن كقاعدة عامة:
صور GIF كبيرة بطبيعتها. للحفاظ على أحجام الملفات قابلة للإدارة:
social، web، email).targetSizeKB للسماح لـ Rendervid بتحسين المعلمات تلقائيًا.none) إذا كان حجم الملف أهم من جودة التدرج.على الأجهزة ذات وحدات معالجة الرسومات المتوافقة، يمكن أن يقلل الترميز المسرع بالأجهزة من أوقات العرض بمقدار 2-5 مرات لخطوة الترميز. هذا هو الأكثر تأثيرًا للدقة العالية (4K+) والإخراج عالي معدل البت.
إذا كان قالبك يشير إلى صور أو مقاطع فيديو خارجية، قم بتنزيلها مسبقًا إلى التخزين المحلي قبل العرض. زمن انتقال الشبكة أثناء العرض هو السبب الأكثر شيوعًا للعروض البطيئة أو الفاشلة.
يدعم Rendervid أربعة خيارات للنشر: العرض في المتصفح لمعاينات جانب العميل وتطبيقات الويب، عرض Node.js لمعالجة الدفعات من جانب الخادم باستخدام FFmpeg، العرض السحابي على AWS Lambda/Azure Functions/GCP لتسريع متوازٍ بمقدار 10-50 مرة، وDocker للعرض المتوازي المحلي المجاني.
تبلغ تكلفة العرض السحابي حوالي 0.02 دولار لكل دقيقة على AWS Lambda أو Azure Functions أو Google Cloud Functions - أي حوالي دولار واحد لكل ساعة عرض. العرض المحلي القائم على Docker مجاني تمامًا ويوفر نفس مزايا العرض المتوازي.
يستخدم العرض السحابي منسقًا يقسم مقاطع الفيديو إلى أجزاء من الإطارات، ويوزعها على وظائف العمال (Lambda/Azure/GCP)، ويعرض كل عامل الإطارات المخصصة له، ويدمج الدامج جميع الإطارات في الفيديو النهائي، ويتم تخزين الإخراج في تخزين الكائنات (S3/Azure Blob/GCS).
لعرض المتصفح، يعمل أي متصفح حديث مع دعم Canvas. لعرض Node.js، تحتاج إلى Node.js 18+ وPlaywright أو Puppeteer وFFmpeg مثبت. للعرض السحابي، تحتاج إلى حساب AWS/Azure/GCP أو Docker مثبت محليًا.
نعم، يدعم عارض Node.js التسريع بالأجهزة للحصول على عرض أسرع. يمكن أن يؤدي تسريع GPU إلى تسريع العرض بشكل كبير، خاصة للقوالب المعقدة ذات الطبقات والتأثيرات والدقة العالية.
ينفذ Rendervid ضبابية الحركة باستخدام العينات الفائقة الزمنية، حيث يعرض إطارات فرعية متعددة لكل إطار إخراج ويمزجها معًا. تتراوح إعدادات الجودة المسبقة من منخفضة (5 عينات، 5 أضعاف وقت العرض) إلى فائقة (32 عينة، 32 ضعف وقت العرض)، مما ينتج عنه نعومة سينمائية.
نحن نساعد الشركات مثل شركتك في تطوير روبوتات الدردشة الذكية، وخوادم MCP، وأدوات الذكاء الاصطناعي أو أنواع أخرى من أتمتة الذكاء الاصطناعي لاستبدال البشر في المهام المتكررة في مؤسستك.

دليل شامل لنظام قوالب Rendervid. تعلم كيفية إنشاء قوالب فيديو JSON، استخدام المتغيرات الديناميكية بصيغة {{variable}}، تكوين أكثر من 40 إعداد مسبق للرسوم المتحرك...

استكشف جميع مكونات Rendervid: 8 أنواع طبقات مدمجة (نص، صورة، فيديو، شكل، صوت، مجموعة، lottie، مخصص)، مكونات React جاهزة، محرر القوالب المرئي، ومشغل الفيديو. قم ...

اكتشف Rendervid، البديل المجاني مفتوح المصدر لـ Remotion لإنشاء الفيديو البرمجي. تصميم يعتمد على الذكاء الاصطناعي مع تكامل MCP، قوالب JSON، عرض سحابي، وبدون رسو...