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

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

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

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

รหัสข้อผิดพลาด
NO_ACTIVE_CONFERENCE ตรวจสอบว่าไคลเอ็นต์ Meet Media API จะพยายามเชื่อมต่อหลังจากที่ผู้ใช้ที่ตรวจสอบสิทธิ์แล้วเข้าร่วมการประชุมในพื้นที่การประชุมแล้วเท่านั้น
INVALID_OFFER อ่านข้อกำหนดของข้อเสนอเพื่อตรวจสอบรายละเอียดที่ขาดหายไป เช่น ช่องทางที่ต้องเปิดเพื่อส่งข้อมูล นอกจากนี้ คุณยังเปรียบเทียบสตริงข้อเสนอของแอปกับตัวอย่างข้อเสนอและตรวจสอบความแตกต่างได้ด้วย
INCOMPATIBLE_DEVICE อุปกรณ์อย่างน้อย 1 เครื่องในการประชุมใช้ร่วมกับไคลเอ็นต์ Meet Media API ไม่ได้ แอปของคุณจะเข้าร่วมไม่ได้ คุณจึงควรแจ้งเรื่องนี้ให้ผู้ใช้ปลายทางทราบ
CONNECTIONS_EXHAUSTED มีเพียงไคลเอ็นต์ Meet Media API เพียงรายเดียวเท่านั้นที่เชื่อมต่อกับการประชุมได้ในแต่ละครั้ง หากแอปขัดข้อง คุณอาจเห็นข้อผิดพลาดนี้หากแอปพยายามเชื่อมต่ออีกครั้ง ในกรณีนี้ ให้รอประมาณ 30 วินาทีเพื่อให้ Meet หมดเวลาการเชื่อมต่อก่อนหน้า แล้วลองอีกครั้ง

แผนแบบรวม

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

ข้อผิดพลาดเกี่ยวกับลําดับคําอธิบายสื่อ

เมื่อสร้างการเชื่อมต่อแบบ peer-to-peer ด้วยข้อเสนอ 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

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

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

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
. . .

ตรวจสอบการติดตั้งใช้งานเครื่องมือตรวจสอบ

อย่าลืมทำสำเนาข้อมูลเสียงหากคุณย้ายการประมวลผลข้อมูลไปยังชุดข้อความอื่น 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 ในคําตอบจะลดจํานวนสตรีมที่ส่งไปยังไคลเอ็นต์ลงตามจํานวนนั้น

ตรวจสอบการติดตั้งใช้งานเครื่องมือวัด

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