إيقاف 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 HD Camera (مدمَجة) (05ac:8510).

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

لقطة شاشة تعرض MediaStream وMediaStreamTrack في وحدة التحكّم في &quot;أدوات مطوري البرامج في Chrome&quot;

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

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

في ما يلي مثال على كيفية استخدام 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);
    });

label

اتضح أنه لا يمكن لأحد اكتشاف استخدام لهذه العقار!

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

طرحت مجموعة العمل W3C هذا السؤال، ولم يرغب أحد في الحصول عليه، لذلك أزاله.

نؤكّد على ذلك: توفّر السمة MediaStream.id معرّفًا فريدًا للسمة MediaStream، فيما تشمل السمة MediaStreamTrack.label اسم مصدر البث، مثل نوع الكاميرا أو الميكروفون.

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

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