إيقاف MediaStream نهائيًا

إذا كنت تستخدم getUserMedia() أو WebRTC، قد تحتاج إلى تعديل الرمز. للإصدار 45 من Chrome والإصدارات الأحدث.

تمثل واجهة MediaStream API تدفقات الوسائط المتزامنة. على سبيل المثال، بث تم تصويره من الكاميرا يحتوي إدخال الميكروفون على مقاطع فيديو وصوت متزامنة. يُعد كل مسار يمثلها MediaStreamTrack: (يجب عدم الخلط بينه وبين العنصر <track>!)

هناك ثلاثة عمليات إيقاف لنظام التشغيل MediaStream في Chrome 45:

  • MediaStream.ended
  • MediaStream.label
  • MediaStream.stop()

بالتوازي، هناك إضافتان:

  • MediaStream.active
  • MediaStreamTrack.stop()

وتتطلب هذه الميزات إجراء التغييرات التالية:

  • استخدِم "MediaStream.active" للتأكّد من أنّ جهاز "MediaStream" يبث المحتوى، وليس "MediaStream.ended".
  • يمكنك استخدام MediaStreamTrack.stop() لإيقاف البث، وليس MediaStream.stop().
  • إذا كنت بحاجة إلى معرّف فريد لـ MediaStream، استخدِم MediaStream.id بدلاً من MediaStream.label. توفّر الدالة MediaStreamTrack.label اسمًا يمكن للمستخدمين قراءته بالجهاز المصدر للبث، على سبيل المثال: كاميرا FaceTime عالية الدقة (مدمجة) (05ac:8510)

يمكنك رؤية هذه العناصر عمليًا: افتح simpl.info/gum في Chrome (على جهاز مزوّد بكاميرا) واطّلِع على وحدة تحكّم "أدوات مطوري البرامج في Chrome". تشير رسالة الأشكال البيانية تم تمرير كائن MediaStream stream إلى معاودة الاتصال "getUserMedia()" في هذه الإصدار التجريبي هو نطاق عام، لذا يمكنك فحصه من وحدة التحكم. اتصل stream.getTracks()[0] لعرض MediaStreamTrack لهذا البث.

لقطة شاشة تعرض MediaStream وMediaStreamTrack في وحدة تحكّم Chrome DevTools

End() ، منتهية ونشطة

عندما راجعت مجموعة العمل W3C Media Capture and Streams مشكلة ما يحدث عند إضافة مقاطع صوتية جديدة إلى MediaStream، وسواء تم إنهاء MediaStream فارغة، أدرك الفريق أن هناك لا توجد طريقة معقولة لتنفيذ ended على MediaStream (مثل "لن تبدأ مرة أخرى أبدًا"). في أجزاء أخرى من HTML5 'ended' تعني أن "هذا قد انتهى وسوف لا تستأنف أبدًا". "نشط" لا يحمل أي تأثير: فالبث غير النشط قد يكون نشط مرة أخرى، على سبيل المثال، إذا تمت إضافة مقطع صوتي جديد إليه. وبدلاً من الحفاظ على سمة ووظيفة مربكة، قرر الفريق العامل وإزالتها.

في ما يلي مثال على كيفية استخدام "MediaStream.active". للتحقّق من حالة البث:

var gumStream;

navigator.getUserMedia({audio: false, video: true},
    function(stream) {
            gumStream = stream;
        // ...
    },
    function(error) {
        console.log('getUserMedia() error', error);
    });

// …

if (gumStream.active) {
    // do something with the stream
}

لم تؤدي إزالة "stop()" من "MediaStream" إلى إزالة أي وظائف حقيقية: لفصل أجهزة المصدر وما إلى ذلك MediaStreamTrack على أي حال. يمكنك استخدام stop() على MediaStreamTrack بدلاً من ذلك:

navigator.getUserMedia({audio: false, video: true},
    function(stream) {
            // can also use getAudioTracks() or getVideoTracks()
        var track = stream.getTracks()[0];  // if only one media track
        // ...
        track.stop();
    },
    function(error){
        console.log('getUserMedia() error', error);
    });

التصنيف

اتضح أنه لا أحد يستطيع اكتشاف استخدام لهذه الخاصية!

وتمت إضافة MediaStream.label إلى النسخة الأولى من المواصفات، إلا أن أحدًا لم يعلم أي شيء الغرض من label. لم يتّضح أيضًا ما حدث لـ "label" أثناء البث. تم إرسال عبر RTCPeerConnection.

سأل فريق العمل في W3C هذا المنتدى، ولم يرغب أحد في ذلك، فأزالوا المحادثة.

للتكرار، يقدّم MediaStream.id معرّفًا فريدًا توفّر السمتان MediaStream وMediaStreamTrack.label اسم المصدر البث، مثل نوع الكاميرا أو الميكروفون

يتوفر مزيد من المعلومات حول MediaStream وMediaStreamTrack من شبكة مطوّري برامج Mozilla، توفر HTML5 Rocks مقدمة ممتازة لـ getUserMedia() في التقاط صوت الفيديو.

نحن نقدّر دائمًا تعليقاتك بشأن التغييرات التي طرأت على Chrome. يمكنك متابعة الأخطاء الخاصة بعمليات الإيقاف هذه (هنا وهنا) والاطّلاع على مزيد من المناقشة والتفاصيل في مقالة هدف التنفيذ.