이 가이드에서는 일반적인 Google Meet Media API 오류를 해결하는 방법을 설명합니다.
오류 코드 문제 해결하기
다음은 connectActiveConference
엔드포인트에서 반환된 오류 코드 문제를 해결하기 위한 팁입니다.
오류 코드 | |
---|---|
NO_ACTIVE_CONFERENCE |
Meet Media API 클라이언트가 인증된 사용자가 이미 회의 공간의 회의에 있는 후에만 연결을 시도하는지 확인합니다. |
INVALID_OFFER |
제품 요구사항을 검토하여 데이터가 필요한 채널을 여는 등 누락된 세부정보가 있는지 확인합니다. 앱의 제품 문자열을 제품 예시와 비교하고 차이점을 조사할 수도 있습니다. |
INCOMPATIBLE_DEVICE |
회의에 있는 기기 중 하나 이상이 Meet Media API 클라이언트와 호환되지 않습니다. 앱이 참여할 수 없으므로 최종 사용자에게 이를 알릴 수 있습니다. |
CONNECTIONS_EXHAUSTED |
한 번에 하나의 Meet Media API 클라이언트만 회의에 연결할 수 있습니다. 앱이 비정상 종료되면 다시 연결하려고 할 때 이 오류가 표시될 수 있습니다. 이 경우 Meet에서 이전 연결의 제한 시간이 될 때까지 약 30초 동안 기다립니다. 그런 다음 다시 시도해 보세요. |
통합 계획
데이터 채널이 열리지 않고 오디오나 동영상이 수신되지 않는 경우 로컬 피어 연결을 구성할 때 통합 계획만 사용되는지 확인합니다.
미디어 설명 순서 오류
세션 설명 프로토콜(SDP) 혜택으로 P2P 연결을 만들 때 다음 오류가 표시될 수 있습니다.
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);
// . . .
}
자바스크립트
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"}}
오디오 스트림이 음소거되지 않은 다른 회의 참여자가 있는지 확인합니다.
오디오 신호 확인
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 서버에서 유효한 오퍼를 수신하면 전송 전용 오디오 미디어 설명 3개가 포함된 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"}}
동영상 스트림이 음소거되지 않은 다른 회의 참여자가 있는지 확인합니다.
동영상 신호 확인
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에서 유효한 오퍼를 수신하면 n
개의 전송 전용 동영상 미디어 설명이 포함된 SDP 응답으로 응답합니다. 여기서 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
속성이 있는지 확인합니다. - Meet 서버로
VideoAssignmentRequest
가 전송되고 수신되었는지 확인합니다. 성공 또는 실패는 동일한 데이터 채널을 통해 클라이언트로 다시 전달되어야 합니다.
예상보다 적은 동영상 스트림 문제 해결
- SDP 제품에 올바른 수의
m=video …
행이 포함되어 있는지 확인합니다. - SDP 응답의 모든
m=video
설명에a=sendonly
또는a=sendrecv
속성이 포함되어 있는지 확인합니다. 대답에서a=recvonly
로 표시된 줄은 클라이언트로 전송되는 스트림의 양을 그만큼 줄입니다.
관찰자 구현 확인
데이터 처리를 다른 스레드로 이동하는 경우 동영상 데이터의 사본을 만들어야 합니다.
VideoFrame.frame
는 사실상 기본 데이터에 대한 참조이므로 OnVideoFrame
후에 액세스하려고 하면 세그먼트 오류와 같은 정의되지 않은 동작이 발생합니다.