API แหล่งที่มาของสื่อ - ช่วยให้การเล่นส่วนต่างๆ ของสื่อเป็นไปอย่างราบรื่นตามลำดับการต่อท้าย

องค์ประกอบเสียงและวิดีโอ HTML ช่วยให้คุณสามารถโหลด ถอดรหัส และเล่นสื่อได้ง่ายๆ เพียงระบุ src URL:

    <video src='foo.webm'></video>

ใช้งานได้ดีในกรณีการใช้งานทั่วไป แต่สำหรับเทคนิคต่างๆ เช่น สตรีมมิงแบบปรับเปลี่ยนได้ Media Source Extensions API (MSE) ให้การควบคุมมากกว่า MSE ช่วยให้สตรีมสร้างสตรีมด้วย JavaScript จากส่วนต่างๆ ของเสียงหรือวิดีโอได้

คุณลองใช้ MSE ได้ที่ simpl.info/mse ดังนี้

ภาพหน้าจอของวิดีโอที่เล่นโดยใช้ MSE API

โค้ดด้านล่างมาจากตัวอย่าง

MediaSource หมายถึงแหล่งที่มาของสื่อสำหรับองค์ประกอบเสียงหรือวิดีโอ เมื่อสร้างอินสแตนซ์ MediaSource และเหตุการณ์ open ของออบเจ็กต์เริ่มทำงานแล้ว คุณจะเพิ่ม SourceBuffer ลงในออบเจ็กต์ดังกล่าวได้ สิ่งเหล่านี้ทำหน้าที่เป็นบัฟเฟอร์สำหรับกลุ่มสื่อ ดังนี้

var mediaSource = new MediaSource();
video.src = window.URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', function() {
    var sourceBuffer =
        mediaSource.addSourceBuffer('video/webm; codecs="vorbis,vp8"');
    // Get video segments and append them to sourceBuffer.
}

กลุ่มสื่อจะมีการ "สตรีม" ไปยังองค์ประกอบเสียงหรือวิดีโอโดยการเพิ่มแต่ละส่วนไปยัง SourceBuffer ด้วย appendBuffer() ในตัวอย่างนี้ ระบบจะดึงวิดีโอจากเซิร์ฟเวอร์แล้วจัดเก็บโดยใช้ API ของไฟล์

reader.onload = function (e) {
    sourceBuffer.appendBuffer(new Uint8Array(e.target.result));
    if (i === NUM_CHUNKS - 1) {
    mediaSource.endOfStream();
    } else {
    if (video.paused) {
        // start playing after first chunk is appended
        video.play();
    }
    readChunk(++i);
    }
};

กำลังตั้งค่าลำดับการเล่น

Chrome 50 เพิ่มการสนับสนุนเพิ่มเติมให้กับแอตทริบิวต์ SourceBuffer mode ซึ่งช่วยให้คุณระบุได้ว่ากลุ่มสื่อจะเล่นอย่างต่อเนื่องตามลำดับที่ต่อท้าย ไม่ว่ากลุ่มสื่อในตอนแรกจะมีการประทับเวลาที่ไม่ต่อเนื่องหรือไม่ก็ตาม

ใช้แอตทริบิวต์ mode เพื่อระบุลำดับการเล่นสำหรับกลุ่มสื่อ ซึ่งมี 1 ใน 2 ค่าต่อไปนี้

  • กลุ่ม: การประทับเวลาของแต่ละส่วน (ซึ่ง timestampOffset อาจได้รับการแก้ไข) เป็นตัวกําหนดลำดับการเล่น ไม่ว่าจะมีลําดับของส่วนใดต่อท้ายก็ตาม
  • ลำดับ: ลำดับของส่วนที่บัฟเฟอร์ในไทม์ไลน์ของสื่อจะกำหนดจากลำดับส่วนที่ต่อท้าย SourceBuffer

หากกลุ่มสื่อมีการประทับเวลาที่แยกวิเคราะห์จากข้อมูลสตรีมแบบไบต์เมื่อต่อท้าย SourceBuffer พร็อพเพอร์ตี้ mode ของ SourceBuffer จะตั้งค่าเป็นกลุ่ม มิเช่นนั้น ระบบจะตั้งค่า mode เป็นลำดับ โปรดทราบว่าการประทับเวลาไม่จำเป็นต้องระบุ กล่าวคือต้องปรากฏสำหรับสตรีมส่วนใหญ่ และไม่สามารถมีสำหรับสตรีมประเภทอื่นๆ ด้วย การประทับเวลาสำหรับเนื้อหาส่วนใหญ่มักเป็นของสตรีมประเภทที่มีการประทับเวลา

คุณจะตั้งค่าแอตทริบิวต์ mode หรือไม่ก็ได้ สำหรับสตรีมที่ไม่มีการประทับเวลา (audio/mpeg และ audio/aac) mode จะเปลี่ยนจากกลุ่มเป็นลำดับได้เท่านั้น ระบบจะแสดงข้อผิดพลาดหากคุณพยายามเปลี่ยน mode จากลำดับเป็นกลุ่ม คุณอาจสลับระหว่างกลุ่มกับลำดับสำหรับสตรีมที่มีการประทับเวลาได้ แต่ในทางปฏิบัติแล้วอาจทำให้เกิดลักษณะการทำงานที่ไม่พึงประสงค์ เข้าใจยาก หรือคาดการณ์ได้ยาก

สําหรับสตรีมทุกประเภท คุณเปลี่ยนค่าจากกลุ่มเป็นลําดับได้ ซึ่งหมายความว่าเซกเมนต์จะเล่นตามลำดับที่เพิ่มเข้าไป และสร้างการประทับเวลาใหม่ตามนั้น

sourceBuffer.mode = 'sequence';

การกำหนดค่า mode เป็นลำดับได้ช่วยให้การเล่นสื่อมีความต่อเนื่องไม่ว่าการประทับเวลาส่วนของสื่อจะไม่ต่อเนื่องหรือไม่ เช่น ในกรณีที่เกิดปัญหากับการมิกซ์วิดีโอ หรือต่อท้ายส่วนที่ไม่ต่อเนื่อง (ไม่ว่าด้วยเหตุผลใดก็ตาม) แอปสามารถใช้ timestampOffset แบบ Polyfill ได้เพื่อให้เล่นได้อย่างต่อเนื่องหากมีข้อมูลเมตาของสตรีมที่ถูกต้อง แต่โหมดลำดับจะทำให้กระบวนการง่ายขึ้นและมีโอกาสเกิดข้อผิดพลาดน้อยลง

แอปและการสาธิต MSE

รายการเหล่านี้แสดงการทำงานของ MSE แม้จะไม่มีการจัดการ SourceBuffer.mode

การสนับสนุนเบราว์เซอร์

  • Chrome 50 ขึ้นไปโดยค่าเริ่มต้น
  • สำหรับ Firefox โปรดดูรายละเอียดที่ MDN

ข้อมูลจำเพาะ

ข้อมูล API