แก้ปัญหาและแก้ไขข้อผิดพลาดของ Meet Media API

คู่มือนี้มีวิธีการแก้ไขข้อผิดพลาดที่พบบ่อยของ Google Meet Media API

แก้ปัญหารหัสข้อผิดพลาด

เคล็ดลับในการแก้ปัญหารหัสข้อผิดพลาดที่ส่งคืนโดยปลายทาง connectActiveConference มีดังนี้

รหัสข้อผิดพลาด
NO_ACTIVE_CONFERENCE ตรวจสอบว่าไคลเอ็นต์ Meet Media API พยายามเชื่อมต่อหลังจากที่ ผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์อยู่ใน การประชุมใน พื้นที่การประชุมแล้วเท่านั้น หากคุณกำลังทำแบบสำรวจเพื่อหาเวลาเริ่มการประชุม ให้ใช้กิจกรรมเริ่มการประชุมแทน
INVALID_OFFER อ่านข้อกำหนดของข้อเสนอเพื่อ ตรวจสอบรายละเอียดที่ขาดหายไป เช่น ช่องที่ต้องเปิด นอกจากนี้ คุณยัง เปรียบเทียบสตริงข้อเสนอของแอปกับ ข้อเสนอตัวอย่าง และตรวจสอบความแตกต่างได้ด้วย
INCOMPATIBLE_DEVICE อุปกรณ์อย่างน้อย 1 เครื่องในการประชุม ไม่รองรับไคลเอ็นต์ Meet Media API แอปของคุณจะเข้าร่วมไม่ได้ ดังนั้น คุณอาจต้องแจ้งให้ผู้ใช้ปลายทางทราบ สาเหตุที่อุปกรณ์ไม่รองรับอาจเป็นเพราะระบบถือว่าบัญชีที่เชื่อมโยงกับอุปกรณ์นั้นเป็นบัญชีของผู้ที่มีอายุต่ำกว่าเกณฑ์ ดูข้อมูลเพิ่มเติมได้ที่ข้อกำหนดของผู้ใช้ปลายทาง
UNSUPPORTED_PLATFORM_PRESENT อุปกรณ์อย่างน้อย 1 เครื่องในการประชุม ไม่รองรับไคลเอ็นต์ Meet Media API แอปของคุณจะเข้าร่วมไม่ได้ ดังนั้น คุณอาจต้องแจ้งให้ผู้ใช้ปลายทางทราบ สาเหตุที่แพลตฟอร์มไม่รองรับ ได้แก่ แอปบนอุปกรณ์เคลื่อนที่ที่ไม่เป็นไปตามเวอร์ชันขั้นต่ำของแอปบนอุปกรณ์เคลื่อนที่ และการเข้าร่วมจากแพลตฟอร์มที่ไม่รองรับ ดูข้อมูลเพิ่มเติมได้ที่ข้อกำหนดของผู้ใช้ปลายทาง
CONNECTIONS_EXHAUSTED ไคลเอ็นต์ Meet Media API จะเชื่อมต่อกับการประชุมได้ครั้งละ 1 รายการเท่านั้น หากแอป ขัดข้อง คุณอาจเห็นข้อผิดพลาดนี้หากแอปพยายามเชื่อมต่ออีกครั้ง ในกรณีนี้ ให้รอประมาณ 30 วินาทีเพื่อให้ Meet หมดเวลาการเชื่อมต่อก่อนหน้า แล้วลองอีกครั้ง
CONSENTER_ABSENT ไม่มีผู้ให้ความยินยอมที่มีสิทธิ์ในการประชุม สำหรับการประชุมที่ผู้บริโภคเป็นเจ้าของ โปรดตรวจสอบว่าผู้เริ่มการประชุมอยู่ในการประชุม สำหรับการประชุมของเจ้าของพื้นที่ทำงาน ควรมีสมาชิกขององค์กรนั้นอย่างน้อย 1 คนที่เป็นเจ้าของการประชุม ดูข้อมูลเพิ่มเติมได้ที่ข้อกำหนดสำหรับผู้ให้ความยินยอม
DISABLED_BY_ADMIN ผู้ดูแลระบบได้ปิดใช้ Meet Media API สำหรับองค์กร ของตน หากพบข้อความนี้ คุณจะเปลี่ยนการตั้งค่าไม่ได้ในระหว่าง ระยะเวลาของการประชุม ดูข้อมูลเพิ่มเติมได้ที่รูปที่ 3 ในวงจรของ Meet Media API
DISABLED_BY_HOST_CONROL ผู้จัดปิดใช้ Meet Media API สำหรับการประชุม แอปของคุณจะเข้าร่วมไม่ได้ ดังนั้น คุณอาจต้องแจ้งให้ผู้ใช้ปลายทางทราบ ดูข้อมูลเพิ่มเติมได้ที่รูปที่ 5 ในวงจรของ Meet Media API
DISABLED_DUE_TO_WATERMARKING เมื่อเปิดใช้ลายน้ำ ระบบจะไม่อนุญาตให้ Meet Media API เข้าสู่การประชุม คุณอาจต้องแจ้งให้ผู้ใช้ปลายทางทราบ ดูข้อมูลเพิ่มเติมได้ที่รูปที่ 2 ในวงจรของ Meet Media API
DISABLED_DUE_TO_ENCRYPTION เมื่อเปิดใช้การเข้ารหัส ระบบจะไม่อนุญาตให้ Meet Media API เข้าสู่การประชุม ซึ่งจะเปลี่ยนแปลงไม่ได้ในระหว่างการโทรผ่าน Meet คุณอาจต้องแจ้งให้ผู้ใช้ปลายทางทราบ ดูข้อมูลเพิ่มเติมได้ที่รูปที่ 2 ในวงจรของ Meet Media API

แพ็กเกจแบบรวม

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

ข้อผิดพลาดในการเรียงลำดับคำอธิบายสื่อ

เมื่อสร้างการเชื่อมต่อแบบเพียร์ทูเพียร์ด้วยข้อเสนอ Session Description Protocol (SDP) คุณอาจเห็นข้อผิดพลาดต่อไปนี้

Failed to execute 'setRemoteDescription' on 'RTCPeerConnection':
Failed to set remote answer sdp:
The order of m-lines in answer doesn't match order in offer. Rejecting answer.

ซึ่งหมายความว่าบรรทัดคำอธิบายสื่อในคำตอบ SDP ไม่ตรงกับคำอธิบายสื่อในข้อเสนอ SDP

ข้อเสนอ SDP คำตอบ SDP
m=audio 9 UDP/TLS/RTP/SAVPF 111 m=audio 9 UDP/TLS/RTP/SAVPF 111
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 m=audio 9 UDP/TLS/RTP/SAVPF 111
m=audio 9 UDP/TLS/RTP/SAVPF 111 m=audio 9 UDP/TLS/RTP/SAVPF 111
m=audio 9 UDP/TLS/RTP/SAVPF 111 m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99

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

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีจับคู่คำอธิบายสื่ออย่างถูกต้อง

C++

rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection;

// Signal the entire video at once.
for (uint32_t i = 0; i < configurations.receiving_video_stream_count; ++i) {
    webrtc::RtpTransceiverInit video_init;
    video_init.direction = webrtc::RtpTransceiverDirection::kRecvOnly;
    video_init.stream_ids = {absl::StrCat("video_stream_", i)};

    webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>>
        video_result = peer_connection->AddTransceiver(
            cricket::MediaType::MEDIA_TYPE_VIDEO, video_init);
  // . . .
}

JavaScript

pc = new RTCPeerConnection();

// Signal the entire video at once.
pc.addTransceiver(video, {'direction':'recvonly'});
pc.addTransceiver(video, {'direction':'recvonly'});
pc.addTransceiver(video, {'direction':'recvonly'});

ข้อผิดพลาดเกี่ยวกับแอตทริบิวต์บทบาท DTLS

เมื่อตั้งค่าแอตทริบิวต์บทบาท DTLS คุณอาจเห็นข้อผิดพลาดต่อไปนี้

All DTLS roles must be one of [ACTIVE, ACTPASS].

ข้อผิดพลาดนี้เกิดขึ้นเมื่อไม่ได้ตั้งค่าแอตทริบิวต์ a=setup:< > อย่างถูกต้องสำหรับคำอธิบายสื่อทั้งหมดในข้อเสนอ SDP

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

  • a=setup:actpass
  • a=setup:active
v=0
o=- 4743178474630771513 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=extmap-allow-mixed
a=msid-semantic: WMS
. . .
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101
. . .
a=setup:actpass
. . .
m=audio 39807 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
. . .
a=setup:actpass
. . .

แก้ปัญหาเกี่ยวกับเสียง

ส่วนต่อไปนี้จะช่วยแก้ปัญหาเกี่ยวกับเสียงในแอปได้

ตรวจสอบบันทึก

หากคุณใช้เว็บไคลเอ็นต์ในเบราว์เซอร์ Chrome ให้ทำดังนี้

  1. เปิดแท็บใหม่และป้อน chrome://webrtc-internals ลงในแถบที่อยู่
  2. ไปที่ส่วนที่มีป้ายกำกับว่า Stats graph for inbound-rtp
  3. ตรวจสอบกราฟเสียงแต่ละรายการเพื่อดูว่าได้รับแพ็กเก็ตหรือไม่

หากคุณใช้ไคลเอ็นต์อ้างอิง C++ ให้ตรวจสอบว่ามีการเรียกใช้ OnAudioFrame หรือไม่

ยืนยันขอบเขต OAuth

ระบบจะส่งเสียงก็ต่อเมื่อมีการระบุขอบเขตที่เหมาะสมพร้อมกับคำขอเชื่อมต่อเริ่มต้น เท่านั้น หากต้องการแก้ไขข้อผิดพลาด ให้ตรวจสอบว่าได้ระบุขอบเขต OAuth 2.0 ที่ถูกต้อง ดูข้อมูลเพิ่มเติมได้ที่ขอบเขตของ Meet Media API

ตรวจสอบว่าได้ตั้งค่าการประชุมอย่างถูกต้อง

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

    {"sessionStatus":{"connectionState":"STATE_JOINED"}}
    
  • ตรวจสอบว่ามีผู้เข้าร่วมการประชุมคนอื่นๆ ที่ไม่ได้ปิดเสียงสตรีมเสียง

ตรวจสอบสัญญาณสำหรับเสียง

Meet จะให้เสียงเท่านั้นหากคุณส่งสัญญาณนี้ในข้อเสนอ SDP ต้องมีคำอธิบายสื่อเสียงแบบรับอย่างเดียว 3 รายการใน ข้อเสนอ

m=audio 39807 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
. . .
a=mid:0
. . .
a=recvonly
. . .
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
. . .
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
. . .
a=mid:1
. . .
a=recvonly
. . .
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
. . .
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
. . .
a=mid:2
. . .
a=recvonly
. . .
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
. . .

หากเซิร์ฟเวอร์ Meet ได้รับข้อเสนอที่ถูกต้อง เซิร์ฟเวอร์จะตอบกลับ ด้วยคำตอบ SDP ที่มีคำอธิบายสื่อเสียงแบบส่งอย่างเดียว 3 รายการ

m=audio 19306 UDP/TLS/RTP/SAVPF 111
. . .
a=mid:0
. . .
a=sendonly
a=msid:virtual-6666 virtual-6666
. . .
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10;useinbandfec=1
. . .
m=audio 9 UDP/TLS/RTP/SAVPF 111
. . .
a=mid:1
. . .
a=sendonly
a=msid:virtual-6667 virtual-6667
. . .
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10;useinbandfec=1
. . .
m=audio 9 UDP/TLS/RTP/SAVPF 111
. . .
a=mid:2
. . .
a=sendonly
a=msid:virtual-6668 virtual-6668
. . .
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10;useinbandfec=1
. . .

ตรวจสอบการติดตั้งใช้งาน Observer

อย่าลืมทำสำเนาข้อมูลเสียงหากย้ายการประมวลผลข้อมูลไปยัง เธรดอื่น AudioFrame.pcm16 เป็นข้อมูลอ้างอิงถึงข้อมูลพื้นฐาน ดังนั้นการพยายามเข้าถึงหลังจากOnAudioFrame จะทำให้เกิดลักษณะการทำงานที่ไม่ได้กำหนดไว้ เช่น ข้อผิดพลาดในการแบ่งส่วน

แก้ปัญหาเกี่ยวกับวิดีโอ

ส่วนต่อไปนี้จะช่วยแก้ปัญหาเกี่ยวกับวิดีโอในแอปได้

ตรวจสอบบันทึก

หากคุณใช้เว็บไคลเอ็นต์ในเบราว์เซอร์ Chrome ให้ทำดังนี้

  1. เปิดแท็บใหม่และป้อน chrome://webrtc-internals ลงในแถบที่อยู่
  2. ไปที่ส่วนที่มีป้ายกำกับว่า Stats graph for inbound-rtp
  3. ตรวจสอบกราฟของวิดีโอแต่ละรายการเพื่อดูว่าได้รับแพ็กเก็ตหรือไม่

หากคุณใช้ไคลเอ็นต์อ้างอิง C++ ให้ตรวจสอบว่ามีการเรียกใช้ OnVideoFrame หรือไม่

ยืนยันขอบเขต OAuth

ระบบจะส่งวิดีโอเฉพาะในกรณีที่ระบุขอบเขตที่เหมาะสมพร้อมกับคำขอเชื่อมต่อเริ่มต้น หากต้องการแก้ไขข้อผิดพลาด ให้ตรวจสอบว่าได้ระบุขอบเขต OAuth 2.0 ที่ถูกต้อง ดูข้อมูลเพิ่มเติมได้ที่ขอบเขตของ Meet Media API

ตรวจสอบว่าได้ตั้งค่าการประชุมอย่างถูกต้อง

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

    {"sessionStatus":{"connectionState":"STATE_JOINED"}}
    
  • ตรวจสอบว่ามีผู้เข้าร่วมการประชุมคนอื่นๆ ที่ไม่ได้ปิดเสียงสตรีมวิดีโอ

ตรวจสอบสัญญาณสำหรับวิดีโอ

Meet จะแสดงวิดีโอต่อเมื่อมีการส่งสัญญาณในข้อเสนอ SDP เท่านั้น ข้อเสนอต้องมีคำอธิบายสื่อวิดีโอแบบอ่านอย่างเดียวไม่เกิน 3 รายการ

v=0
o=- 4743178474630771513 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=extmap-allow-mixed
a=msid-semantic: WMS
. . .
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 35 36 37 38 102 103 104 105 106 107 108 109 127 125 39 40 41 42 43 44 45 46 47 48 112 113 114 115 116 117 118 49
. . .
a=setup:actpass
a=mid:1
. . .
a=recvonly
. . .
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
. . .

หาก Meet ได้รับข้อเสนอที่ถูกต้อง ระบบจะตอบกลับด้วยคำตอบ SDP ที่มีnคำอธิบายสื่อวิดีโอแบบส่งอย่างเดียว โดยที่ n คือจำนวนคำอธิบายสื่อวิดีโอ ในข้อเสนอ SDP

v=0
o=- 0 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS virtual-video-7777/7777
a=ice-lite
. . .
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99
. . .
a=setup:passive
a=mid:1
. . .
a=msid:virtual-video-7777/7777 virtual-video-7777/7777
a=rtcp-mux
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtcp-fb:96 goog-remb
. . .

แก้ปัญหาเมื่อไม่มีวิดีโอ

  • ตรวจสอบว่า m=video … มีอยู่ในข้อเสนอ SDP ที่ส่งไปยังเซิร์ฟเวอร์ Meet
  • ตรวจสอบว่า a=recvonly เป็นแอตทริบิวต์ภายใต้บรรทัด m=video ทุกบรรทัด
  • ตรวจสอบว่ามีบรรทัด m=video ในคำตอบ SDP เท่ากัน
  • ตรวจสอบว่า a=sendonly หรือ a=sendrecv เป็นแอตทริบิวต์ภายใต้บรรทัด m=video ทุกบรรทัดในคำตอบ SDP
  • ตรวจสอบว่าเซิร์ฟเวอร์ Meet ได้รับและส่งVideoAssignmentRequest เรียบร้อยแล้ว ควรแจ้งผลสำเร็จหรือล้มเหลวกลับไปยังไคลเอ็นต์ผ่านช่องทางข้อมูลเดียวกัน

แก้ปัญหาการสตรีมวิดีโอน้อยกว่าที่คาดไว้

  • ตรวจสอบว่าข้อเสนอ SDP มีจำนวนบรรทัด m=video … ที่ถูกต้อง
  • ตรวจสอบว่าคำอธิบาย m=video ทั้งหมดในคำตอบ SDP มีแอตทริบิวต์ a=sendonly หรือ a=sendrecv บรรทัดใดก็ตามที่ทำเครื่องหมาย a=recvonly ใน คำตอบจะลดจำนวนสตรีมที่ส่งไปยังไคลเอ็นต์ลงตามจำนวนนั้น

ตรวจสอบการติดตั้งใช้งาน Observer

อย่าลืมทำสำเนาข้อมูลวิดีโอหากย้ายการประมวลผลข้อมูลไปยัง เธรดอื่น VideoFrame.frame เป็นข้อมูลอ้างอิงถึงข้อมูลพื้นฐาน ดังนั้นการพยายามเข้าถึงหลังจากOnVideoFrame จะส่งผลให้เกิดลักษณะการทำงานที่ไม่ได้กำหนดไว้ เช่น ข้อผิดพลาดในการแบ่งส่วน