ทดสอบสตรีมเว็บแคม — อีกฝั่งเห็นอะไร

ภาพในพรีวิวเว็บแคมเป็นวิวจับภาพในเครื่อง — ฟีดกล้องผ่าน getUserMedia() — ไม่ใช่เอาต์พุตเซนเซอร์ดิบ ภาพที่ผู้รับเห็นเป็นสตรีมที่เบราว์เซอร์เข้ารหัสผ่าน WebRTC ที่ถูกเจรจา บีบอัด และอาจลดระดับอย่างเงียบๆ คู่มือนี้อธิบายการเจรจา codec ของ WebRTC ทำงานอย่างไร วิธีใช้ getStats() บน RTCPeerConnection เพื่อวัดพารามิเตอร์สตรีมจริง และวิธีแก้สาเหตุความสูญเสียคุณภาพที่พบบ่อย ข้อสังเกต: เครื่องมือเว็บแคมของไซต์นี้ตรวจแทร็กจับในเครื่องและเฟรมเรตเบราว์เซอร์เท่านั้น ไม่วัดสตรีมที่เข้ารหัส WebRTC ขาออก

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

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

เลเยอร์การเข้ารหัสนั้นมองไม่เห็นจากส่วนต่อประสานผู้ใช้และเงียบระหว่างการทำงานปกติ ไม่มีสิ่งใดในหน้าต่างคอลบอกคุณว่ามันมีอยู่ ไม่มีสิ่งใดรายงานการตัดสินใจของมัน และไม่มีสิ่งใดในพรีวิวสะท้อนสิ่งเหล่านั้น ฉากที่คุ้นเคย: ผู้ใช้คนหนึ่งใช้เวลาหลายชั่วโมงติดตั้งไดรเวอร์กล้องใหม่เพราะคอลแสดงภาพมัว — แต่กลับค้นพบผ่าน chrome://webrtc-internals ว่าเบราว์เซอร์กำลังเจรจาลงไปที่ 480p15 ตามการประเมินแบนด์วิดท์ ไม่ใช่เพราะกล้องหรือไดรเวอร์ หน้านี้อธิบายว่าเกิดอะไรขึ้นระหว่างเซนเซอร์กล้องและหน้าจอของคู่สนทนา ทำไมเบราว์เซอร์ลดคุณภาพของคุณอย่างเงียบๆ และที่สำคัญที่สุด — วิธีวัดสตรีมจริงที่ออกจากเครื่องของคุณแทนที่จะเชื่อพรีวิว

แล็ปท็อปพร้อมเว็บแคมแสดงการแสดงผลคุณภาพสตรีมวิดีโอพร้อมตัวบ่งชี้ความละเอียดและบิตเรตซ้อนทับ

สิ่งที่พรีวิวไม่แสดงให้คุณเห็น

การโทรวิดีโอพึ่งพานบนไปป์ไลน์ที่ทำงานนอกเหนือการรับรู้ของคุณโดยสมบูรณ์ ทุกเฟรมที่คุณส่งผ่านขั้นตอนต่อไปนี้:

  1. เซนเซอร์กล้อง จับเฟรมหนึ่ง เบราว์เซอร์จากนั้นส่งมันผ่าน getUserMedia() ที่ความละเอียดและเฟรมเรตที่ร้องขอ ซึ่งอาจรวมถึงการปรับสเกล การแปลงสี และการประมวลผลข้อจำกัด
  2. เบราว์เซอร์รับเฟรมนั้นผ่าน API getUserMedia() และส่งต่อให้เอนจิน WebRTC พรีวิวในเครื่องของคุณถูกป้อนจากขั้นตอนนี้ — นี่คือเหตุผลที่มันดูสมบูรณ์แบบเสมอ ไม่ว่าจะเกิดอะไรขึ้นต่อไป
  3. ตัวเข้ารหัส WebRTC บีบอัดเฟรมเป็นบิตสตรีมโดยใช้ codec ที่เจรจาแล้ว ที่ความละเอียด เฟรมเรต และบิตเรตที่เจรจาแล้ว
  4. เฟรมที่เข้ารหัสถูกแบ่งเป็น แพ็กเก็ต RTP และส่งผ่านเครือข่าย มักผ่านเซิร์ฟเวอร์สื่อกลางที่ถ่ายทอดไปยังทุกคนอื่น
  5. แต่ละฝั่งรับ ถอดรหัส แพ็กเก็ตกลับเป็นภาพและเรนเดอร์บนหน้าจอของพวกเขา

พรีวิวของคุณแตะไปป์ไลน์ที่ขั้นตอนที่สอง มันแสดงเฟรมที่กล้องผลิตตามที่ส่งผ่าน getUserMedia() ก่อนการเข้ารหัส WebRTC เบราว์เซอร์อาจปรับสเกล แปลงสี หรือประมวลผลข้อจำกัดที่ขั้นตอนนี้ แต่ไม่มีการบีบอัด WebRTC สตรีมที่คู่สนทนาเห็นคือสิ่งที่ออกมาจากขั้นตอนที่สาม ระหว่างจุดสองจุดนั้น ตัวเข้ารหัสตัดสินใจว่าโลกจะได้รับอะไร และมันตัดสินใจนั้นจากเงื่อนไขที่คุณไม่เห็น

ตัวเข้ารหัสเจรจาพารามิเตอร์สามตัวอย่างเงียบๆ และแต่ละตัวสามารถเปลี่ยนกลางคอลได้โดยไม่มีการแจ้งเตือน:

  • ความละเอียด — ความกว้างและความสูงของเฟรมที่เข้ารหัส ซึ่งสามารถลดจาก 1920×1080 เป็น 1280×720 หรือ 640×480 ได้เอง
  • เฟรมเรต — กี่เฟรมต่อวินาทีรอดจากการเข้ารหัส มักลดลงเป็นอันดับแรก (จาก 30 เป็น 15 หรือต่ำกว่า) เพราะการลดเฟรมเรตครึ่งหนึ่งตัดอัตราข้อมูลครึ่งหนึ่งโดยไม่เปลี่ยนความละเอียด — แม้บางการใช้งานอาจลดความละเอียดแทน ขึ้นกับ codec และแพลตฟอร์ม
  • บิตเรต — กี่บิตต่อวินาทีที่ตัวเข้ารหัสได้รับอนุญาตให้ใช้ ซึ่งกำหนดระดับการบีบอัดโดยรวม

ค่าทั้งสามนี้กำหนดทุกสิ่งที่อีกฝั่งเห็น ภาพ 1080p ที่บีบอัดเป็นบิตเรตต่ำดูนุ่มและเลอะ สตรีม 30 fps ที่ทำงานที่ 10 fps ทันใดดูกระตุกและไม่เป็นธรรมชาติ เมื่อคุณเข้าใจว่าพรีวิวไม่รายงานค่าใดเหล่านี้เลย ปริศนาของคอลที่แย่กับกล้องที่ดีก็คลาย

SDP เจรจาก่อนที่คุณส่งเฟรม

การเจรจาเริ่มก่อนที่เฟรมแรกจะถูกส่ง เมื่อคุณเข้าร่วมคอล แพลตฟอร์มและเบราว์เซอร์ของคุณแลกเปลี่ยนข้อเสนอและคำตอบ Session Description Protocol (SDP) SDP โฆษณา codec และความสามารถสื่อสารที่แต่ละฝั่งสนับสนุน ความละเอียดและเฟรมเรตจริงจากนั้นถูกเจรจาเพิ่มเติมผ่านพารามิเตอร์ส่งและรับ และจำกัดโดยการประเมินแบนด์วิดท์ ในการทดสอบอย่างไม่เป็นทางการบน Chrome 125 บน Windows 10 (พฤษภาคม 2024) พบว่า SDP answer เสนอ VP9 ก่อน แล้ว H.264 แล้ว VP8 บน Safari 17 บน macOS 14 (ช่วงเดียวกัน) H.264 ปรากฏก่อน การสังเกตเหล่านี้ทำบนเครื่องเดียวต่อเบราว์เซอร์โดยไม่มีเงื่อนไขเครือข่ายที่ควบคุม จึงแสดงการแปรผันที่มีอยู่แทนที่จะกำหนดลำดับสากล codec จริงที่ถูกเลือกขึ้นกับเบราว์เซอร์ แพลตฟอร์ม พารามิเตอร์ SDP และความสามารถฮาร์ดแวร์ ตัวเลือกทั่วไปรวม VP9, H.264, VP8 และ AV1 แต่ไม่มีลำดับความชอบคงที่เดียวข้ามแพลตฟอร์มทั้งหมด

การเลือก codec เป็นเพียงจุดเริ่มต้น เมื่อคอลดำเนินไป กลไกที่สองเข้าควบคุม: การประเมินแบนด์วิดท์ WebRTC ตรวจสอบเส้นทางเครือข่ายอย่างต่อเนื่องทั้งสองทิศทางและทำงานอัลกอริทึมควบคุมการคั่วคับ — มากที่สุดคือ Google Congestion Control — ที่ทำการวัดสามอย่างบนพื้นฐานต่อเนื่อง:

  • การสูญเสียแพ็กเก็ต รายงานโดยฝั่งรับผ่านข้อความตอบกลับ RTCP
  • รอบไปกลับ ความหน่วงระหว่างส่งแพ็กเก็ตและรับการยืนยันว่ามาถึง
  • Throughput อัตราที่ข้อมูลข้ามการเชื่อมต่อจริงๆ

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

ขีดจำกัดนั้นประมาณและขึ้นกับอัลกอริทึมควบคุมการคั่วคับที่ใช้ การสูญเสียแพ็กเก็ตต่อเนื่องเกินประมาณห้าเปอร์เซ็นต์สามารถกระตุ้นการลดบิตเรตเป้าหมาย แต่พฤติกรรมที่แน่นอน — ลดเท่าใด จะลดความละเอียดหรือเฟรมเรตหรือไม่ และที่ระดับการสูญเสียใด — แตกต่างกันไปตามอัลกอริทึม codec และแพลตฟอร์ม ไม่มีการแม็ปสากลจากเปอร์เซ็นต์การสูญเสียไปสู่ความละเอียดเอาต์พุตที่เฉพาะเจาะจง วงจรตอบสนองที่ขับเคลื่อนการตัดสินใจเหล่านี้ถูกกำหนดใน (Google: WebRTC Congestion Control Whitepaper, 2019; RFC 8888: Congestion Control Feedback for RTP) สตรีม 1080p ที่ 30 fps มักต้องการประมาณสี่ถึงหกเมกะบิตต่อวินาทีของแบนด์วิดท์อัปโหลดเพื่อให้ดูสะอาด แม้นี้ขึ้นกับ codec การตั้งค่าการเข้ารหัส และความซับซ้อนของฉาก ถ้าตัวประเมินสรุปว่ามีเพียงหนึ่งเมกะบิตที่ใช้ได้ มันจะไม่พยายามบังคับสตรีมผ่าน — มันลดเป้าหมาย และตัวเข้ารหัสตอบสนองโดยลดความละเอียดเป็น 480p และเฟรมเรตเป็น 15 fps ถ้าการประเมินลดลงอีก ภาพเสื่อมอีก ลดไปถึง 320×240 ที่เป็นเพียงหัวพูด ทุกขั้นตอนเป็นการตั้งใจ: เป้าหมายคือรักษาคอลให้มีชีวิตและเสียงให้เสถียร และคุณภาพวิดีโอเป็นสิ่งแรกที่สละเพื่อบรรลุเป้าหมายนั้น

แผนภาพแสดงขั้นตอนการเข้ารหัสวิดีโอ WebRTC จากเซนเซอร์กล้องผ่านตัวเข้ารหัสเบราว์เซอร์สู่เครือข่ายและผู้รับชม

รูปแบบความล้มเหลวสามแบบที่สตรีมของคุณซ่อน

พรีวิวซ่อนสถานะจริงของสตรีมเบื้องหลังรูปแบบความล้มเหลวสามแบบที่เกิดซ้ำ เรียนรู้ที่จะจดจำแต่ละแบบจากอาการ เพราะวิธีแก้ที่ถูกต้องแตกต่างกันในแต่ละกรณี ทั้งสามแบบมีสัญญาณบ่งชี้ร่วมกันหนึ่งอย่าง: พรีวิวยังสมบูรณ์ตลอดเวลา เพราะมันถูกสุ่มก่อนตัวเข้ารหัส เฉพาะสตรีมที่เข้ารหัส — และดังนั้นหน้าจอของผู้เข้าร่วมคนอื่น — แสดงความเสียหาย

กับดักบิตเรต

อาการ: พรีวิวของคุณสมบูรณ์และ CPU ของเครื่องว่าง อีกฝั่งเห็นภาพมัว ความละเอียดต่ำที่ไม่เคยคมเลย แม้ตอนหยุดนิ่ง การบันทึกในเครื่องดูดีมาก คอลดูแย่

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

ขีดจำกัดการสูญเสีย

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

วินิจฉัย: การสูญเสียแพ็กเก็ตข้ามขีดห้าเปอร์เซ็นต์อย่างไม่ต่อเนื่อง ทำให้ตัวควบคุมการคั่วคับตัดบิตเรตเป้าหมายซ้ำแล้วซ้ำเล่า และตัวเข้ารหัสกำลัง ดรอปเฟรมเพื่อให้พอดี เฟรมเรตลดก่อนเพราะเป็นกลไกที่ถูกที่สุด — ลดจาก 30 เป็น 15 fps ตัดอัตราข้อมูลครึ่งหนึ่งโดยไม่เปลี่ยนความละเอียด ตรวจหาการรบกวน Wi-Fi สายเคเบิลอีเทอร์เน็ตที่ไม่ดี หรือ VPN ที่เพิ่มการสูญเสียและเลเทนซี วิดีโอจะยังเสื่อมจนกว่าเส้นทางเครือข่ายจะได้รับการซ่อมแซม

การค้างของคีย์เฟรม

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

วินิจฉัย: codec วิดีโอส่งเฟรมสองประเภท คีย์เฟรม เข้ารหัสทั้งภาพและปรากฏในช่วงเวลาคงที่ — มักทุกหนึ่งถึงสิบวินาทีขึ้นกับแพลตฟอร์มและการกำหนดค่า เดลต้าเฟรม เข้ารหัสเฉพาะการเปลี่ยนแปลงตั้งแต่เฟรมก่อนหน้า ทำให้มันเล็กมาก ถ้าแพ็กเก็ตจากเดลต้าเฟรมสูญ ฝั่งรับไม่สามารถสร้างเฟรมนั้นใหม่ได้ — มันสามารถขอส่งใหม่ (NACK) ขอคีย์เฟรมใหม่จากผู้ส่ง (PLI หรือ FIR) หรือปกปิดข้อผิดพลาดขณะรอ เมื่อคำขอสำเร็จ การกู้คืนเร็ว เมื่อไม่สำเร็จ ภาพค้างจนกว่าคีย์เฟรมตามกำหนดเวลาถัดไปจะมาถึง การรอนั้นคือการค้างที่คุณเห็น ช่วงคีย์เฟรมสั้นกู้คืนเร็วกว่าแต่เสียแบนด์วิดท์ ช่วงยาวมีประสิทธิภาพแต่ทำให้ทุกการสูญเสียเห็นได้ชัดขึ้น นี่ไม่ใช่การทำงานผิดปกติ — เป็น codec ทำงานตามออกแบบ

การเปรียบเทียบพรีวิวเว็บแคม 1080p คมชัดเคียงข้างสตรีม 480p ที่ถูกลดระดับเป็นบล็อก

วัดสตรีมจริงด้วย getStats()

เลิกเดาเดา ตัวเลขไม่สวย แต่เป็นความจริง WebRTC API เปิดเผย ส่วนต่อประสานสถิติ ที่รายงานสิ่งที่ตัวเข้ารหัสทำอยู่ และหน้าเว็บใดที่คุณควบคุมสามารถอ่านการเชื่อมต่อเพียร์ของตัวเองได้ เรียก getStats() บนออบเจกต์ RTCPeerConnection แล้วกรองรายงานที่ส่งกลับมาหารายการ outbound-rtp ที่ kind เป็น video บนรายการ media-source และ outbound-rtp คุณจะพบค่าที่สำคัญ:

  • framesPerSecond (บนรายการ media-source) — เฟรมเรตที่กล้องส่งให้ตัวเข้ารหัส ถ้าค่านี้ต่ำกว่า 30 บนกล้อง 30 fps เส้นทางจับภาพเองเป็นปัญหา
  • framesPerSecond (บนรายการ outbound-rtp) — เฟรมเรตที่ตัวเข้ารหัสผลิตจริง เมื่อค่านี้ต่ำกว่าอัตราอินพุต ตัวเข้ารหัสกำลังดรอปเฟรม
  • frameWidth และ frameHeight (บนรายการ outbound-rtp) — ความละเอียดที่เข้ารหัส เปรียบเทียบกับการตั้งค่าคอลของคุณ ความแตกต่างใดๆ คือการลดระดับเงียบ
  • bytesSent (บนรายการ outbound-rtp) — ข้อมูลที่เข้ารหัสทั้งหมด สุ่มสองครั้งห่างกันหนึ่งวินาทีและคำนวณผลต่างคูณ 8 เพื่อให้ได้บิตเรตจริง
  • packetsSent และ packetsLost — สังเกตว่า packetsLost บนรายการ outbound-rtp ไม่ได้ถูกเติมเสมอ อัตราการสูญเสียอ่านได้น่าเชื่อถือกว่าจากรายการ remote-inbound-rtp ที่รายงานมุมมองฝั่งรับ
  • currentRoundTripTime (บนรายการ candidate-pair) — ความหน่วงเครือข่าย RTT สูงร่วมกับการสูญเสียบ่งชี้การคั่วคับ

เบราว์เซอร์ต่างกันอาจรายงานชื่อฟิลด์ที่แตกต่างเล็กน้อยหรือละเว้นสถิติบางอย่างทั้งหมด ดังนั้นตรวจสอบข้ามกับหน้า internals ของเบราว์เซอร์เมื่อมี

กฎการตีความนั้นง่าย ถ้า outbound-rtp framesPerSecond ต่ำกว่า media-source framesPerSecond อย่างเห็นได้ ตัวเข้ารหัสกำลังทิ้งเฟรมภายใต้แรงกดดัน ถ้า frameWidth และ frameHeight ต่ำกว่าความละเอียดที่คุณตั้งค่าไว้ งบประมาณการเชื่อมต่อไม่สามารถรับส่งได้ ถ้า bytesSent แปลงเป็นบิตเรตที่ต่ำกว่าข้อกำหนดของ codec สำหรับความละเอียดนั้นๆ อย่างมาก ภาพกำลังถูกบีบอัด — และพรีวิวที่ไม่เคยเห็นตัวเข้ารหัส จะดูดีตลอดเวลา

คุณไม่ต้องเขียนโค้ดเพื่ออ่านค่าเหล่านี้ Chrome และ Edge มีโปรแกรมดูสถิติในตัวที่ chrome://webrtc-internals ที่จับทุกการเชื่อมต่อ WebRTC ในเบราว์เซอร์ รวมถึงที่แพลตฟอร์มคอลสร้างขึ้น เปิดมันก่อนเข้าร่วมประชุม ปล่อยให้มันบันทึก และตรวจสอบรายการ outbound-rtp สำหรับตัวส่งวิดีโอภายหลัง เฟรมเรต ความละเอียด บิตเรต และการสูญเสียเดียวกันอยู่ที่นั่น พร้อมกราฟไทม์ไลน์ที่แสดงว่าตัวเข้ารหัสเปลี่ยนเอาต์พุตเมื่อใดอย่างชัดเจน นี่คือวิธีเร็วที่สุดในการจับการลดระดับในแอคชันบนคอลแพลตฟอร์มจริง

ทำการวัดนี้ขณะคอลของคุณเองว่างอยู่เบื้องหลัง แล้วอีกครั้งระหว่างการประชุมที่ยุ่ง และเปรียบเทียบชุดตัวเลขทั้งสอง การเปรียบเทียบทั่วไป: ขณะว่าง outbound-rtp framesPerSecond อ่านได้ 30 ระหว่างการประชุมที่ยุ่งอาจลดเหลือ 18 ขณะที่พรีวิวในเครื่องยังแสดง 30 การเปรียบเทียบนั้นเผยว่าเครือข่ายพื้นฐานของคุณเพียงพอหรือไม่ และการแข่งขันระหว่างคอลคือสิ่งที่กระตุ้นการลดระดับหรือไม่ เครื่องมือ ทดสอบเว็บแคม แสดงความละเอียดและเฟรมเรตของแทร็กจับในเครื่องตามที่เจรจาผ่าน getUserMedia() — เป็นค่าอ้างอิงที่มีประโยชน์สำหรับสิ่งที่กล้องของคุณส่งให้เบราว์เซอร์ได้ แต่ไม่ใช่การวัดสตรีมที่เข้ารหัส WebRTC ขาออก ซึ่งต้องการการเชื่อมต่อเพียร์หรือหน้า WebRTC internals ของเบราว์เซอร์

Zoom, Meet, Teams: กล้องสามตัวที่แตกต่าง

กล้องเดียวกัน แล็ปท็อปเดียวกัน และเครือข่ายเดียวกันสามารถให้ผลลัพธ์ที่แตกต่างกันอย่างเห็นได้ในแอปพลิเคชันต่างกัน เพราะทุกแพลตฟอร์มใช้นโยบายการเข้ารหัสของตัวเองบนการใช้งาน WebRTC ของเบราว์เซอร์

  • Zoom มักให้ความสำคัญกับความเสถียร ขึ้นกับเวอร์ชัน ประเภทบัญชี และการตั้งค่าการประชุม มันอาจจำกัดความละเอียดขาออกและสละคุณภาพวิดีโอเพื่อรักษาเสียงและการแชร์หน้าจอให้เสถียร กล้องที่รองรับ 1080p อาจส่ง 720p หรือต่ำกว่าบน Zoom
  • Google Meet มักปรับตามแบนด์วิดท์ที่วัดได้ ลดความละเอียดเร็วและกู้คืนเร็วเมื่อสภาพดีขึ้น พฤติกรรมของมันติดตามสถานะเครือข่ายจริงของคุณ ทั้งในแง่ดีและแง่ร้าย
  • Microsoft Teams ใช้ไปป์ไลน์การเข้ารหัสและการประมวลผลหลังของตัวเอง ขึ้นกับเวอร์ชันและการตั้งค่าการประชุม ภาพอาจถูกบีบอัดเพิ่มเติมจากการเจรจา WebRTC ดิบ
  • WebRTC ในเบราว์เซอร์โดยตรง ประเภทที่คุณได้จากหน้าเว็บเปล่าๆ ส่งสตรีมที่เจรจาแล้วโดยไม่มีนโยบายแพลตฟอร์มเพิ่ม มันเป็นสิ่งที่ใกล้เคียงที่สุดกับความจริงพื้นฐานว่าฮาร์ดแวร์และเครือข่ายของคุณสามารถส่งได้ภายใต้ WebRTC ธรรมดา นโยบายแพลตฟอร์มแตกต่างกันไปตามเวอร์ชัน ประเภทบัญชี และการกำหนดค่าการประชุม ดังนั้นถือว่าเป็นแนวโน้มทั่วไปแทนที่จะเป็นกฎคงที่

ผลลัพธ์ในทางปฏิบัติ: การเปรียบเทียบคอล Zoom กับคอล Meet ไม่ใช่การทดสอบกล้อง มันเป็นการทดสอบการตัดสินใจเข้ารหัสของแต่ละแพลตฟอร์ม วัดสตรีมดิบก่อนด้วยหน้า WebRTC ธรรมดาหรือเครื่องมือ ทดสอบเว็บแคม ถ้าสตรีมดิบสะอาดและแพลตฟอร์มหนึ่งยังดูแย่ นโยบายของแพลตฟอร์มคือข้อจำกัด และการอัปเกรดฮาร์ดแวร์จะไม่เปลี่ยนแปลงอะไร เมื่อคอลแพลตฟอร์มกำลังดำเนินไป chrome://webrtc-internals ให้คุณดูการตัดสินใจของตัวเข้ารหัสแบบสด ดังนั้นคุณสามารถเห็นว่าการลดระดับเป็นนโยบายของแพลตฟอร์มหรือพฤติกรรมของเครือข่ายโดยไม่ต้องเชื่อรายงานตัวเองของทั้งสองฝั่ง

เจ็ดขั้นตอนสู่สตรีมที่สะอาด

ขั้นตอนเหล่านี้แยกสาเหตุที่แตกต่างกัน คุณสามารถหยุดทันทีที่สตรีมดูถูกต้อง — แต่วัดก่อนและหลังการเปลี่ยนแปลงแต่ละครั้งเพื่อยืนยันว่าการแก้ไขย้ายตัวเลขจริงๆ

  1. วัดก่อน เปิด chrome://webrtc-internals หรือใช้ getStats() บนการเชื่อมต่อเพียร์ของคุณเองและบันทึกความละเอียด เฟรมเรต และบิตเรต ถ้าสตรีมดิบถูกลดระดับอยู่แล้ว กล้องและการเชื่อมต่อของคุณคือปัญหา ถ้าสะอาด แพลตฟอร์มคือปัญหา
  2. ตรวจแบนด์วิดท์ การโทรวิดีโอต้องการอย่างน้อย 1 Mbps ของอัปโหลดสำหรับ 720p และประมาณ 4 Mbps สำหรับ 1080p ทดสอบจากเครื่องที่คุณโทร ไม่ใช่อุปกรณ์อื่น และทดสอบใหม่เมื่อมีการจราจรอื่นบนเครือข่าย ย้ายไปใช้การเชื่อมต่อแบบมีสายถ้าทำได้ การสูญเสีย Wi-Fi เป็นสาเหตุที่พบบ่อยที่สุดของการลดระดับที่มองไม่เห็น
  3. แก้ไฟ้ง วัตถุที่สว่างสดใสอัดแบบได้ดีกว่าวัตถุที่มืดมาก เพราะตัวเข้ารหัสใช้บิตเรตกับรายละเอียดที่มองเห็นแทนที่จะเป็นสัญญาณรบกวน หันหน้าไปทางหน้าต่างหรือใช้แหล่งแสงนุ่มๆ นี่ไม่ต้องเสียอะไรเลยและมักให้ผลลัพธ์ที่ดีกว่าการตั้งค่าใดๆ
  4. ปิดการกำจัดสัญญาณรบกวนวิดีโอ เมื่อสภาพแวดล้อมของคุณเงียบและสว่างเพียงพอแล้ว บางแพลตฟอร์มใช้การกำจัดสัญญาณรบกวนอย่างก้าวร้าวในฉากแสงน้อย ซึ่งสามารถทำให้รายละเอียดละเอียดนุ่มลงอย่างชัดเจนในสตรีมที่เข้ารหัส พรีวิวในเครื่องจะไม่แสดงความแตกต่างนี้ เฉพาะสตรีมที่เข้ารหัสเท่านั้นที่จะแสดง ตรวจการตั้งค่าแพลตฟอร์มเฉพาะเพื่อยืนยันว่ามีการควบคุมอะไรบ้าง
  5. ปิดพื้นหลังเสมือน การแยกพื้นหลังเพิ่มภาระให้บิตเรตที่มีประสิทธิภาพและใช้ GPU จากตัวเข้ารหัส พื้นหลังจริงที่สะอาดพร้อมแสงสม่ำเสมอดีกว่าพื้นหลังเสมือนใดๆ
  6. ตรวจ codec ถ้า CPU ของคุณรับมือได้ VP9 ให้คุณภาพต่อบิตที่ดีที่สุด ถ้าคุณเห็นการทิ้งเฟรมหรือ CPU พุ่ง H.264 เข้ารหัสเร็วกว่า บางแพลตฟอร์มเปิดเผยความชอบ codec ในการตั้งค่า
  7. ทดสอบแพลตฟอร์มอื่น ถ้าคุณภาพดีบนบริการหนึ่งแต่แย่บนอีกบริการหนึ่ง นโยบายการเข้ารหัสของแพลตฟอร์มคือข้อจำกัด ปรับความคาดหวังหรือเครื่องมือประชุมของคุณให้เหมาะสม — ฮาร์ดแวร์ของคุณไม่ใช่สาเหตุ

บทสรุป

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

เปิด chrome://webrtc-internals เข้าร่วมคอลถัดไปของคุณ ดูรายการ outbound-rtp ถ้า frameWidth หรือ framesPerSecond ต่ำกว่าที่คุณตั้งค่าในการตั้งค่ากล้อง การลดระดับกำลังเกิดขึ้น สาเหตุมักเกี่ยวข้องกับแบนด์วิดท์ — สิ่งที่เบราว์เซอร์ของคุณได้รับอนุญาตให้ใช้ และการเชื่อมต่อของคุณสามารถรับส่งสตรีมที่คุณคิดว่ากำลังส่งได้จริงหรือไม่ — แต่โหลด CPU การเลือกตัวเข้ารหัส นโยบายแพลตฟอร์ม และการกำหนดค่าข้อจำกัดก็สามารถมีส่วนร่วมหรือเป็นปัจจัยหลักของการเสื่อมได้

คำถามที่พบบ่อย

ทำไมพรีวิวกล้องดู 1080p แต่อีกฝ่ายเห็นภาพมัว?

พรีวิวเบราว์เซอร์แสดงวิวจับในเครื่อง — เฟรมที่กล้องผลิตผ่าน getUserMedia() — ก่อนเข้ารหัส WebRTC สิ่งที่อีกฝ่ายได้รับคือสตรีมหลัง WebRTC เจรจา codec บิตเรต และความละเอียดตามเงื่อนไขเครือข่ายที่รับรู้ หากแบนด์วิดท์อัปโหลดจำกัด การสูญเสียแพ็กเก็ตสูง หรือแพลตฟอร์มเลือกการตั้งค่า codec อนุรักษ์นิยม เบราว์เซอร์ลดระดับสตรีมอย่างเงียบๆ เพื่อรักษาการเชื่อมต่อเสถียร พรีวิวไม่สะท้อนการเสื่อมนี้เพราะมันถูกป้อนจากเส้นทางจับในเครื่อง ไม่ใช่จากเอาต์พุตที่เข้ารหัส แม้มันอาจรวมการปรับสเกล การแปลงสี หรือการประมวลผลข้อจำกัดที่เบราว์เซอร์ใช้

เบราว์เซอร์ตัดสินใจลดคุณภาพวิดีโออย่างไร?

WebRTC ประเมินแบนด์วิดท์ที่ใช้ได้จากการสูญเสียแพ็กเก็ต รอบไปกลับ และ throughput เมื่อการสูญเสียเกินประมาณห้าเปอร์เซ็นต์หรือ throughput ต่ำกว่าบิตเรตปัจจุบัน การควบคุมการคั่วคับลดบิตเรตเป้าหมายและ encoder ปรับความละเอียดและเฟรมเรตให้พอดี ตัวอย่างคร่าวๆ สตรีม 1080p ที่สามสิบเฟรมต่อวินาทีต้องการประมาณสี่ถึงหกเมกะบิตต่อวินาที หากเบราว์เซอร์ประเมินว่ามีเพียงหนึ่งเมกะบิตใช้ได้ การตอบสนองทั่วไปคือลดเป็น 480p ที่สิบห้าเฟรมต่อวินาทีโดยไม่มีการเตือน ขีดจำกัดที่แน่นอนขึ้นกับ codec แพลตฟอร์ม และการควบคุมการคั่วคับ เป็นรูปแบบทั่วไป ไม่ใช่ค่าที่รับประกัน นี่ป้องกันการค้างทั้งหมดโดยสละคุณภาพ

getStats() ให้ข้อมูลอะไร?

เมธอด getStats() บนการเชื่อมต่อ WebRTC ส่งคืนสถิติโดยละเอียดเกี่ยวกับการเข้ารหัส เครือข่าย และเส้นทางรับ ฝั่งส่งรายงานเฟรมเรตจับจริง เฟรมเรตเข้ารหัส ความละเอียดเอาต์พุต บิตเรตเป็นบิตต่อวินาที อัตราการสูญเสียแพ็กเก็ต และรอบไปกลับ ฝั่งรับรายงานบิตเรตขาเข้า jitter และความล้มเหลวการถอดรหัส เมทริกหลักคือ framesPerSecond บน outbound-rtp เทียบกับ framesPerSecond บน media-source — หากแตกต่างกันมาก encoder กำลังดรอปเฟรมเพื่อรักษาเสถียรภาพ

การกำจัดสัญญาณรบกวนช่วยหรือทำลายคุณภาพวิดีโอ?

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

พื้นหลังเสมือนใช้แบนด์วิดท์มากหรือไม่?

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

กล้องทำงานดีบนคอมแต่ดูแย่บนคอล — อะไรเปลี่ยน?

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

ใช้ VP8, VP9 หรือ H.264?

VP9 ให้ประสิทธิภาพการบีบอัดที่ดีและความละเอียดที่สูงกว่าที่บิตเรตเดียวกัน แต่ต้องการ CPU มากกว่าในการเข้ารหัส (WebM Project: VP9 Bitstream Specification) H.264 สมบูรณ์แบบกว่าและเข้ารหัสเร็วกว่า (ITU-T: H.264/AVC Standard) แม้มันอาจต้องการประมาณยี่สิบถึงสามสิบเปอร์เซ็นต์บิตเรตมากกว่าเพื่อให้ได้คุณภาพเท่า VP9 บนหลายแพลตฟอร์ม VP8 เป็น codec เก่าที่มีประสิทธิภาพน้อยกว่า VP9 และ H.264 ในสถานการณ์ส่วนใหญ่ หาก VP9 หรือ H.264 ใช้ได้ มักเป็นที่ต้องการ การเจรจา codec ของเบราว์เซอร์เลือกอัตโนมัติ แต่บางแพลตฟอร์มอนุญาตการแทนที่ด้วยตนเอง ไม่มี codec ที่ดีที่สุดในสากล

แก้วิดีโอคอลที่ดูแย่กว่าพรีวิวอย่างไร?

เริ่มด้วยการวัดสตรีมจริงด้วย getStats() เพื่อยืนยันว่าเบราว์เซอร์ลดความละเอียดหรือเฟรมเรตหรือไม่ หากความละเอียดลด ตรวจแบนด์วิดท์อัปโหลด — วิดีโอคอลต้องการอย่างน้อยหนึ่งเมกะบิตต่อวินาทีสำหรับ 720p และสี่เมกะบิตสำหรับ 1080p (Google WebRTC Blog: Bandwidth Estimation, 2016; YouTube Help: Recommended Upload Speeds) หากการสูญเสียแพ็กเก็ตเกินห้าเปอร์เซ็นต์ การเชื่อมต่อไม่เสถียรไม่ว่าแบนด์วิดท์ดิบจะเป็นเท่าใด แก้แสงก่อน: วัตถุที่สว่างต้องการบิตเรตน้อยกว่าเพื่อดูดี จากนั้นปิดการกำจัดสัญญาณรบกวนและพื้นหลังเสมือน หากคุณภาพยังแย่บนแพลตฟอร์มหนึ่งแต่ดีบนอีกแพลตฟอร์ม นโยบายการเข้ารหัสของแพลตฟอร์มคือข้อจำกัด ไม่ใช่ฮาร์ดแวร์หรือการเชื่อมต่อของคุณ

บทความที่เกี่ยวข้อง