การเลิกใช้งาน MediaStream

หากคุณใช้งาน getUserMedia() หรือ WebRTC คุณอาจต้องปรับโค้ดสำหรับ Chrome 45 ขึ้นไป

MediaStream API แสดงถึงสตรีมสื่อแบบพร้อมกัน ตัวอย่างเช่น สตรีมที่มาจากอินพุตจากกล้องและ ไมโครโฟนได้ซิงค์แทร็กวิดีโอและแทร็กเสียง แต่ละแทร็กจะแสดงด้วย MediaStreamTrack (อย่าสับสนกับองค์ประกอบ<track>)

การเลิกใช้งาน MediaStream ใน Chrome 45 มีอยู่ 3 อย่างดังนี้

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

การบวก 2 อย่างในเวลาเดียวกัน

  • 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 ที่ส่งไปยังโค้ดเรียกกลับ getUserMedia() ในการสาธิตนี้อยู่ในขอบเขตรวม คุณจึงตรวจสอบได้จากคอนโซล โทร stream.getTracks()[0] เพื่อดู MediaStreamTrack สำหรับสตรีมนี้

ภาพหน้าจอแสดง MediaStream และ MediaStreamTrack ในคอนโซลเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome

Stop() สิ้นสุดและทำงานอยู่

เมื่อคณะทำงาน W3C เกี่ยวกับการบันทึกและสตรีมสื่อตรวจสอบปัญหาของสิ่งที่เกิดขึ้นเมื่อคุณเพิ่มแทร็กใหม่ลงใน 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 คุณติดตามข้อบกพร่องสำหรับการเลิกใช้งานเหล่านี้ได้ (ที่นี่และที่นี่) รวมถึงดูการสนทนาและรายละเอียดเพิ่มเติมได้ในหัวข้อความตั้งใจที่จะนำมาใช้