Table of Contents
التعريف بلاعبي الفيديو العرفي
(ب) أن تعمل الجهات الفاعلة المعيارية HTML5 جيداً على إعادة البث الأساسي، ولكنها تحد من قدرتك على تصميم واجهة فريدة للمستعملين أو إضافة تفاعل متقدم، عن طريق الجمع بين نظام جافاسكريبت والعنصر ، وتتحكمين تماماً في كيفية إنتاج الفيديو، والسيطرة عليه، وتعزيزه، ويتيح تركيب الجلدات العرفية، والآثار البصرية الحقيقية، والتطورات، والتكامل غير المرئية.
ويسير هذا الدليل من خلال كل خطوة من خطوات بناء مشغل فيديو مصمم خصيصاً تماماً باستخدام جهاز تسجيل المكالمات الهاتفية HTML5، وسوف تتعلمون كيفية تسجيل أُطر الفيديو، وتسحبونها إلى قنابل، وتنفذون ضوابط العرف (اللعب/العمل، والتماس، والحجم)، وتضيفون مرشحات بصرية، وترفعون الأداء إلى أقصى حد من أجل التراجع السلس، ويتضمن كل قسم أمثلة على مدونة قواعد الإنتاج، ويشرح المفاهيم الأساسية التي يمكن أن تكيفها مع مشاريعكم.
فهم تجمعات كانفاس والفيديو
(أ) عنصر [(FLT:2]) يوفر سطحاً للسحب على أساس بيكسيل يمكن التلاعب به في الوقت الحقيقي عبر جافاسكريبت، وعندما يقترن ذلك بعنصر [(FLT:3]]، يمكنك معالجة كل إطار فيديو كمصدر للصورة وسحبه إلى الوعاء، مما يسمح لك بتعديل الإطار قبل العرض، أو إضافة مبالغ زائدة، أو حتى استبدال أجهزة التحكم في المفرقعات.
وتشمل الفوائد الرئيسية لاستخدام التفريغات للفيديو ما يلي:
- Full control over rendering:] Apply image filters, color corrections, or compositing effects before the user sees the frame.
- ] Custom UI components: Design blues, sliprs, and progress bars that match your brand without relying on native browser fashions.
- Interactive overlays:] Add annotations, subtitles, hotspots, or data visualisation that respond to user input or video timeline events.
- Seamless graphics integration:] Combine video with other canvas elements like charts, animations, or webGL content.
ومن الاعتبارات الهامة: تستهلك الكانتوفات موارد من وحدة مكافحة الفساد/الوحدة العامة من عنصر الفيديو المحلي لأنها تعيد سحب الأطر باستمرار، وسنعالج مسألة تحقيق الأداء الأمثل في وقت لاحق من هذه المادة.
إنشاء هيكل HTML
(ب) البدء بتشكيل مقياس مقياس مقياس مقياس مقياس مقياس الـ HTML الذي يشمل عنصر (مُثبط أو زائد) وعنصر ، ويستخدم عنصر الفيديو كمصدر للأطر؛ ويمكن أن يُخفى أو يوضع خلف الكوابيس باستخدام CSS.
<div id="player-container" style="position: relative; width: 640px; height: 360px;">
<video id="source-video" width="640" height="360" src="your-video.mp4" preload="metadata"></video>
<canvas id="player-canvas" width="640" height="360"
style="position: absolute; top: 0; left: 0; z-index: 1;"></canvas>
</div>
ويمكنك أيضاً إخفاء عنصر السكان الأصليين كلياً وفقط استخدامه كمقدم إطار، والقيام بذلك، إضافة إلى الفيديو، ومع ذلك، إبقاءه موجوداً في إدارة الشؤون الإدارية لأن الأغطية لا يمكن أن تصل إلى مجرى الفيديو دون عنصر قائم [(FLT:10])، وتعديل أبعاد الحاويات لتضام حجم لاعبيك المرغوب فيه.
رسم فيديو Frames على كانفاس
The core functionity is a rendering cycle that clears the canvas and draws the current video frame each time the browser requests animation frame. Use for smooth, efficient updates.
تنفيذ نظام جافاسكريب الأساسي:
const video = document.getElementById('source-video');
const canvas = document.getElementById('player-canvas');
const ctx = canvas.getContext('2d');
function renderFrame() {
if (!video.paused && !video.ended) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
}
requestAnimationFrame(renderFrame);
}
video.addEventListener('play', () => {
requestAnimationFrame(renderFrame);
});
video.addEventListener('pause', () => {
// Optionally stop the loop or keep the last frame
});
وهذه الحلقة ترسم باستمرار الفيديو على اللوحات طالما كان الفيديو يلعب، فطريقة تقبل عنصر الفيديو كمصدر لها، وإذا أخفت عنصر الفيديو، فإن المستعملين لن يروا إلا المفرقعات، مما يجعل اللاعب عادة تماما.
معالجة مختلف الفيديو Aspect Ratios
يجب أن تتطابق أبعادك مع حجم الفيديو أو يتم ضخها بشكل متناسب، استخدمي خصائص و بعد حمولات البيانات الوصفية لتكييف حجم الغلاف الجوي، وكي يتم تصميمها بشكل مستجيب، واستخدام الـ (CSS) لقيد الحاوية، وشغلها في الوقت نفسه
video.addEventListener('loadedmetadata', () => {
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
// Also update container dimensions if needed
});
بناء أجهزة التحكم في العتاد على الكانتفاس
بينما يمكنك أن تتفوق على عناصر الـ "هى سول" على قمة الكتانوفات (بوضع مطلق)، فإن النهج الأكثر تكاملاً هو وضع الضوابط مباشرة على الـ "كانفاس" وهذا يعطيك حرية التصميم على مستوى البكسل ويتجنب مسائل الطبقة الوسطى.
اللعب/البوس بوتون
حددي المنطقة المستقيمة على الكتف و استمعي إلى أحداث النقر وحددي إذا سقطت النقرة داخل تلك المنطقة
<button id="play-btn" style="position: absolute; top: 10px; left: 10px; z-index: 2;">Play/Pause</button>
جافا سكسبرت:
document.getElementById('play-btn').addEventListener('click', () => {
if (video.paused) {
video.play();
} else {
video.pause();
}
});
و من أجل زر مُقَرَّم بالكامل، سترسم شكلاً ثم تُدقق في إحداثيات .
باحثة (بروجريس سلايدر)
ويمكن وضع مانع للتقدم في هذا المجال كنقطة انطلاق مع وجود قسم ممتلئ يبين التقدم المحرز في مجال العزف، ويستكمله بشأن أحداث ويتيح النقر/الدراجة السعي إلى تحقيقها.
// Draw progress bar inside renderFrame or on timeupdate
const barX = 20, barY = canvas.height - 30, barWidth = canvas.width - 40, barHeight = 10;
ctx.fillStyle = '#444';
ctx.fillRect(barX, barY, barWidth, barHeight);
ctx.fillStyle = '#f00';
const progress = (video.currentTime / video.duration) || 0;
ctx.fillRect(barX, barY, barWidth * progress, barHeight);
أضف مستمعاً على الكتف ليسعى إلى:
canvas.addEventListener('click', (e) => {
const rect = canvas.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
if (y >= barY && y <= barY + barHeight && x >= barX && x <= barX + barWidth) {
const seekFraction = (x - barX) / barWidth;
video.currentTime = seekFraction * video.duration;
}
});
مراقبة حجم
وعلى غرار الحانه، يمكنك سحب مضخة الحجم، واستخدام و]] الممتلكات، والاستماع إلى أو الأحداث على مدخل من النطاق، أو معالجة الفأر يرسم على الأغطية.
وتوخياً لنهج بسيط، استخدم مدخلات من مجموعة الـ HTML على المكشوفات:
<input type="range" id="volume-slider" min="0" max="1" step="0.01" value="1"
style="position: absolute; bottom: 10px; right: 10px; z-index: 2;">
جافا سكسبرت:
document.getElementById('volume-slider').addEventListener('input', (e) => {
video.volume = e.target.value;
});
إضافة الآثار البصرية والملفات
ومن أكثر الأسباب إلحاحاً لاستخدام أجهزة التفريغ للفيديو القدرة على تطبيق مرشحات في الوقت الحقيقي، وقبل رسم الإطار، يمكن تعديل بيانات البكسل باستخدام و، أو استخدام مرشحات أجهزة الاستنشاق في قنابل غير مصففة، ولكن، لأغراض الأداء، النظر في استخدام (المدعمة في المنافذ الحديثة).
استخدام مرشّح التفريغ للآثار المشتركة
// Apply sepia filter before drawing
ctx.filter = 'sepia(0.8)';
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
ctx.filter = 'none'; // reset
Other available filters include , , , , , , , and . Combine them for complex looks.
دليل التلاعب بغازل (مقدم)
بالنسبة للآثار التي لا تغطيها مرشحات الـ "سي إس" يمكنك التلاعب بـ "بيكسل" كل شخص لاحظ أن هذا مكلف جداً وينبغي أن يستخدم بشكل متقطع
function pixelate(video, canvas, ctx, blockSize) {
const w = canvas.width, h = canvas.height;
ctx.drawImage(video, 0, 0, w, h);
const imageData = ctx.getImageData(0, 0, w, h);
const data = imageData.data;
for (let y = 0; y < h; y += blockSize) {
for (let x = 0; x < w; x += blockSize) {
const p = (x + y * w) * 4;
const r = data[p], g = data[p+1], b = data[p+2];
for (let dy = 0; dy < blockSize && y + dy < h; dy++) {
for (let dx = 0; dx < blockSize && x + dx < w; dx++) {
const pi = ((x + dx) + (y + dy) * w) * 4;
data[pi] = r; data[pi+1] = g; data[pi+2] = b;
}
}
}
}
ctx.putImageData(imageData, 0, 0);
}
اتصلي بهذا داخل حلقة الصنع بدلاً من البسيط
إضافة الترجمة التحريرية والشروح
يسهل على الشفرة أن تُطلِق على النص المُستَنَق على أعلى الفيديو، وللاطلاع على العنوان الفرعي، تُدرج ملفّ من طراز SRT أو VTT، وتُسحب النص في المصابيح الصحيحة، ولإشروح ثابتة، تسحبه على أساس النطاقات الزمنية.
ترجمة:
const subtitles = [
{ start: 0.5, end: 2.0, text: 'Hello, world!' },
{ start: 3.0, end: 5.5, text: 'This is a custom player.' }
];
function drawSubtitles(currentTime) {
const sub = subtitles.find(s => currentTime >= s.start && currentTime <= s.end);
if (sub) {
ctx.font = '24px Arial';
ctx.fillStyle = 'white';
ctx.textAlign = 'center';
ctx.shadowColor = 'black';
ctx.shadowBlur = 4;
ctx.fillText(sub.text, canvas.width/2, canvas.height - 50);
ctx.shadowBlur = 0;
}
}
اتصلي بـ داخل عملك بعد رسم إطار الفيديو.
الأداء على الوجه الأمثل
تشغيل غطاء قماش في 60 فبر في حين أن أداء التلاعب بـ "بيكسل" يمكن أن يضفي على المنظف، وتتبع هذه الممارسات للحفاظ على العزف بسلاسة:
- إخف معدل الإطار: ] إذا كنت لا تحتاج 60 فب، استخدام الإطار الزمني أو تخطيه.
- Minimize pixel operations:] Adjust and only when necessary. Avoid inside the cycle -use them only for filters that require per-pixel control, and consider using a separate offscreen canvas for heavy processing.
- Use ] بدلاً من الحلقات اليدوية: ] GPU-accelerated filters are much faster.
- Disable anti-aliasing for non-scaled draws:] Set when drawing the video at its exact size.
- Usese ] attribute: When working with , set ] to hint the browser.
- لا تُعيدي سحب جميع المفرقعات للتفاعلات الصغيرة، استخدمي وظائف تحديث منفصلة للضوابط التي تتغير في وقت متأخر
اختبر لاعبك على أجهزة متدنية، وإذا لاحظت القذف، قلل من قرار الغواصات (] و]) وضخه عبر محطة الفضاء الكندية (ولكن حافظ على نسبة الجانب).
الصور المتقدمة: الصور في الصورة، والتصميم، والمزيد من
بمجرد أن يكون لديك لاعب عادي أساسي يمكنك توسيعه مع أجهزة قياس حديثة على الشبكة
- Picture-in-Picture (PiP): ] You cannot directly use the canvas for PiP; instead, you must use the original video element. However, you can hide the canvas when PiP is active and show it again when PiP ends. Use .
- Adaptive Bitrate Streaming:] For HLS or DASH, use a library like hls.js or dash.js to feed the video element. The canvas remains the rendering surface.
- WebGL integration:] For equipment-accelerated effects, use with webGL context (]) and draw video as a texture, this is more complex but yields superior performance for filters.
- Recording canvas output:] Use with ] to record the video with applied effects.
دراسة حالة: بناء مسكن مينيماليس
لنمشي عبر مثال عالم حقيقي لاعب نظيف وصغير ذو خلفية شفافة وبار للتقدم رفيع و زر لعب مركزي مع آثار القفز
HTML:
<div id="player" style="position: relative; width: 800px; height: 450px; background: #000;">
<video id="vid" preload="auto" style="display: none;" src="sample.mp4"></video>
<canvas id="skin" width="800" height="450" style="display: block;"></canvas>
</div>
(جافاسكوريب) يرسم رمزاً للمسرحية و الإستخدام على الشاشة ويتعامل مع أحداث الفأر، ولا يظهر إلا على الخراط، وكل الضوابط تُرسم باستخدام البدائيات الـ2D، والنتيجة هي اللاعب ذو الوزن الخفيف، الذي يمكن أن يُدمج في أي مكان.
قرارات التصميم الرئيسية: استخدام طبقة واحدة من طبقة التفاح، وإعادة التدوير من أجل حانة التقدم، وتخزين صورة الأيكون كقنابل غير مصففة لتجنب إعادة سطو الأشكال المعقدة كل إطار.
خاتمة
إن إنشاء أجهزة فيديو مصممة خصيصا مع شركة جافاسكويت وشركة HTML5، يوفران لكم السيطرة المطلقة على العرض المرئي للمحتوى المرئي والتفاعلي للمحتوى بالفيديو، ومن الإطار البسيط الذي يُضفي على مرشحات ومواصفات فرعية معقدة في الوقت الحقيقي، فإن نظام تحديد المواقع يتيح مجموعة من الأدوات المرنة، وفي حين يجب إدارة الأداء بعناية، فإن عمليات التبادل كثيرا ما تستحق القدرة على تقديم نماذج مصممة بالفعل، وتقنيات للتقنية للتقنيات المصورة.
For further reading, explore the official MDN Canvas API documentation, the HTMLVideoElement reference, and the W3C Canvas 2D Context specification, For advanced ?