本指南提供操作說明,協助您解決常見的 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 逾時先前的連線。然後再試一次。 |
統一方案
如果資料通道從未開啟,且您從未收到音訊或視訊,請檢查設定本機對等互連時是否只使用統一方案。
媒體說明順序錯誤
使用工作階段描述通訊協定 (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 瀏覽器中使用網頁版用戶端:
- 開啟新分頁,然後在網址列中輸入
chrome://webrtc-internals
。 - 前往標示為
Stats graph for inbound-rtp
的部分。 - 檢查每個音訊圖表,確認是否收到封包。
如果您使用 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 瀏覽器中使用網頁版用戶端:
- 開啟新分頁,然後在網址列中輸入
chrome://webrtc-internals
。 - 前往標示為
Stats graph for inbound-rtp
的部分。 - 檢查每個影片圖表,確認是否收到封包。
如果您使用 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 …
。 - 確認
a=recvonly
是每個m=video
行底下的屬性。 - 確認 SDP 答案中存在相同數量的
m=video
行。 - 確認 SDP 回覆中每行
m=video
底下都有a=sendonly
或a=sendrecv
屬性。 - 確認已將成功的
VideoAssignmentRequest
傳送至 Meet 伺服器,且伺服器已收到。成功或失敗狀態應透過相同資料管道回報給用戶端。
排解影片串流數量低於預期的問題
- 確認 SDP 優惠包含正確數量的
m=video …
行。 - 請確保 SDP 答案中的所有
m=video
說明都包含a=sendonly
或a=sendrecv
屬性。答案中標示a=recvonly
的任何行,都會減少傳送至用戶端的串流數量。
檢查觀察器實作方式
如果將資料處理作業移至其他執行緒,請務必複製影片資料。VideoFrame.frame
實際上是參照基礎資料,因此嘗試在 OnVideoFrame
之後存取該資料,會導致未定義的行為,例如區隔錯誤。