אנחנו מוציאים משימוש את MediaStream

אם אתם עובדים עם getUserMedia() או עם WebRTC, יכול להיות שתצטרכו לשנות את הקוד שלכם ל-Chrome מגרסה 45 ואילך.

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 (מוטמעת) (05ac:8510).

אפשר לראות את התכונות האלה בפעולה: פותחים את simpl.info/gum ב-Chrome (במכשיר עם מצלמה) ומציגים את מסוף כלי הפיתוח של Chrome. אובייקט MediaStream‏ stream שמוענק ל-callback‏ getUserMedia() בדמו הזה נמצא בהיקף גלובלי, כך שאפשר לבדוק אותו מהמסוף. אפשר להריץ את הפונקציה stream.getTracks()[0] כדי להציג את MediaStreamTrack של השידור הזה.

צילום מסך שבו מוצגים MediaStream ו-MediaStreamTrack במסוף של כלי הפיתוח ל-Chrome

Stop(), ‏ ended ו-active

כשקבוצת העבודה של W3C בנושא Media Capture and Streams בחנה את הבעיה של מה שקורה כשמוסיפים טראקים חדשים ל-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);
    });

תווית

מסתבר שאף אחד לא הצליח למצוא שימוש לנכס הזה.

השדה MediaStream.label נוסף לגרסה הראשונה של המפרט, אבל אף אחד לא ידע באמת למה הוא משמש.label בנוסף, לא היה ברור מה קורה ל-label כששידור ישיר נשלח דרך RTCPeerConnection.

קבוצת העבודה של W3C שאלו ברחבי העולם, ואף אחד לא רצה את זה, אז הם הסירו אותו.

שוב: השדה MediaStream.id מספק מזהה ייחודי ל-MediaStream, והשדה MediaStreamTrack.label מספק את שם המקור של הסטרימינג, למשל סוג המצלמה או המיקרופון.

מידע נוסף על MediaStream ו-MediaStreamTrack זמין ב-Mozilla Developer Network, וב-HTML5 Rocks יש מבוא מצוין ל-getUserMedia() במאמר צילום אודיו ווידאו.

כמו תמיד, אנחנו מודים לכם על המשוב לגבי השינויים ב-Chrome. אפשר לעקוב אחרי הבאגים של ההוצאות האלה משימוש (כאן וכאן) ולמצוא דיון ופרטי מידע נוספים בכוונת ההטמעה.