โฮมเพจ » การเข้ารหัส » วิธีการสตรีมเสียงที่ถูกตัดทอนโดยใช้ MediaSource API

    วิธีการสตรีมเสียงที่ถูกตัดทอนโดยใช้ MediaSource API

    กับ MediaSource API, คุณสามารถ สร้างและกำหนดค่าสตรีมสื่อ ในเบราว์เซอร์ จะช่วยให้คุณ ดำเนินการที่หลากหลายเกี่ยวกับข้อมูลสื่อ ถือโดยแท็ก HTML ที่เกี่ยวข้องกับสื่อเช่น หรือ . ตัวอย่างเช่นคุณสามารถ ผสมกระแสที่แตกต่างกัน, สร้างสื่อที่ทับซ้อนกัน, สื่อโหลดขี้เกียจ, และ แก้ไขการวัดสื่อ เช่นเปลี่ยนระดับเสียงหรือความถี่.

    ในโพสต์นี้เราจะดูวิธีการเฉพาะ สตรีมตัวอย่างเสียง (ไฟล์ MP3 ที่ถูกตัดทอน) พร้อมกับ MediaSource API ในเบราว์เซอร์เพื่อ แสดงดนตรีล่วงหน้า ถึงผู้ชมของคุณ เราจะอธิบายวิธีการ ตรวจสอบการสนับสนุนสำหรับ API, ทำอย่างไร เชื่อมต่อองค์ประกอบสื่อ HTML กับ API อย่างไร ดึงสื่อ ผ่าน Ajax และวิธีการในที่สุด สตรีมมัน.

    หากคุณต้องการที่จะเห็นล่วงหน้าสิ่งที่เรากำลังทำอยู่ให้ดูที่ ซอร์สโค้ดบน Github, หรือตรวจสอบ หน้าตัวอย่าง.

    ขั้นตอนที่ 1 สร้าง HTML

    ในการสร้าง HTML ให้เพิ่ม แท็กด้วย การควบคุม คุณลักษณะ ในหน้าของคุณ สำหรับความเข้ากันได้ย้อนหลังยัง เพิ่มข้อผิดพลาดเริ่มต้น สำหรับผู้ใช้ที่เบราว์เซอร์ไม่สนับสนุนคุณสมบัติ เราจะใช้ JavaScript เพื่อเปิด / ปิดข้อความนี้.

      

    ขั้นตอนที่ 2 ตรวจหาการสนับสนุนเบราว์เซอร์

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

     ลอง ถ้า (! 'MediaSource' ในหน้าต่าง) โยน ReferenceError ใหม่ ('ไม่มีคุณสมบัติ MediaSource ในวัตถุหน้าต่าง') catch (e) console.log (e);  

    ขั้นตอนที่ 3 ตรวจหาการสนับสนุน MIME

    หลังจากการตรวจสอบการสนับสนุนยังตรวจสอบ สนับสนุนประเภท MIME. หากเบราว์เซอร์ไม่รองรับประเภท MIME ของสื่อที่คุณต้องการ, แจ้งเตือนผู้ใช้ และ โยนข้อผิดพลาด.

    var mime = 'audio / mpeg'; if (! MediaSource.isTypeSupported (mime)) alert ('ไม่สามารถเล่นสื่อได้ Media of MIME type' + mime + 'ไม่รองรับ'); พ่น (ไม่รองรับ 'สื่อประเภท' + mime + '');  

    โปรดทราบว่าต้องมีข้อมูลโค้ดด้านบน วางไว้ภายใน ลอง กลุ่ม, ก่อนที่ จับ บล็อก (สำหรับการอ้างอิงให้ทำตามหมายเลขบรรทัดหรือตรวจสอบไฟล์ JS สุดท้ายบน Github).

    ขั้นตอน 4. เชื่อมโยง แท็กไปยัง MediaSource API

    สร้างใหม่ MediaSource วัตถุและ กำหนดเป็นแหล่งที่มาของ แท็ก โดยใช้ URL.createObjectURL () วิธี.

     var audio = document.querySelector ('audio'), mediaSource = new MediaSource (); audio.src = URL.createObjectURL (mediaSource); 

    ขั้นตอนที่ 5. เพิ่ม SourceBuffer วัตถุประสงค์ MediaSource

    เมื่อองค์ประกอบสื่อ HTML เข้าถึงแหล่งสื่อ และพร้อมที่จะ สร้าง SourceBuffer วัตถุ, MediaSource API ไฟไหม้ sourceopen เหตุการณ์ .

    SourceBuffer วัตถุ ถือสื่ออันมากมาย ที่ถอดรหัสในที่สุดประมวลผลและเล่น โสด MediaSource วัตถุสามารถ มีหลายอย่าง SourceBuffer วัตถุ.

    ข้างใน ตัวจัดการเหตุการณ์ของ sourceopen เหตุการณ์, เพิ่ม SourceBuffer วัตถุประสงค์ MediaSource กับ addSourceBuffer () วิธี.

     mediaSource.addEventListener ('sourceopen', function () var sourceBuffer = this.addSourceBuffer (mime);); 

    ขั้นตอน 6. ดึงสื่อ

    ตอนนี้คุณมี SourceBuffer วัตถุมันถึงเวลาที่จะ ดึงไฟล์ MP3. ในตัวอย่างของเราเราจะทำเช่นนั้นโดย ใช้คำขอ AJAX.

    ใช้ arraybuffer เช่น responseType, ที่ หมายถึงข้อมูลไบนารี. เมื่อตอบสนองสำเร็จแล้ว, ผนวกเข้ากับ SourceBuffer กับ appendBuffer () วิธี.

     mediaSource.addEventListener ('sourceopen', function () var sourceBuffer = this.addSourceBuffer (mime); var xhr = XMLHttpRequest ใหม่ xhr.open ('GET', 'sample.mp3'); ; xhr.onload = function () ลอง switch (this.status) case 200: sourceBuffer.appendBuffer (this.response); break; case 404: การโยน 'File Not Found'; default: throw 'ล้มเหลวในการดึงข้อมูล ไฟล์ '; catch (e) console.error (e);; xhr.send ();); 

    ขั้นตอนที่ 7 ระบุส่วนท้ายของสตรีม

    เมื่อ API เสร็จสิ้นการผนวกข้อมูลกับ SourceBuffer เหตุการณ์ที่เรียกว่า updatend ถูกไล่ออก. ภายในตัวจัดการเหตุการณ์ให้โทร ในตอนท้ายของกระแส() วิธีการของ MediaSource ไปยัง ระบุว่ากระแสได้สิ้นสุดลงแล้ว.

     mediaSource.addEventListener ('sourceopen', function () var sourceBuffer = this.addSourceBuffer (mime); var xhr = XMLHttpRequest ใหม่ xhr.open ('GET', 'sample.mp3'); ; xhr.onload = function () ลอง switch (this.status) case 200: sourceBuffer.appendBuffer (this.response); sourceBuffer.addEventListener ('updateend', ฟังก์ชัน (_) mediaSource.endOfStream (); ); break; case 404: throw 'File Not Found'; default: throw 'ไม่สามารถเรียกไฟล์'; catch (e) console.error (e);; xhr.send ();) ; 

    ขั้นตอนที่ 8 ตัดไฟล์สื่อ

    SourceBuffer วัตถุมี สองคุณสมบัติ เรียกว่า appendWindowStart และ appendWindowEnd เป็นตัวแทนของ เวลาเริ่มต้นและสิ้นสุดของข้อมูลสื่อ คุณต้องการกรอง รหัสที่ไฮไลต์ด้านล่าง กรองสี่วินาทีแรก ของ MP3.

     mediaSource.addEventListener ('sourceopen', function () var sourceBuffer = this.addSourceBuffer (mime); sourceBuffer.appendWindowEnd = 4.0; ... ); 

    การสาธิต

    และนั่นคือทั้งหมดของเรา ตัวอย่างเสียงถูกสตรีม ได้จากหน้าเว็บ สำหรับทาง รหัสแหล่งที่มา, ดูที่ของเรา Github repo และสำหรับผลลัพธ์สุดท้ายให้ตรวจสอบ หน้าตัวอย่าง.

    รองรับเบราว์เซอร์

    ในการเขียนโพสต์นี้ MediaSource API ได้รับการสนับสนุนอย่างเป็นทางการในเบราว์เซอร์หลักทั้งหมด แต่จากการทดสอบแสดงให้เห็นว่า การติดตั้งใช้งานได้ใน Firefox, และเบราว์เซอร์ Webkit ยังคงมีปัญหากับ appendWindowStart คุณสมบัติ.

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