VP9 พร้อมใช้งานใน WebRTC แล้ว

เมื่อ 2 ปีก่อน Chrome เปิดใช้การรองรับตัวแปลงรหัส VP9 จาก Chrome 48 บนเดสก์ท็อปและ Android VP9 จะเป็นตัวแปลงรหัสวิดีโอที่ไม่บังคับสำหรับวิดีโอคอลที่ใช้ WebRTC

แม้ว่า VP9 จะใช้แบบแผนพื้นฐานเดียวกันกับตัวแปลงรหัสก่อนหน้านี้ แต่ทีม WebM ได้จัดเตรียมการปรับปรุงต่างๆ ลงใน VP9 เพื่อให้วิดีโอแต่ละไบต์มีคุณภาพสูงขึ้น ตัวอย่างเช่น โปรแกรมเปลี่ยนไฟล์ให้ความสำคัญกับคุณลักษณะของภาพที่คมชัดที่สุด และตอนนี้ตัวแปลงรหัสก็ใช้การแปลงแบบอสมมาตรเพื่อให้แม้แต่ฉากที่ท้าทายที่สุดให้คมชัดและไร้รอยต่อ

เมื่อใช้ VP9 การเชื่อมต่ออินเทอร์เน็ตที่แสดงความละเอียด 720p ได้ในปัจจุบันโดยไม่สูญเสียแพ็กเก็ตหรือความล่าช้าก็จะรองรับวิดีโอคอล 1080p ที่แบนด์วิดท์เดียวกันได้ นอกจากนี้ VP9 ยังช่วยลดปริมาณการใช้อินเทอร์เน็ตสำหรับผู้ใช้ที่มีการเชื่อมต่อไม่ดีหรือแพ็กเกจอินเทอร์เน็ตราคาแพง ซึ่งในกรณีที่ดีที่สุดนั้น ต้องใช้อัตราบิต VP8 เพียง 40% เท่านั้น

คุณสามารถดูการเปรียบเทียบระหว่างการเรียกใช้ VP8 กับ VP9 ได้ในภาพหน้าจอบันทึกด้านล่างของการบันทึกที่เราสร้างโดยใช้การตั้งค่าโปรแกรมเปลี่ยนไฟล์ WebRTC ซึ่งแสดงให้เห็นการประหยัดอัตราบิต 30%

ภาพหน้าจอของวิดีโอที่แสดงการเรียก VP8 และ VP9 WebRTC เทียบกัน

ตัวแปลงรหัสสำหรับการโทร WebRTC รวมถึงการตั้งค่าสื่ออื่นๆ เช่น อัตราบิต จะมีการเจรจาต่อรองกันระหว่างผู้โทรและผู้รับสายด้วยการแลกเปลี่ยนข้อความข้อมูลเมตาของ Session Description Protocol (SDP) ที่อธิบายความสามารถของสื่อของไคลเอ็นต์

กระบวนการจับมือนี้หรือการแลกเปลี่ยนความสามารถของสื่อ เรียกว่า "ข้อเสนอ/คำตอบ" เช่น ผู้โทรอาจส่งข้อเสนอ (ข้อความ SDP) ซึ่งระบุความต้องการสำหรับ VP9 โดยมี VP8 เป็นตัวเลือกสำรอง หากคำตอบยืนยันว่าผู้โทรเข้าสามารถรองรับ VP9 วิดีโอคอลจะดำเนินการต่อได้โดยใช้ VP9 หากผู้โทรเข้าตอบกลับด้วยคำตอบว่าใช้ได้เฉพาะ VP8 การโทรจะดำเนินการต่อด้วย VP8

หากต้องการดูการทำงานจริง ให้ดูโค้ดสำหรับแอปพลิเคชันวิดีโอแชท Canonical WebRTC appr.tc

ใน appcontroller.js มีการตั้งค่า VP9 เป็นตัวแปลงรหัสที่ต้องการ เว้นแต่จะระบุพารามิเตอร์ vsc หรือ vrc ใน URL ดังนี้

AppController.prototype.loadUrlParams_ = function() {
    // ...
    var DEFAULT_VIDEO_CODEC = 'VP9';
    // …
    this.loadingParams_.videoSendCodec = urlParams['vsc'];
    // ...
    this.loadingParams_.videoRecvCodec = urlParams['vrc'] || DEFAULT_VIDEO_CODEC;
}

ใน sdputils.js ค่าตัวแปลงรหัสที่กำหนดเอง (หากระบุ) จะใช้สำหรับข้อมูลเมตา SDP ดังนี้

function maybePreferVideoSendCodec(sdp, params) {
    return maybePreferCodec(sdp, 'video', 'send', params.videoSendCodec);
}

function maybePreferVideoReceiveCodec(sdp, params) {
    return maybePreferCodec(sdp, 'video', 'receive', params.videoRecvCodec);
}

ฟังก์ชัน maybePreferCodec() ที่ใช้ที่นี่จะตั้งค่าสำหรับตัวแปลงรหัสที่ขอในข้อความของข้อมูลเมตา SDP SDP มีรายละเอียดมากและไม่ได้ออกแบบมาให้มนุษย์อ่านได้ แต่คุณสามารถดู SDP ที่ appr.tc ใช้จากคอนโซลเครื่องมือสำหรับนักพัฒนาเว็บเมื่อมีการเรียกใช้ ส่วนสําคัญเกี่ยวกับตัวแปลงรหัสคือบรรทัด m

{
    "sdp": "v=0\r\no=- 9188830394109743399 2 IN IP4 127.0.0.1\r\ns … m=video ...",
    "type": "offer"
}

เมื่อใช้ appr.tc ร่วมกับการตั้งค่าเริ่มต้นใน Chrome เวอร์ชันล่าสุด คุณจะเห็นว่า VP9 เป็นตัวแปลงรหัสแรกที่แสดงในบรรทัด m ของ SDP ตามด้วย VP8 ซึ่ง Chrome ก็ใช้ได้เช่นกัน หากคุณตั้งค่า VP8 เป็นตัวแปลงรหัสที่ต้องการ (เช่น ผ่านพารามิเตอร์ของ URL ใน appr.tc) VP8 จะแสดงเป็นลำดับแรกแทน

ดูข้อมูลเพิ่มเติม

  • โปรเจ็กต์ WebM: ทรัพยากร VP9
  • webrtc.org: หน้าแรกของโปรเจ็กต์ WebRTC
  • g.co/webrtc: ลิงก์ไปยังแหล่งข้อมูลอื่นๆ ของ WebRTC
  • webrtc.github.io/samples: ตัวอย่าง WebRTC ที่เผยแพร่
  • test.webrtc.org: เครื่องมือทดสอบอุปกรณ์และเครือข่ายแบบโอเพนซอร์ส รวมถึงเฟรมเวิร์กการรายงานข้อบกพร่อง