เลื่อนและซูมแท็บที่จับภาพ

François Beaufort
François Beaufort

แพลตฟอร์มเว็บมีScreen Capture API ที่ช่วยให้แชร์แท็บ หน้าต่าง และหน้าจอได้อยู่แล้ว เมื่อเว็บแอปเรียกใช้ getDisplayMedia() Chrome จะแจ้งให้ผู้ใช้แชร์แท็บ หน้าต่าง หรือหน้าจอกับเว็บแอปเป็นวิดีโอ MediaStreamTrack

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

เอกสารนี้จะแนะนำ Captured Surface Control API ใหม่ใน Chrome ซึ่งช่วยให้เว็บแอปเลื่อนแท็บที่แคปเจอร์ รวมถึงอ่านและเขียนระดับการซูมของแท็บที่แคปเจอร์ได้

ผู้ใช้เลื่อนและซูมแท็บที่แคปเจอร์ (การสาธิต)

เหตุผลที่ควรใช้การควบคุมพื้นผิวที่บันทึก

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

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

Captured Surface Control API ช่วยแก้ปัญหาเหล่านี้

ฉันจะใช้การควบคุมพื้นผิวที่จับภาพได้อย่างไร

การใช้การควบคุมพื้นผิวที่บันทึกไว้ให้สำเร็จต้องทำตาม 2-3 ขั้นตอน เช่น การบันทึกแท็บเบราว์เซอร์อย่างชัดเจนและการขอสิทธิ์จากผู้ใช้ก่อนที่จะเลื่อนและซูมแท็บที่บันทึกไว้ได้

บันทึกแท็บเบราว์เซอร์

เริ่มต้นด้วยการแจ้งให้ผู้ใช้เลือกพื้นผิวที่จะแชร์โดยใช้ getDisplayMedia() และในกระบวนการนี้ ให้เชื่อมโยงออบเจ็กต์ CaptureController กับเซสชันการจับภาพ เราจะใช้วัตถุดังกล่าวเพื่อควบคุมพื้นผิวที่จับภาพในเร็วๆ นี้

const controller = new CaptureController(); const stream = await navigator.mediaDevices.getDisplayMedia({ controller }); 

จากนั้นสร้างตัวอย่างในเครื่องของพื้นผิวที่จับภาพในรูปแบบขององค์ประกอบ <video> ดังนี้

const previewTile = document.querySelector('video'); previewTile.srcObject = stream; 

หากผู้ใช้เลือกที่จะแชร์หน้าต่างหรือหน้าจอ ตอนนี้เราจะยังไม่ดำเนินการต่อ แต่หากผู้ใช้เลือกที่จะแชร์แท็บ เราอาจดำเนินการต่อ

const [track] = stream.getVideoTracks();  if (track.getSettings().displaySurface !== 'browser') {   // Bail out early if the user didn't pick a tab.   return; } 

ข้อความแจ้งขอสิทธิ์

การเรียกใช้ forwardWheel(), increaseZoomLevel(), decreaseZoomLevel() หรือ resetZoomLevel() เป็นครั้งแรกในออบเจ็กต์ CaptureController ที่กำหนดจะทำให้เกิดข้อความแจ้งสิทธิ์ หากผู้ใช้ให้สิทธิ์ ระบบจะอนุญาตให้เรียกใช้เมธอดเหล่านี้ต่อไปได้

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

เลื่อน

เมื่อใช้ forwardWheel() แอปที่บันทึกจะส่งต่อเหตุการณ์ของล้อจากองค์ประกอบแหล่งที่มาภายในแอปที่บันทึกเองไปยัง Viewport ของแท็บที่บันทึกได้ เหตุการณ์เหล่านี้จะแยกไม่ออกจากแอปที่บันทึกไว้จากการโต้ตอบของผู้ใช้โดยตรง

หากแอปที่บันทึกใช้องค์ประกอบ <video> ที่ชื่อ "previewTile" โค้ดต่อไปนี้จะแสดงวิธีส่งต่อเหตุการณ์ล้อเลื่อนไปยังแท็บที่บันทึก

const previewTile = document.querySelector('video'); try {   // Relay the user's action to the captured tab.   await controller.forwardWheel(previewTile); } catch (error) {   // Inspect the error.   // ... } 

เมธอด forwardWheel() รับอินพุตเดียวซึ่งอาจเป็นอย่างใดอย่างหนึ่งต่อไปนี้

  • องค์ประกอบ HTML ที่จะส่งต่อเหตุการณ์ล้อไปยังแท็บที่จับภาพ
  • null ซึ่งระบุว่าควรหยุดการส่งต่อ

การเรียกใช้ forwardWheel() ที่สำเร็จจะลบล้างการเรียกใช้ก่อนหน้า

ระบบอาจปฏิเสธ Promise ที่ forwardWheel() แสดงผลในกรณีต่อไปนี้

  • หากเซสชันการจับภาพยังไม่เริ่มหรือหยุดไปแล้ว
  • หากผู้ใช้ไม่ได้ให้สิทธิ์ที่เกี่ยวข้อง

ซูม

การโต้ตอบกับระดับการซูมของแท็บที่แคปเจอร์จะทำผ่านCaptureController API Surface ต่อไปนี้

getSupportedZoomLevels()

เมธอดนี้จะแสดงรายการระดับการซูมที่เบราว์เซอร์รองรับสำหรับประเภทพื้นผิวที่กำลังจับภาพ ค่าในรายการนี้จะแสดงเป็นเปอร์เซ็นต์เมื่อเทียบกับ "ระดับการซูมเริ่มต้น" ซึ่งกำหนดเป็น 100% รายการจะเพิ่มขึ้นอย่างต่อเนื่องและมีค่า 100

สามารถเรียกใช้วิธีนี้ได้เฉพาะประเภทพื้นผิวการแสดงผลที่รองรับเท่านั้น ซึ่งในขณะนี้หมายถึงเฉพาะแท็บ

controller.getSupportedZoomLevels() อาจเรียกใช้ได้หากเป็นไปตามเงื่อนไขต่อไปนี้

  • controller เชื่อมโยงกับการจับภาพที่ใช้งานอยู่
  • การจับภาพเป็นของแท็บ

ไม่เช่นนั้นระบบจะแสดงข้อผิดพลาด

"captured-surface-control" ไม่จำเป็นต้องมีสิทธิ์ในการเรียกใช้เมธอดนี้

zoomLevel

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

หลังจากสิ้นสุดการจับภาพ แอตทริบิวต์จะมีค่าระดับการซูมล่าสุด

"captured-surface-control" ไม่จำเป็นต้องมีสิทธิ์ในการอ่านแอตทริบิวต์นี้

onzoomlevelchange

ตัวแฮนเดิลเหตุการณ์นี้ช่วยให้รับฟังการเปลี่ยนแปลงระดับการซูมของแท็บที่จับภาพได้ ซึ่งอาจเกิดขึ้นในกรณีต่อไปนี้

  • เมื่อผู้ใช้โต้ตอบกับเบราว์เซอร์เพื่อเปลี่ยนระดับการซูมของแท็บที่จับภาพด้วยตนเอง
  • เพื่อตอบสนองต่อการเรียกใช้เมธอดการตั้งค่าการซูมของแอปที่จับภาพ (อธิบายไว้ด้านล่าง)

"captured-surface-control" ไม่จำเป็นต้องมีสิทธิ์ในการอ่านแอตทริบิวต์นี้

increaseZoomLevel(), decreaseZoomLevel() และ resetZoomLevel()

วิธีการเหล่านี้ช่วยให้สามารถจัดการระดับการซูมของแท็บที่จับภาพได้

increaseZoomLevel() และ decreaseZoomLevel() จะเปลี่ยนระดับการซูมเป็นระดับการซูมถัดไปหรือก่อนหน้าตามลำดับ ตามลำดับที่ getSupportedZoomLevels() แสดง resetZoomLevel() จะตั้งค่าเป็น 100

ต้องมี"captured-surface-control"สิทธิ์ในการเรียกใช้เมธอดเหล่านี้ หากแอปที่บันทึกไม่มีสิทธิ์นี้ ระบบจะแจ้งให้ผู้ใช้ให้สิทธิ์หรือปฏิเสธ

เมธอดเหล่านี้ทั้งหมดจะแสดงผล Promise ซึ่งจะได้รับการแก้ไขหากการเรียกสำเร็จ และจะถูกปฏิเสธในกรณีอื่นๆ สาเหตุที่อาจทำให้ถูกปฏิเสธมีดังนี้

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

โปรดทราบว่าเราขอแนะนำให้หลีกเลี่ยงการโทรหา decreaseZoomLevel() หาก controller.zoomLevel == controller.getSupportedZoomLevels().at(0) และป้องกันการโทรหา increaseZoomLevel() ในลักษณะเดียวกันกับ .at(-1)

ตัวอย่างต่อไปนี้แสดงวิธีอนุญาตให้ผู้ใช้เพิ่มระดับการซูมของแท็บที่บันทึกได้โดยตรงจากแอปที่บันทึก

const zoomIncreaseButton = document.getElementById('zoomInButton'); zoomIncreaseButton.addEventListener('click', async (event) => {   if (controller.zoomLevel >= controller.getSupportedZoomLevels().at(-1)) {     return;   }   try {     await controller.increaseZoomLevel();   } catch (error) {     // Inspect the error.     // ...   } }); 

ตัวอย่างต่อไปนี้แสดงวิธีตอบสนองต่อการเปลี่ยนแปลงระดับการซูมของแท็บที่บันทึกไว้

controller.addEventListener('zoomlevelchange', (event) => {   const zoomLevelLabel = document.querySelector('#zoomLevelLabel');   zoomLevelLabel.textContent = `${controller.zoomLevel}%`; }); 

การตรวจหาฟีเจอร์

หากต้องการตรวจสอบว่าระบบรองรับ Captured Surface Control API หรือไม่ ให้ใช้คำสั่งต่อไปนี้

if (!!window.CaptureController?.prototype.forwardWheel) {   // CaptureController forwardWheel() is supported. } 

คุณยังใช้พื้นผิวอื่นๆ ของ Captured Surface Control API เช่น increaseZoomLevel หรือ decreaseZoomLevel หรือตรวจสอบทั้งหมดได้ด้วย

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

การควบคุมพื้นผิวที่จับภาพพร้อมใช้งานจาก Chrome 136 บนเดสก์ท็อปเท่านั้น

ความปลอดภัยและความเป็นส่วนตัว

นโยบายสิทธิ์ของ "captured-surface-control" ช่วยให้คุณจัดการวิธีที่แอปบันทึกและ iframe ของบุคคลที่สามที่ฝังไว้เข้าถึงการควบคุมพื้นผิวที่บันทึกได้ หากต้องการทำความเข้าใจข้อแลกเปลี่ยนด้านความปลอดภัย โปรดดูส่วนข้อควรพิจารณาด้านความเป็นส่วนตัวและความปลอดภัยของคำอธิบายเกี่ยวกับตัวควบคุมพื้นผิวที่จับภาพ

สาธิต

คุณสามารถลองใช้การควบคุมพื้นผิวที่จับภาพได้โดยเรียกใช้เดโม

ความคิดเห็น

ทีม Chrome และชุมชนมาตรฐานเว็บอยากทราบประสบการณ์การใช้งานการควบคุมพื้นผิวที่บันทึกไว้ของคุณ

บอกเราเกี่ยวกับการออกแบบ

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

หากพบปัญหาในการติดตั้งใช้งาน

หากพบข้อบกพร่องในการใช้งาน Chrome หรือการติดตั้งใช้งานแตกต่างจากข้อกำหนด ยื่นข้อบกพร่องที่ https://new.crbug.com โปรดระบุรายละเอียดให้มากที่สุดเท่าที่จะทำได้ รวมถึงวิธีการจำลองปัญหา