يتم عرض محتوى MediaStreamTrack
كبث يمكن التلاعب به أو استخدامه لإنشاء محتوى جديد.
الخلفية
في سياق
Media Capture and Streams API، represent
واجهة MediaStreamTrack
مسار وسائط واحدًا ضمن بث، وعادةً ما يكون مسارًا صوتيًا أو
فيديو، ولكن قد تتوفّر أنواع أخرى من المسارات.
تتألف عناصر MediaStream
من
صفر أو أكثر من عناصر MediaStreamTrack
التي تمثّل مقاطع صوتية أو مقاطع فيديو مختلفة. قد تحتوي كل
MediaStreamTrack
على قناة واحدة أو أكثر. تمثّل القناة أصغر وحدة في
بث الوسائط، مثل إشارة صوتية مرتبطة بمكبّر صوت معيّن، مثل اليسار أو اليمين في
مسار صوتي استيريو.
ما هي أحداث البث القابلة للإدراج في MediaStreamTrack
؟
إنّ الفكرة الأساسية وراء أحداث البث القابلة للإدراج في MediaStreamTrack
هي عرض محتوى
MediaStreamTrack
كمجموعة من أحداث البث (على النحو المحدّد في WHATWG
Streams API). ويمكن تعديل هذه الخلاصات لإدخال مكونات جديدة.
من خلال منح المطوّرين إذن الوصول إلى بث الفيديو (أو الصوت) مباشرةً، يمكنهم تطبيق تعديلات على البث مباشرةً. في المقابل، فإنّ تنفيذ مهمة التلاعب بالفيديو نفسها باستخدام
الطرق التقليدية يتطلّب من المطوّرين استخدام عناصر وسيطة، مثل عناصر <canvas>
. (للاطّلاع على
تفاصيل عن هذا النوع من العمليات، يمكنك مثلاً الاطّلاع على مقالة
الفيديو + اللوحة = سحر).
دعم المتصفح
تتوفّر أحداث البث القابلة للإدراج في MediaStreamTrack
من الإصدار 94 من Chrome.
حالات الاستخدام
تشمل حالات استخدام أحداث البث القابلة للإدراج في MediaStreamTrack
ما يلي على سبيل المثال لا الحصر:
- أدوات مؤتمرات الفيديو، مثل "قبعات مضحكة" أو الخلفيات الافتراضية
- معالجة الصوت، مثل برامج الترميز الصوتي
كيفية استخدام أحداث البث القابلة للإدراج في MediaStreamTrack
رصد الميزات
يمكنك رصد أحداث البث القابلة للإدراج من خلال ميزة MediaStreamTrack
على النحو التالي:
if ('MediaStreamTrackProcessor' in window && 'MediaStreamTrackGenerator' in window) {
// Insertable streams for `MediaStreamTrack` is supported.
}
المفاهيم الأساسية
تستند أحداث البث القابلة للإدراج في MediaStreamTrack
إلى المفاهيم التي اقترحتها WebCodecs سابقًا، وتقسم MediaStreamTrack
من الناحية المفاهيمية إلى مكوّنَين:
MediaStreamTrackProcessor
، الذي يستخدِم مصدر عنصرMediaStreamTrack
وينشئ بثًا لإطارات الوسائط، وتحديدًاVideoFrame
أوAudioFrame
) يمكنك اعتبار هذا العنصر كمصدر مسار قادر على عرض اللقطات غير المشفَّرة من المسار على هيئةReadableStream
.MediaStreamTrackGenerator
، الذي يستخدِم بثًا لإطارات الوسائط ويعرِض واجهةMediaStreamTrack
ويمكن تقديمه لأي مصدر بيانات، تمامًا مثل مقطع صوتي منgetUserMedia()
. تأخذ هذه الدالة إطارات الوسائط كمدخلات.
فريق MediaStreamTrackProcessor
يعرِض عنصر MediaStreamTrackProcessor
سمة واحدة، وهي readable
. يتيح هذا الإذن قراءة
الإطارات من MediaStreamTrack
. إذا كان المقطع الصوتي هو مقطع صوتي في الفيديو، ستكون
المقاطع المقروءة من readable
عناصر VideoFrame
. إذا كان المقطع الصوتي عبارة عن مقطع صوتي، ستكون الأجزاء
التي يتم قراءتها من readable
عناصر AudioFrame
.
فريق MediaStreamTrackGenerator
يعرِض كائن MediaStreamTrackGenerator
أيضًا سمة واحدة، وهي writable
، وهي
WritableStream
تسمح بكتابة إطارات الوسائط في
MediaStreamTrackGenerator
، وهو نفسه MediaStreamTrack
. إذا كانت قيمة السمة kind
هي
"audio"
، يقبل البث عناصر AudioFrame
ويفشل مع أي نوع آخر. إذا كان النوع هو
"video"
، يقبل البث عناصر VideoFrame
ويتعطّل عند استخدام أي نوع آخر. عند كتابة إطار
في writable
، يتمّ استدعاء طريقة close()
للإطار تلقائيًا، لكي لا يعود بالإمكان الوصول إلى موارد
الوسائط من JavaScript.
MediaStreamTrackGenerator
هو مقطع صوتي يمكن تنفيذ مصدر
مخصّص له من خلال كتابة لقطات وسائط في حقل writable
.
الخلاصة
تتمثل الفكرة الأساسية في إنشاء سلسلة معالجة على النحو التالي:
مسار المنصة ← المعالج ← التحويل ← المُنشئ ← مسارات الإخراج في المنصة
يوضّح المثال أدناه هذه السلسلة لتطبيق ماسح ضوئي للباركود يُبرز الباركود الذي تم رصده في بث فيديو مباشر.
const stream = await getUserMedia({ video: true });
const videoTrack = stream.getVideoTracks()[0];
const trackProcessor = new MediaStreamTrackProcessor({ track: videoTrack });
const trackGenerator = new MediaStreamTrackGenerator({ kind: 'video' });
const transformer = new TransformStream({
async transform(videoFrame, controller) {
const barcodes = await detectBarcodes(videoFrame);
const newFrame = highlightBarcodes(videoFrame, barcodes);
videoFrame.close();
controller.enqueue(newFrame);
},
});
trackProcessor.readable.pipeThrough(transformer).pipeTo(trackGenerator.writable);
const videoBefore = document.getElementById('video-before');
const videoAfter = document.getElementById('video-after');
videoBefore.srcObject = stream;
const streamAfter = new MediaStream([trackGenerator]);
videoAfter.srcObject = streamAfter;
عرض توضيحي
يمكنك الاطّلاع على العرض التقديمي لميزة الماسح الضوئي لرمز الاستجابة السريعة من القسم أعلاه، واستخدامه على الكمبيوتر المكتبي أو متصفّح الأجهزة الجوّالة. احمل رمز استجابة سريعة أمام الكاميرا وسيرصده التطبيق ويُبرزه. يمكنك الاطّلاع على رمز المصدر للتطبيق على Glitch.
اعتبارات الأمان والخصوصية
يعتمد أمان واجهة برمجة التطبيقات هذه على الآليات الحالية في منصة الويب. عند عرض البيانات باستخدام واجهتَي VideoFrame
وAudioFrame
، تسري قواعد هاتين الواجهات للتعامل مع
البيانات التي تم العبث بمصدرها. على سبيل المثال، لا يمكن الوصول إلى البيانات من موارد من مصادر مختلفة بسبب
القيود الحالية المفروضة على الوصول إلى هذه الموارد (على سبيل المثال، لا يمكن الوصول إلى وحدات البكسل في
صورة أو عنصر فيديو من مصدر مختلف). بالإضافة إلى ذلك، يخضع الوصول إلى بيانات الوسائط من الكاميرات أو الميكروفونات
أو الشاشات لتفويض المستخدم. إنّ بيانات الوسائط التي تعرضها واجهة برمجة التطبيقات هذه متاحة
من خلال واجهات برمجة تطبيقات أخرى.
ملاحظات
يريد فريق Chromium معرفة تجاربك مع أحداث البث القابلة للإدراج في
MediaStreamTrack
.
أخبِرنا عن تصميم واجهة برمجة التطبيقات.
هل هناك مشكلة في واجهة برمجة التطبيقات لا تعمل على النحو المتوقّع؟ هل هناك طُرق أو سمات مفقودة تحتاجها لتنفيذ فكرتك؟ هل لديك سؤال أو تعليق حول نموذج الأمان؟ يمكنك الإبلاغ عن مشكلة في المواصفات في مستودع GitHub المقابل، أو إضافة ملاحظاتك إلى مشكلة حالية.
الإبلاغ عن مشكلة في التنفيذ
هل عثرت على خطأ في عملية تنفيذ Chromium؟ أم أنّ عملية التنفيذ مختلفة عن المواصفات؟
يمكنك الإبلاغ عن خلل على الرابط new.crbug.com. احرص على تضمين أكبر قدر ممكن من التفاصيل،
وتعليمات بسيطة لإعادة إنتاج الخلل، وأدخِل Blink>MediaStream
في مربّع المكوّنات.
يُعدّ تطبيق Glitch مثاليًا لمشاركة عمليات إعادة الإنتاج بسرعة وسهولة.
إظهار الدعم لواجهة برمجة التطبيقات
هل تخطّط لاستخدام أحداث البث القابلة للإدراج في MediaStreamTrack
؟ يساعد دعمك العلني فريق Chromium في تحديد أولويات الميزات ويُظهر لموفّري المتصفّحات الآخرين مدى أهمية إتاحة هذه الميزات.
أرسِل تغريدة إلى @ChromiumDev باستخدام الهاشتاغ
#InsertableStreams
وأطلِعنا على مكان استخدامك له وطريقة استخدامه.
روابط مفيدة
الشكر والتقدير
كتب
هارلاد ألفيستراند وغيدو أوردانيتا بثّات المحتوى القابلة للإدراج في مواصفات MediaStreamTrack
.
تمت مراجعة هذه المقالة من قِبل هارلاند ألفيستراند وجو ميديل
بن واغنر وهويب كلاينهوت و
فرانسوا بافوي. الصورة الرئيسية من إنشاء
Chris Montgomery على
Unsplash.