排解及修正 Meet Media API 錯誤

本指南提供如何解決常見 Google Meet Media API 錯誤的操作說明。

排解錯誤代碼

以下是排解 connectActiveConference 端點傳回的錯誤代碼的提示:

錯誤代碼
NO_ACTIVE_CONFERENCE 請確認 Meet Media API 用戶端只會在經過驗證的使用者已在 會議空間會議中出現後,才嘗試連線。
INVALID_OFFER 詳閱優惠規定,檢查是否缺少任何詳細資料,例如開啟資料所需的管道。您也可以將應用程式的優惠字串與示例優惠進行比較,並調查任何差異。
INCOMPATIBLE_DEVICE 會議中有一或多部裝置與 Meet Media API 用戶端不相容。您的應用程式將無法加入,因此您可能需要向使用者說明這點。
CONNECTIONS_EXHAUSTED 一次只能有一個 Meet Media API 用戶端連線至會議。如果應用程式發生當機,當應用程式嘗試重新連線時,您可能會看到這則錯誤訊息。在這種情況下,請等待約 30 秒,讓 Meet 逾時終止先前的連線。然後再試一次。

統一方案

如果資料管道從未開啟,且您從未收到音訊或視訊,請確認在設定本機對等端連線時,只使用統一計畫

媒體說明書訂購錯誤

使用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].

如果未為 SDP 提案中的所有媒體說明正確設定 a=setup:< > 屬性,就會發生這個錯誤。

如要修正這個錯誤,請確認 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"}}
    
  • 確認其他會議參與者的音訊串流是否未設為靜音。

確認音訊訊號

只有在 SDP 提供中傳送這項信號時,Meet 才會提供音訊。優惠中必須存在三個僅供接收的音訊媒體說明

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 答案,其中包含三個僅供傳送的音訊媒體描述。

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"}}
    
  • 確認其他會議參與者的視訊串流是否已設為靜音。

確認影片信號

只有在 SDP 提供內容中傳送信號時,Meet 才會提供影片。商品中最多只能包含三個僅供接收的影片媒體說明。

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

排解沒有影片的問題

  • 請確認傳送至 Meet 伺服器的 SDP 提案中是否有 m=video …
  • 確認每個 m=video 行下方都有 a=recvonly 屬性。
  • 請確認 SDP 回應中存在相同數量的 m=video 行。
  • 確認 SDP 回應中每個 m=video 行下方的屬性為 a=sendonlya=sendrecv
  • 確認 Meet 伺服器已成功傳送及接收 VideoAssignmentRequest。成功或失敗應透過相同的資料管道傳回至用戶端。

排解影片串流數量低於預期的問題

  • 確認 SDP 優惠包含正確數量的 m=video … 行。
  • 請確認 SDP 答案中的所有 m=video 說明都包含 a=sendonlya=sendrecv 屬性。在答案中標示 a=recvonly 的任何行,都會減少傳送至用戶端的串流數量。

檢查觀察器實作

如果您將資料處理作業移至其他執行緒,請務必複製影片資料。VideoFrame.frame 實際上是基礎資料的參照,因此在 OnVideoFrame 之後嘗試存取該資料,會導致未定義的行為,例如分割錯誤。