이 가이드에서는 일반적인 Google Meet Media API 오류를 해결하는 방법을 설명합니다.
오류 코드 문제 해결
다음은 connectActiveConference
엔드포인트에서 반환된 오류 코드를 문제 해결하는 팁입니다.
오류 코드 | |
---|---|
NO_ACTIVE_CONFERENCE |
Meet Media API 클라이언트는 인증된 사용자가 이미 회의 스페이스의 컨퍼런스에 있는 경우에만 연결을 시도해야 합니다. 회의 시작을 폴링하는 경우 회의 시작 이벤트를 대신 사용하세요. |
INVALID_OFFER |
혜택 요구사항을 읽고 필요한 데이터 채널 열기 등 누락된 세부정보가 있는지 확인합니다. 앱의 혜택 문자열을 혜택 예시와 비교하여 차이점을 조사할 수도 있습니다. |
INCOMPATIBLE_DEVICE |
회의의 하나 이상의 기기가 Meet 미디어 API 클라이언트와 호환되지 않습니다. 앱이 참여할 수 없으므로 최종 사용자에게 이를 알릴 수 있습니다. 기기와 호환되지 않는 이유는 기기와 연결된 계정이 미성년자로 간주되는 경우를 포함합니다. 자세한 내용은 최종 사용자 요구사항을 참고하세요. |
UNSUPPORTED_PLATFORM_PRESENT |
회의의 하나 이상의 기기가 Meet 미디어 API 클라이언트와 호환되지 않습니다. 앱이 참여할 수 없으므로 최종 사용자에게 이를 알릴 수 있습니다. 지원되지 않는 플랫폼의 이유로는 모바일 앱이 모바일 앱 최소 버전을 충족하지 않는 경우와 지원되지 않는 플랫폼에서 참여하는 경우가 있습니다. 자세한 내용은 최종 사용자 요구사항을 참고하세요. |
CONNECTIONS_EXHAUSTED |
한 번에 하나의 Meet 미디어 API 클라이언트만 회의에 연결할 수 있습니다. 앱이 비정상 종료되면 다시 연결을 시도할 때 이 오류가 표시될 수 있습니다. 이 경우 Meet에서 이전 연결이 제한 시간 초과될 때까지 약 30초 동안 기다립니다. 그런 다음 다시 시도해 보세요. |
CONSENTER_ABSENT |
회의에 동의 요건을 충족하는 사용자가 없습니다. 소비자 소유 회의의 경우 시작자가 회의에 있는지 확인합니다. 작업공간 소유자 회의의 경우 회의를 소유한 조직 구성원이 한 명 이상 있어야 합니다. 자세한 내용은 동의자 요구사항을 참고하세요. |
DISABLED_BY_ADMIN |
관리자가 조직의 Meet 미디어 API를 사용 중지했습니다. 이 경우 회의가 진행되는 동안에는 변경할 수 없습니다. 자세한 내용은 Meet Media API lifecycle의 그림 3을 참고하세요. |
DISABLED_BY_HOST_CONROL |
호스트가 회의에서 Meet Media API를 사용 중지했습니다. 앱이 참여할 수 없으므로 최종 사용자에게 이를 알릴 수 있습니다. 자세한 내용은 미디어 API 수명 주기 알아보기의 그림 5를 참고하세요. |
DISABLED_DUE_TO_WATERMARKING |
워터마크가 사용 설정되면 Meet Media API가 회의에 참여할 수 없습니다. 최종 사용자에게 이 사실을 알릴 수 있습니다. 자세한 내용은 Meet Media API 수명 주기의 그림 2를 참고하세요. |
DISABLED_DUE_TO_ENCRYPTION |
암호화가 사용 설정되면 Meet Media API가 회의에 참여할 수 없습니다. Meet 통화 중에는 변경할 수 없습니다. 최종 사용자에게 이 사실을 알릴 수 있습니다. 자세한 내용은 Meet Media API 수명 주기의 그림 2를 참고하세요. |
통합 요금제
데이터 채널이 열리지 않고 오디오나 동영상이 수신되지 않으면 로컬 피어 연결을 구성할 때 통합 계획만 사용되는지 확인하세요.
미디어 설명 순서 오류
세션 설명 프로토콜(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 미디어 API 범위를 참고하세요.
회의가 올바르게 설정되었는지 확인
클라이언트가 Google Meet 서버에 연결되면 회의에 자동으로 참여할 수 없습니다.
STATE_JOINED
상태의 세션 제어 리소스 업데이트가 세션 제어 데이터 채널을 통해 수신되었는지 확인합니다.{"sessionStatus":{"connectionState":"STATE_JOINED"}}
오디오 스트림이 음소거되지 않은 다른 회의 참여자가 있는지 확인합니다.
오디오 신호 확인
SDP 제안에서 이를 신호로 보내는 경우에만 Meet에서 오디오를 제공합니다. 혜택에 수신 전용 오디오 미디어 설명이 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 미디어 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
속성이 있는지 확인합니다. - 성공적인
VideoAssignmentRequest
이 Meet 서버로 전송되고 Meet 서버에서 수신되었는지 확인합니다. 성공 또는 실패는 동일한 데이터 채널을 통해 클라이언트에 다시 전달해야 합니다.
예상보다 적은 동영상 스트림 문제 해결
- SDP 제안에 올바른 수의
m=video …
줄이 포함되어 있는지 확인합니다. - SDP 답변의 모든
m=video
설명에a=sendonly
또는a=sendrecv
속성이 포함되어 있는지 확인합니다. 답변에서a=recvonly
로 표시된 줄은 클라이언트에 전송되는 스트림의 양을 그만큼 줄입니다.
관찰자 구현 확인
데이터 처리를 다른 스레드로 이동하는 경우 동영상 데이터의 사본을 만들어야 합니다.
VideoFrame.frame
은 기본 데이터를 참조하므로 OnVideoFrame
후에 액세스하려고 하면 세그먼트 오류와 같은 정의되지 않은 동작이 발생합니다.