다음을 통해 공유


사용자 대상 진단

Azure Communication Services에서 호출을 사용할 때 고객에게 영향을 미치는 문제가 발생할 수 있습니다. 이 문제 해결을 돕기 위해, Azure Communication Services는 호출의 다양한 속성을 검사하여 문제가 무엇인지 확인할 수 있는 "UFD(사용자 연결 진단)"이라는 기능을 제공합니다. 사용자 연결 진단은 사용자 환경이 불량할 수 있는 기본 문제(예: 네트워크 불량, 사용자가 마이크 음소거)로 인해 발생할 수 있는 이벤트입니다. 사용자 연결 진단이 실행된 후, 최종 사용자에게 기본 문제가 있을 수 있다는 피드백을 제공하는 것이 좋습니다. 그러나 사용자 연결 진단 출력은 정보만 제공하며, 호출 스택은 실행되는 사용자 연결 진단을 기반으로 변경 작업을 수행하지 않습니다.

진단 값

다음과 같은 사용자 대상 진단을 사용할 수 있습니다.

네트워크 값

이름 설명 사용 가능한 값: 사용 사례 완화 단계
noNetwork 사용 가능한 네트워크가 없습니다. - 사용 가능한 네트워크가 없어서 호출을 시작할 수 없으면 True로 설정됩니다.
- ICE 후보가 있는 경우 False로 설정됩니다.
디바이스가 네트워크에 연결되지 않았습니다. 통화에 음성 통화를 유지할 수 있는 신뢰 가능한 인터넷 연결이 있는지 확인합니다. 자세한 내용은 네트워크 최적화 섹션을 참조하세요.
networkRelaysNotReachable 네트워크에 문제가 있습니다. - 네트워크에 Azure Communication Services 릴레이에 연결하도록 허용하지 않는 제약 조건이 있으면 True로 설정됩니다.
- 새 호출 시 False로 설정됩니다.
호출하는 동안 WiFi 신호가 켜지고 꺼질 때 방화벽 규칙 및 네트워크 라우팅을 통해 클라이언트가 Microsoft 턴 서버에 연결할 수 있는지 확인합니다. 자세한 내용은 방화벽 구성 섹션을 참조하세요.
networkReconnect 연결이 끊어졌으며 네트워크에 다시 연결하고 있습니다. - 네트워크 연결이 끊어지면 Bad로 설정됩니다.
- 미디어 전송 연결이 끊어지면 Poor로 설정됩니다.
- 새 세션이 연결되면 Good으로 설정됩니다.
낮은 대역폭, 인터넷 없음 통화에 음성 통화를 유지할 수 있는 신뢰 가능한 인터넷 연결이 있는지 확인합니다. 자세한 내용은 네트워크 대역폭 요구 사항 섹션을 참조하세요.
networkReceiveQuality 들어오는 스트림 품질에 대한 표시기입니다. - 스트림을 받는 데 심각한 문제가 있으면 Bad로 설정됩니다.
- 스트림을 받는 데 경미한 문제가 있으면 Poor로 설정됩니다.
- 스트림을 받는 데 문제가 없으면 Good으로 설정됩니다.
낮은 대역폭 통화에 음성 통화를 유지할 수 있는 신뢰 가능한 인터넷 연결이 있는지 확인합니다. 자세한 내용은 네트워크 대역폭 요구 사항 섹션을 참조하세요. 가용 인터넷 대역폭을 절약할 수 있도록 최종 사용자에게 카메라를 끄는 것이 좋겠다고 제안합니다.
networkSendQuality 들어오는 스트림 품질에 대한 표시기입니다. - 스트림을 보내는 데 심각한 문제가 있으면 Bad로 설정됩니다.
- 스트림을 보내는 데 경미한 문제가 있으면 Poor로 설정됩니다.
- 스트림을 보내는 데 문제가 없으면 Good으로 설정됩니다.
낮은 대역폭 통화에 음성 통화를 유지할 수 있는 신뢰 가능한 인터넷 연결이 있는지 확인합니다. 자세한 내용은 네트워크 대역폭 요구 사항 섹션을 참조하세요. 또한 가용 인터넷 대역폭을 절약할 수 있도록 최종 사용자에게 카메라를 끄는 것이 좋겠다고 제안합니다.

오디오 값

이름 설명 사용 가능한 값: 사용 사례 완화 단계
noSpeakerDevicesEnumerated 사용자 시스템에 오디오 출력 디바이스(스피커)가 없습니다. - 시스템에 스피커 디바이스가 없고 스피커 선택이 지원되는 경우 True로 설정됩니다.
- 시스템에 스피커 디바이스가 1개 이상 있고 스피커를 선택할 수 있으면 False로 설정됩니다.
모든 스피커가 플러그가 뽑혀 있습니다. 값이 True로 설정된 경우 최종 사용자에게 현재 통화 세션에 사용할 수 있는 스피커가 없다는 시각적 알림을 제공하는 것이 좋습니다.
speakingWhileMicrophoneIsMuted 음소거 상태에서 말합니다. - 로컬 마이크가 음소거되고 로컬 사용자가 말하는 경우 True로 설정됩니다.
- 로컬 사용자가 말하기를 중지하거나 마이크를 음소거 해제할 때 False로 설정됩니다.
* 참고: 현재 이 옵션은 오디오 수준 샘플이 WebRTC 통계에서 가져온 것이므로 Safari에서 지원되지 않습니다.
통화하는 동안 마이크를 음소거하고 마이크에 대고 말합니다. 값이 True로 설정된 경우 최종 사용자에게 대화 중이며 오디오가 음소거되었다는 점을 모를 수 있다는 시각적 알림을 제공하는 것이 좋습니다.
noMicrophoneDevicesEnumerated 사용자 시스템에 오디오 캡처 디바이스(마이크)가 없습니다. - 시스템에 마이크 디바이스가 없는 경우 True로 설정됩니다.
- 시스템에 마이크 디바이스가 1개 이상 있으면 False로 설정됩니다.
모든 마이크는 통화 중에 연결이 끊어집니다. 값이 True로 설정된 경우 최종 사용자에게 현재 통화 세션에 마이크가 없다는 시각적 알림을 제공하는 것이 좋습니다. 자세한 내용은 디바이스 관리자에서 마이크를 사용하도록 설정 섹션을 참조하세요.
microphoneNotFunctioning 마이크가 작동하지 않습니다. - 마이크 디바이스가 시스템에서 사용하지 않도록 설정되었거나 다른 프로세스에서 사용되고 있기 때문에 로컬 오디오 스트림 전송을 시작하지 못한 경우 True로 설정됩니다. 이 UFD가 발생하는 데 약 10초가 걸립니다.
- 마이크가 오디오 스트림을 다시 성공적으로 보내기 시작하면 False로 설정됩니다.
마이크를 사용할 수 없습니다. 시스템에서 마이크 액세스가 사용하지 않도록 설정되었습니다. 값이 True로 설정된 경우 최종 사용자에게 마이크에 문제가 있다는 시각적 알림을 제공합니다.
microphoneMuteUnexpectedly 마이크가 음소거되었습니다. - 마이크가 예기치 않게 음소거 상태가 되면 True로 설정됩니다.
- 마이크가 오디오 스트림을 성공적으로 보내기 시작하면 False로 설정됩니다.
마이크가 시스템에서 음소거되었습니다. 대부분의 경우는 사용자가 모바일 디바이스에서 Azure Communication Services 통화 중이며 전화가 걸려올 때 발생합니다. 대부분의 경우 운영 체제는 사용자가 전화를 받을 수 있도록 Azure Communication Services 통화를 음소거합니다. 값이 True로 설정된 경우 최종 사용자에게 전화가 걸려왔기 때문에 통화가 음소거되었다는 시각적 알림을 제공합니다. 자세한 내용은 OS에서 Azure Communication Services 통화를 음소거 섹션을 참조하세요.
microphonePermissionDenied 디바이스의 볼륨이 낮거나 macOS에서 거의 무음입니다. - 시스템 설정(오디오)에서 오디오 권한이 거부되면 True로 설정됩니다.
- 스트림이 성공적으로 획득되면 False로 설정됩니다.
참고: 이 진단은 macOS에서만 작동합니다.
설정에서 마이크 사용 권한이 사용하지 않도록 설정되었습니다. 값이 True로 설정된 경우 최종 사용자에게 Azure Communication Services 통화에 마이크를 사용할 수 있는 권한을 사용하지 않았다는 시각적 알림을 제공합니다.

카메라 값

이름 설명 사용 가능한 값: 사용 사례 완화 단계
cameraFreeze 카메라가 5초 넘게 프레임 생성을 중지합니다. - 로컬 비디오 스트림이 중지된 경우 True로 설정합니다. 이 진단은 원격 쪽 사용자가 화면에서 중지된 비디오를 보거나 원격 참가자의 화면에서 비디오가 렌더링되지 않음을 의미합니다.
- 중지가 끝나고 사용자가 정상적으로 비디오를 볼 수 있는 경우 False로 설정됩니다.
통화 중에 카메라가 연결이 끊어지거나 네트워크에 문제가 생겨 카메라가 중지되었습니다. 값이 True로 설정된 경우 최종 사용자에게 원격 참가자 네트워크가 좋지 않을 수 있다는 알림을 제공하는 것을 고려하고 대역폭을 절약하기 위해 카메라를 끄도록 제안할 수 있습니다. 자세한 내용은 Azure Communication Services 통화에 필요한 인터넷 기능에 대한 네트워크 대역폭 요구 사항 섹션을 참조하세요.
cameraStartFailed 일반 카메라 오류입니다. - 카메라 디바이스가 시스템에서 사용하지 않도록 설정되었거나 다른 프로세스에서 사용되고 있기 때문에 로컬 비디오 전송을 시작하지 못한 경우 True로 설정됩니다.
- 선택한 카메라 디바이스가 로컬 비디오를 다시 보낼 경우 False로 설정됩니다.
카메라 오류 값이 True로 설정된 경우 최종 사용자에게 카메라가 시작되지 않는다는 시각적 알림을 제공합니다.
cameraStartTimedOut 카메라가 잘못된 상태인 일반적인 시나리오입니다. - 카메라 디바이스가 비디오 스트림 전송을 시작하는 동안 시간이 초과될 경우 True로 설정됩니다.
- 선택한 카메라 디바이스가 로컬 비디오를 다시 보낼 경우 False로 설정됩니다.
카메라 오류 값이 True로 설정된 경우 최종 사용자에게 카메라에 문제가 있을 수 있다는 시각적 알림을 제공합니다. (알림 제거를 위해 값이 False로 다시 설정된 경우).
cameraPermissionDenied 설정에서 카메라 사용 권한이 거부되었습니다. - 시스템 설정(비디오)에서 카메라 권한이 거부되면 True로 설정됩니다.
- 스트림이 성공적으로 획득되면 False로 설정됩니다.
참고: 이 진단은 macOS Chrome에서만 작동합니다.
설정에서 카메라 사용 권한이 사용하지 않도록 설정되었습니다. 값이 True로 설정된 경우 최종 사용자에게 Azure Communication Services 호출에 카메라를 사용할 수 있는 권한을 사용하지 않았다는 시각적 알림을 제공합니다.
cameraStoppedUnexpectedly 카메라 오작동 - 마이크가 예기치 않게 음소거 상태가 되면 True로 설정됩니다.
- 마이크가 오디오 스트림을 다시 성공적으로 보내기 시작하면 False로 설정됩니다.
카메라가 제대로 작동하는지 확인합니다. 값이 True로 설정된 경우 최종 사용자에게 카메라에 문제가 있을 수 있다는 시각적 알림을 제공합니다. (알림 제거를 위해 값이 False로 다시 설정된 경우).

기타 값

이름 설명 사용 가능한 값: 사용 사례 완화 단계
screenshareRecordingDisabled 설정의 기본 설정에서 시스템 화면 공유가 거부되었습니다. - 시스템 설정(공유)에서 화면 공유 권한이 거부되면 True로 설정됩니다.
- 스트림이 성공적으로 획득되면 False로 설정됩니다.
참고: 이 진단은 macOS.Chrome에서만 작동합니다.
설정에서 화면 녹화가 사용하지 않도록 설정되었습니다. 값이 True로 설정된 경우 최종 사용자에게 Azure Communication Services 통화에 대한 화면을 공유할 수 있는 권한을 사용하지 않았다는 시각적 알림을 제공합니다.
capturerStartFailed 시스템 화면 공유에 실패했습니다. - 화면 캡처를 시작하지 못하면 True로 설정됩니다.
- 화면 캡처가 성공적으로 시작되면 False로 설정됩니다.
값이 True로 설정된 경우 최종 사용자에게 화면 공유에 문제가 있을 수 있다는 시각적 알림을 제공합니다. (알림 제거를 위해 값이 False로 다시 설정된 경우).
capturerStoppedUnexpectedly 시스템 화면 공유 오작동 - 화면 캡처가 예기치 않게 중지됨 상태가 되면 True로 설정됩니다.
- 화면 캡처가 성공적으로 다시 캡처하기 시작하면 False로 설정됩니다.
화면 공유가 올바르게 작동하는지 확인 값이 True로 설정된 경우 최종 사용자에게 화면 공유를 중지하는 문제가 있을 수 있다는 시각적 알림을 제공합니다. (알림 제거를 위해 값이 False로 다시 설정된 경우).

진단 액세스

사용자 대상 진단은 핵심 Call API의 확장된 기능으로, 활성 호출을 진단할 수 있도록 합니다.

const userFacingDiagnostics = call.feature(Features.UserFacingDiagnostics);

사용자 대상 진단 이벤트

  • 통화 진단이 변경될 때를 모니터링하기 위해 diagnosticChanged 이벤트를 구독합니다.
/**
 *  Each diagnostic has the following data:
 * - diagnostic is the type of diagnostic, e.g. NetworkSendQuality, DeviceSpeakWhileMuted, etc...
 * - value is DiagnosticQuality or DiagnosticFlag:
 *     - DiagnosticQuality = enum { Good = 1, Poor = 2, Bad = 3 }.
 *     - DiagnosticFlag = true | false.
 * - valueType = 'DiagnosticQuality' | 'DiagnosticFlag'
 */
const diagnosticChangedListener = (diagnosticInfo: NetworkDiagnosticChangedEventArgs | MediaDiagnosticChangedEventArgs) => {
    console.log(`Diagnostic changed: ` +
        `Diagnostic: ${diagnosticInfo.diagnostic}` +
        `Value: ${diagnosticInfo.value}` +
        `Value type: ${diagnosticInfo.valueType}`);

    if (diagnosticInfo.valueType === 'DiagnosticQuality') {
        if (diagnosticInfo.value === DiagnosticQuality.Bad) {
            console.error(`${diagnosticInfo.diagnostic} is bad quality`);

        } else if (diagnosticInfo.value === DiagnosticQuality.Poor) {
            console.error(`${diagnosticInfo.diagnostic} is poor quality`);
        }

    } else if (diagnosticInfo.valueType === 'DiagnosticFlag') {
        if (diagnosticInfo.value === true) {
            console.error(`${diagnosticInfo.diagnostic}`);
        }
    }
};

userFacingDiagnostics.network.on('diagnosticChanged', diagnosticChangedListener);
userFacingDiagnostics.media.on('diagnosticChanged', diagnosticChangedListener);

최신 사용자 대상 진단 가져오기

  • 발생한 최신 통화 진단 값을 가져옵니다. 진단이 정의되지 않은 경우 절대 발생하기 않기 때문입니다.
const latestNetworkDiagnostics = userFacingDiagnostics.network.getLatest();

console.log(
  `noNetwork: ${latestNetworkDiagnostics.noNetwork.value}, ` +
    `value type = ${latestNetworkDiagnostics.noNetwork.valueType}`
);

console.log(
  `networkReconnect: ${latestNetworkDiagnostics.networkReconnect.value}, ` +
    `value type = ${latestNetworkDiagnostics.networkReconnect.valueType}`
);

console.log(
  `networkReceiveQuality: ${latestNetworkDiagnostics.networkReceiveQuality.value}, ` +
    `value type = ${latestNetworkDiagnostics.networkReceiveQuality.valueType}`
);

const latestMediaDiagnostics = userFacingDiagnostics.media.getLatest();

console.log(
  `speakingWhileMicrophoneIsMuted: ${latestMediaDiagnostics.speakingWhileMicrophoneIsMuted.value}, ` +
    `value type = ${latestMediaDiagnostics.speakingWhileMicrophoneIsMuted.valueType}`
);

console.log(
  `cameraStartFailed: ${latestMediaDiagnostics.cameraStartFailed.value}, ` +
    `value type = ${latestMediaDiagnostics.cameraStartFailed.valueType}`
);

console.log(
  `microphoneNotFunctioning: ${latestMediaDiagnostics.microphoneNotFunctioning.value}, ` +
    `value type = ${latestMediaDiagnostics.microphoneNotFunctioning.valueType}`
);

진단 값

다음과 같은 사용자 대상 진단을 사용할 수 있습니다.

네트워크 값

이름 설명 사용 가능한 값: 사용 사례 완화 단계
networkUnavailable 사용 가능한 네트워크가 없습니다. - 사용 가능한 네트워크가 없어서 호출을 시작할 수 없으면 True로 설정됩니다.
- ICE 후보가 있는 경우 False로 설정됩니다.
디바이스가 네트워크에 연결되지 않았습니다. 통화에 음성 통화를 유지할 수 있는 신뢰 가능한 인터넷 연결이 있는지 확인합니다. 자세한 내용은 네트워크 최적화 섹션을 참조하세요.
networkRelaysUnreachable 네트워크에 문제가 있습니다. - 네트워크에 Azure Communication Services 릴레이에 연결하도록 허용하지 않는 제약 조건이 있으면 True로 설정됩니다.
- 새 호출 시 False로 설정됩니다.
호출하는 동안 WiFi 신호가 켜지고 꺼질 때 방화벽 규칙 및 네트워크 라우팅을 통해 클라이언트가 Microsoft 턴 서버에 연결할 수 있는지 확인합니다. 자세한 내용은 방화벽 구성 섹션을 참조하세요.
networkReconnectionQuality 연결이 끊어졌으며 네트워크에 다시 연결하고 있습니다. - 네트워크 연결이 끊어지면 Bad로 설정됩니다.
- 미디어 전송 연결이 끊어지면 Poor로 설정됩니다.
- 새 세션이 연결되면 Good으로 설정됩니다.
낮은 대역폭, 인터넷 없음 통화에 음성 통화를 유지할 수 있는 신뢰 가능한 인터넷 연결이 있는지 확인합니다. 자세한 내용은 네트워크 대역폭 요구 사항 섹션을 참조하세요.
networkReceiveQuality 들어오는 스트림 품질에 대한 표시기입니다. - 스트림을 받는 데 심각한 문제가 있으면 Bad로 설정됩니다.
- 스트림을 받는 데 경미한 문제가 있으면 Poor로 설정됩니다.
- 스트림을 받는 데 문제가 없으면 Good으로 설정됩니다.
- 통화에 활성 오디오 흐름이 있는 경우에만, 즉 참가자가 일정 기간 동안 적극적으로 말하는 경우에만 표시됩니다.
낮은 대역폭 통화에 음성 통화를 유지할 수 있는 신뢰 가능한 인터넷 연결이 있는지 확인합니다. 자세한 내용은 네트워크 대역폭 요구 사항 섹션을 참조하세요. 가용 인터넷 대역폭을 절약할 수 있도록 최종 사용자에게 카메라를 끄는 것이 좋겠다고 제안합니다.
networkSendQuality 들어오는 스트림 품질에 대한 표시기입니다. - 스트림을 보내는 데 심각한 문제가 있으면 Bad로 설정됩니다.
- 스트림을 보내는 데 경미한 문제가 있으면 Poor로 설정됩니다.
- 스트림을 보내는 데 문제가 없으면 Good으로 설정됩니다.
- 수신 품질 진단과 비슷하게 통화에 활성 오디오 흐름이 있는 경우에만, 즉 참가자가 일정 기간 동안 적극적으로 말하는 경우에만 표시됩니다. 그러나 품질을 확인하기 위해 다른 쪽의 정보를 사용하기 때문에 1:1 통화에서만 작동합니다. 다른 쪽에서 수신한 데이터를 보내야 합니다.
낮은 대역폭 통화에 음성 통화를 유지할 수 있는 신뢰 가능한 인터넷 연결이 있는지 확인합니다. 자세한 내용은 네트워크 대역폭 요구 사항 섹션을 참조하세요. 또한 가용 인터넷 대역폭을 절약할 수 있도록 최종 사용자에게 카메라를 끄는 것이 좋겠다고 제안합니다.

오디오 값

이름 설명 사용 가능한 값: 사용 사례 완화 단계
noSpeakerDevicesAvailable 사용자 시스템에 오디오 출력 디바이스(스피커)가 없습니다. - 시스템에 스피커 디바이스가 없고 스피커 선택이 지원되는 경우 True로 설정됩니다.
- 시스템에 스피커 디바이스가 1개 이상 있고 스피커를 선택할 수 있으면 False로 설정됩니다.
모든 스피커가 플러그가 뽑혀 있습니다. 값이 True로 설정된 경우 최종 사용자에게 현재 통화 세션에 사용할 수 있는 스피커가 없다는 시각적 알림을 제공하는 것이 좋습니다.
speakingWhileMicrophoneIsMuted 음소거 상태에서 말합니다. - 로컬 마이크가 음소거되고 로컬 사용자가 말하는 경우 True로 설정됩니다.
- 로컬 사용자가 말하기를 중지하거나 마이크를 음소거 해제할 때 False로 설정됩니다.
- 노이즈를 방지하고 보다 나은 사용자 환경을 제공하기 위해 사용자 작업 없이 일정 시간 동안 트리거되는 경우 이 진단 이벤트를 자동으로 사용하지 않도록 설정할 수 있습니다. 새 음소거 작업이 발생하면 다시 사용하도록 설정됩니다.
통화하는 동안 마이크를 음소거하고 마이크에 대고 말합니다. 값이 True로 설정된 경우 최종 사용자에게 대화 중이며 오디오가 음소거되었다는 점을 모를 수 있다는 시각적 알림을 제공하는 것이 좋습니다.
noMicrophoneDevicesAvailable 사용자 시스템에 오디오 캡처 디바이스(마이크)가 없습니다. - 시스템에 마이크 디바이스가 없는 경우 True로 설정됩니다.
- 시스템에 마이크 디바이스가 1개 이상 있으면 False로 설정됩니다.
모든 마이크는 통화 중에 연결이 끊어집니다. 값이 True로 설정된 경우 최종 사용자에게 현재 통화 세션에 마이크가 없다는 시각적 알림을 제공하는 것이 좋습니다. 자세한 내용은 디바이스 관리자에서 마이크를 사용하도록 설정 섹션을 참조하세요.
microphoneNotFunctioning 마이크가 작동하지 않습니다. - 마이크 디바이스가 시스템에서 사용하지 않도록 설정되었거나 다른 프로세스에서 사용되고 있기 때문에 로컬 오디오 스트림 전송을 시작하지 못한 경우 True로 설정됩니다. 이 UFD가 발생하는 데 약 10초가 걸립니다.
- 마이크가 오디오 스트림을 다시 성공적으로 보내기 시작하면 False로 설정됩니다.
마이크를 사용할 수 없습니다. 시스템에서 마이크 액세스가 사용하지 않도록 설정되었습니다. 값이 True로 설정된 경우 최종 사용자에게 마이크에 문제가 있다는 시각적 알림을 제공합니다.
microphoneMuteUnexpectedly 마이크가 음소거되었습니다. - 마이크가 예기치 않게 음소거 상태가 되면 True로 설정됩니다.
- 마이크가 오디오 스트림을 성공적으로 보내기 시작하면 False로 설정됩니다.
마이크가 시스템에서 음소거되었습니다. 대부분의 경우는 사용자가 모바일 디바이스에서 Azure Communication Services 통화 중이며 전화가 걸려올 때 발생합니다. 대부분의 경우 운영 체제는 사용자가 전화를 받을 수 있도록 Azure Communication Services 통화를 음소거합니다. 값이 True로 설정된 경우 최종 사용자에게 전화가 걸려왔기 때문에 통화가 음소거되었다는 시각적 알림을 제공합니다. 자세한 내용은 OS에서 Azure Communication Services 통화를 음소거 섹션을 참조하세요.
microphonePermissionDenied 디바이스의 볼륨이 낮거나 macOS에서 거의 무음입니다. - 시스템 설정(오디오)에서 오디오 권한이 거부되면 True로 설정됩니다.
- 스트림이 성공적으로 획득되면 False로 설정됩니다.
참고: 이 진단은 macOS에서만 작동합니다.
설정에서 마이크 사용 권한이 사용하지 않도록 설정되었습니다. 값이 True로 설정된 경우 최종 사용자에게 Azure Communication Services 통화에 마이크를 사용할 수 있는 권한을 사용하지 않았다는 시각적 알림을 제공합니다.

카메라 값

이름 설명 사용 가능한 값: 사용 사례 완화 단계
cameraFrozen 카메라가 5초 넘게 프레임 생성을 중지합니다. - 로컬 비디오 스트림이 중지된 경우 True로 설정합니다. 이 진단은 원격 쪽 사용자가 화면에서 중지된 비디오를 보거나 원격 참가자의 화면에서 비디오가 렌더링되지 않음을 의미합니다.
- 중지가 끝나고 사용자가 정상적으로 비디오를 볼 수 있는 경우 False로 설정됩니다.
통화 중에 카메라가 연결이 끊어지거나 네트워크에 문제가 생겨 카메라가 중지되었습니다. 값이 True로 설정된 경우 최종 사용자에게 원격 참가자 네트워크가 좋지 않을 수 있다는 알림을 제공하는 것을 고려하고 대역폭을 절약하기 위해 카메라를 끄도록 제안할 수 있습니다. 자세한 내용은 Azure Communication Services 통화에 필요한 인터넷 기능에 대한 네트워크 대역폭 요구 사항 섹션을 참조하세요.
cameraStartFailed 일반 카메라 오류입니다. - 카메라 디바이스가 시스템에서 사용하지 않도록 설정되었거나 다른 프로세스에서 사용되고 있기 때문에 로컬 비디오 전송을 시작하지 못한 경우 True로 설정됩니다.
- 선택한 카메라 디바이스가 로컬 비디오를 다시 보낼 경우 False로 설정됩니다.
카메라 오류 값이 True로 설정된 경우 최종 사용자에게 카메라가 시작되지 않는다는 시각적 알림을 제공합니다.
cameraStartTimedOut 카메라가 잘못된 상태인 일반적인 시나리오입니다. - 카메라 디바이스가 비디오 스트림 전송을 시작하는 동안 시간이 초과될 경우 True로 설정됩니다.
- 선택한 카메라 디바이스가 로컬 비디오를 다시 보낼 경우 False로 설정됩니다.
카메라 오류 값이 True로 설정된 경우 최종 사용자에게 카메라에 문제가 있을 수 있다는 시각적 알림을 제공합니다. (알림 제거를 위해 값이 False로 다시 설정된 경우).
cameraPermissionDenied 설정에서 카메라 사용 권한이 거부되었습니다. - 시스템 설정(비디오)에서 카메라 권한이 거부되면 True로 설정됩니다.
- 스트림이 성공적으로 획득되면 False로 설정됩니다.
참고: 이 진단은 macOS Chrome에서만 작동합니다.
설정에서 카메라 사용 권한이 사용하지 않도록 설정되었습니다. 값이 True로 설정된 경우 최종 사용자에게 Azure Communication Services 호출에 카메라를 사용할 수 있는 권한을 사용하지 않았다는 시각적 알림을 제공합니다.
cameraStoppedUnexpectedly 카메라 오작동 - 마이크가 예기치 않게 음소거 상태가 되면 True로 설정됩니다.
- 마이크가 오디오 스트림을 다시 성공적으로 보내기 시작하면 False로 설정됩니다.
카메라가 제대로 작동하는지 확인합니다. 값이 True로 설정된 경우 최종 사용자에게 카메라에 문제가 있을 수 있다는 시각적 알림을 제공합니다. (알림 제거를 위해 값이 False로 다시 설정된 경우).

기본만

이름 설명 사용 가능한 값: 사용 사례 완화 단계
speakerVolumeIsZero 디바이스(스피커)의 볼륨이 0입니다. - 스피커 볼륨이 0이면 True로 설정됩니다.
- 스피커 볼륨이 0이 아니면 False로 설정됩니다.
통화 중인 참가자의 오디오를 듣지 않습니다. 값이 True로 설정된 경우 실수로 볼륨을 가장 낮게(0) 설정한 것일 수 있습니다.
speakerMuted 스피커 디바이스가 음소거되었습니다. - 스피커 디바이스가 음소거되면 True로 설정됩니다.
- 스피커 디바이스가 음소거되지 않으면 False로 설정됩니다.
통화 중인 참가자의 오디오를 듣지 않습니다. 값이 True로 설정된 경우 실수로 스피커를 음소거한 것일 수 있습니다.
speakerBusy 스피커가 이미 사용 중입니다. 디바이스가 단독 모드로 사용 중이거나, 디바이스가 공유 모드로 사용 중인데 호출자가 디바이스를 단독 모드로 사용할 것을 요청했습니다. - 스피커 디바이스 스트림 획득 시간이 초과되면(오디오) True로 설정됩니다.
- 스피커 획득에 성공하면 False로 설정됩니다.
통화 중인 참가자의 오디오를 스피커로 듣지 않습니다. 값이 True로 설정된 경우 다른 애플리케이션이 스피커를 사용하고 있는지 확인하고 해당 애플리케이션을 닫을 수 있도록 최종 사용자에게 시각적 알림을 제공합니다.
speakerNotFunctioning 스피커가 작동하지 않습니다(오디오 디바이스 클라이언트를 초기화하지 못했거나 디바이스가 5초 넘게 비활성 상태). - 스피커를 사용할 수 없거나 디바이스 스트림 획득 시간이 초과되면(오디오) True로 설정됩니다.
- 스피커 획득에 성공하면 False로 설정됩니다.
통화 중인 참가자의 오디오를 스피커로 듣지 않습니다. 스피커 디바이스의 상태를 확인합니다.
microphoneBusy 마이크가 이미 사용 중입니다. 디바이스가 단독 모드로 사용 중이거나, 디바이스가 공유 모드로 사용 중인데 호출자가 디바이스를 단독 모드로 사용할 것을 요청했습니다. - 마이크 디바이스 스트림 획득 시간이 초과되면(오디오) True로 설정됩니다.
- 마이크 획득에 성공하면 False로 설정됩니다.
통화 중인 다른 참가자에게 오디오가 전달되지 않습니다. 값이 True로 설정된 경우 다른 애플리케이션이 마이크를 사용하고 있는지 확인하고 해당 애플리케이션을 닫을 수 있도록 최종 사용자에게 시각적 알림을 제공합니다.

진단 액세스

사용자 대상 진단은 핵심 Call API의 확장된 기능으로, 활성 호출을 진단할 수 있도록 합니다.

DiagnosticsCallFeature diagnosticsCallFeature = call.feature(Features.LOCAL_USER_DIAGNOSTICS);

사용자 대상 진단 이벤트

  • 기능 개체를 가져와서 진단 이벤트에 수신기를 추가합니다.
DiagnosticsCallFeature diagnosticsCallFeature = call.feature(Features.LOCAL_USER_DIAGNOSTICS);

/* NetworkDiagnostic */
FlagDiagnosticChangedListener listener = (FlagDiagnosticChangedEvent args) -> {
  Boolean mediaValue = args.getValue();
  // Handle new value for no network diagnostic.
};

NetworkDiagnostics networkDiagnostics = diagnosticsCallFeature.getNetworkDiagnostics();
networkDiagnostics.addOnNetworkUnreachableChangedListener(listener);

// To remove listener for network quality event
networkDiagnostics.removeOnNetworkUnreachableChangedListener(listener);

// Quality Diagnostics
DiagnosticsCallFeature diagnosticsCallFeature = call.feature(Features.LOCAL_USER_DIAGNOSTICS);
QualityDiagnosticChangedListener listener = (QualityDiagnosticChangedEvent args) -> {
  DiagnosticQuality diagnosticQuality = args.getValue();
  // Handle new value for network reconnect diagnostic.
};

NetworkDiagnostics networkDiagnostics = diagnosticsCallFeature.getNetworkDiagnostics();
networkDiagnostics.addOnNetworkReconnectionQualityChangedListener(listener);

// To remove listener for media flag event
networkDiagnostics.removeOnNetworkReconnectionQualityChangedListener(listener);

/* MediaDiagnostic */
DiagnosticsCallFeature diagnosticsCallFeature = call.feature(Features.LOCAL_USER_DIAGNOSTICS);
FlagDiagnosticChangedListener listener = (FlagDiagnosticChangedEvent args) -> {
  Boolean mediaValue = args.getValue();
  // Handle new value for speaker not functioning diagnostic.
};

MediaDiagnostics mediaDiagnostics = diagnosticsCallFeature.getMedia();
mediaDiagnostics.addOnIsSpeakerNotFunctioningChangedListener(listener);

// To remove listener for media flag event
mediaDiagnostics.removeOnIsSpeakerNotFunctioningChangedListener(listener);

최신 사용자 대상 진단 가져오기

  • 현재 호출에서 발생한 최신 진단 값을 가져옵니다. 진단에 대한 값을 아직 받지 못한 경우 예외가 throw됩니다.
DiagnosticsCallFeature diagnosticsCallFeature = call.feature(Features.LOCAL_USER_DIAGNOSTICS);
NetworkDiagnostics networkDiagnostics = diagnosticsCallFeature.getNetwork();
MediaDiagnostics mediaDiagnostics = diagnosticsCallFeature.getMedia();

NetworkDiagnosticValues latestNetwork = networkDiagnostics.getLatestDiagnostics();
Boolean lastNetworkValue = latestNetwork.isNetworkUnavailable(); // null if there isn't a value for this diagnostic.
DiagnosticQuality lastReceiveQualityValue = latestNetwork.getNetworkReceiveQuality(); //  UNKNOWN if there isn't a value for this diagnostic.

MediaDiagnosticValues latestMedia = networkDiagnostics.getLatestDiagnostics();
Boolean lastSpeakerNotFunctionValue = latestMedia.isSpeakerNotFunctioning(); // null if there isn't a value for this diagnostic.

// Use the last values ...

진단 값

다음과 같은 사용자 대상 진단을 사용할 수 있습니다.

네트워크 값

이름 설명 사용 가능한 값: 사용 사례 완화 단계
networkUnavailable 사용 가능한 네트워크가 없습니다. - 사용 가능한 네트워크가 없어서 호출을 시작할 수 없으면 True로 설정됩니다.
- ICE 후보가 있는 경우 False로 설정됩니다.
디바이스가 네트워크에 연결되지 않았습니다. 통화에 음성 통화를 유지할 수 있는 신뢰 가능한 인터넷 연결이 있는지 확인합니다. 자세한 내용은 네트워크 최적화 섹션을 참조하세요.
networkRelaysUnreachable 네트워크에 문제가 있습니다. - 네트워크에 Azure Communication Services 릴레이에 연결하도록 허용하지 않는 제약 조건이 있으면 True로 설정됩니다.
- 새 호출 시 False로 설정됩니다.
호출하는 동안 WiFi 신호가 켜지고 꺼질 때 방화벽 규칙 및 네트워크 라우팅을 통해 클라이언트가 Microsoft 턴 서버에 연결할 수 있는지 확인합니다. 자세한 내용은 방화벽 구성 섹션을 참조하세요.
networkReconnectionQuality 연결이 끊어졌으며 네트워크에 다시 연결하고 있습니다. - 네트워크 연결이 끊어지면 Bad로 설정됩니다.
- 미디어 전송 연결이 끊어지면 Poor로 설정됩니다.
- 새 세션이 연결되면 Good으로 설정됩니다.
낮은 대역폭, 인터넷 없음 통화에 음성 통화를 유지할 수 있는 신뢰 가능한 인터넷 연결이 있는지 확인합니다. 자세한 내용은 네트워크 대역폭 요구 사항 섹션을 참조하세요.
networkReceiveQuality 들어오는 스트림 품질에 대한 표시기입니다. - 스트림을 받는 데 심각한 문제가 있으면 Bad로 설정됩니다.
- 스트림을 받는 데 경미한 문제가 있으면 Poor로 설정됩니다.
- 스트림을 받는 데 문제가 없으면 Good으로 설정됩니다.
- 통화에 활성 오디오 흐름이 있는 경우에만, 즉 참가자가 일정 기간 동안 적극적으로 말하는 경우에만 표시됩니다.
낮은 대역폭 통화에 음성 통화를 유지할 수 있는 신뢰 가능한 인터넷 연결이 있는지 확인합니다. 자세한 내용은 네트워크 대역폭 요구 사항 섹션을 참조하세요. 가용 인터넷 대역폭을 절약할 수 있도록 최종 사용자에게 카메라를 끄는 것이 좋겠다고 제안합니다.
networkSendQuality 들어오는 스트림 품질에 대한 표시기입니다. - 스트림을 보내는 데 심각한 문제가 있으면 Bad로 설정됩니다.
- 스트림을 보내는 데 경미한 문제가 있으면 Poor로 설정됩니다.
- 스트림을 보내는 데 문제가 없으면 Good으로 설정됩니다.
- 수신 품질 진단과 비슷하게 통화에 활성 오디오 흐름이 있는 경우에만, 즉 참가자가 일정 기간 동안 적극적으로 말하는 경우에만 표시됩니다. 그러나 품질을 확인하기 위해 다른 쪽의 정보를 사용하기 때문에 1:1 통화에서만 작동합니다. 다른 쪽에서 수신한 데이터를 보내야 합니다.
낮은 대역폭 통화에 음성 통화를 유지할 수 있는 신뢰 가능한 인터넷 연결이 있는지 확인합니다. 자세한 내용은 네트워크 대역폭 요구 사항 섹션을 참조하세요. 또한 가용 인터넷 대역폭을 절약할 수 있도록 최종 사용자에게 카메라를 끄는 것이 좋겠다고 제안합니다.

오디오 값

이름 설명 사용 가능한 값: 사용 사례 완화 단계
noSpeakerDevicesAvailable 사용자 시스템에 오디오 출력 디바이스(스피커)가 없습니다. - 시스템에 스피커 디바이스가 없고 스피커 선택이 지원되는 경우 True로 설정됩니다.
- 시스템에 스피커 디바이스가 1개 이상 있고 스피커를 선택할 수 있으면 False로 설정됩니다.
모든 스피커가 플러그가 뽑혀 있습니다. 값이 True로 설정된 경우 최종 사용자에게 현재 통화 세션에 사용할 수 있는 스피커가 없다는 시각적 알림을 제공하는 것이 좋습니다.
speakingWhileMicrophoneIsMuted 음소거 상태에서 말합니다. - 로컬 마이크가 음소거되고 로컬 사용자가 말하는 경우 True로 설정됩니다.
- 로컬 사용자가 말하기를 중지하거나 마이크를 음소거 해제할 때 False로 설정됩니다.
- 노이즈를 방지하고 보다 나은 사용자 환경을 제공하기 위해 사용자 작업 없이 일정 시간 동안 트리거되는 경우 이 진단 이벤트를 자동으로 사용하지 않도록 설정할 수 있습니다. 새 음소거 작업이 발생하면 다시 사용하도록 설정됩니다.
통화하는 동안 마이크를 음소거하고 마이크에 대고 말합니다. 값이 True로 설정된 경우 최종 사용자에게 대화 중이며 오디오가 음소거되었다는 점을 모를 수 있다는 시각적 알림을 제공하는 것이 좋습니다.
noMicrophoneDevicesAvailable 사용자 시스템에 오디오 캡처 디바이스(마이크)가 없습니다. - 시스템에 마이크 디바이스가 없는 경우 True로 설정됩니다.
- 시스템에 마이크 디바이스가 1개 이상 있으면 False로 설정됩니다.
모든 마이크는 통화 중에 연결이 끊어집니다. 값이 True로 설정된 경우 최종 사용자에게 현재 통화 세션에 마이크가 없다는 시각적 알림을 제공하는 것이 좋습니다. 자세한 내용은 디바이스 관리자에서 마이크를 사용하도록 설정 섹션을 참조하세요.
microphoneNotFunctioning 마이크가 작동하지 않습니다. - 마이크 디바이스가 시스템에서 사용하지 않도록 설정되었거나 다른 프로세스에서 사용되고 있기 때문에 로컬 오디오 스트림 전송을 시작하지 못한 경우 True로 설정됩니다. 이 UFD가 발생하는 데 약 10초가 걸립니다.
- 마이크가 오디오 스트림을 다시 성공적으로 보내기 시작하면 False로 설정됩니다.
마이크를 사용할 수 없습니다. 시스템에서 마이크 액세스가 사용하지 않도록 설정되었습니다. 값이 True로 설정된 경우 최종 사용자에게 마이크에 문제가 있다는 시각적 알림을 제공합니다.
microphoneMuteUnexpectedly 마이크가 음소거되었습니다. - 마이크가 예기치 않게 음소거 상태가 되면 True로 설정됩니다.
- 마이크가 오디오 스트림을 성공적으로 보내기 시작하면 False로 설정됩니다.
마이크가 시스템에서 음소거되었습니다. 대부분의 경우는 사용자가 모바일 디바이스에서 Azure Communication Services 통화 중이며 전화가 걸려올 때 발생합니다. 대부분의 경우 운영 체제는 사용자가 전화를 받을 수 있도록 Azure Communication Services 통화를 음소거합니다. 값이 True로 설정된 경우 최종 사용자에게 전화가 걸려왔기 때문에 통화가 음소거되었다는 시각적 알림을 제공합니다. 자세한 내용은 OS에서 Azure Communication Services 통화를 음소거 섹션을 참조하세요.
microphonePermissionDenied 디바이스의 볼륨이 낮거나 macOS에서 거의 무음입니다. - 시스템 설정(오디오)에서 오디오 권한이 거부되면 True로 설정됩니다.
- 스트림이 성공적으로 획득되면 False로 설정됩니다.
참고: 이 진단은 macOS에서만 작동합니다.
설정에서 마이크 사용 권한이 사용하지 않도록 설정되었습니다. 값이 True로 설정된 경우 최종 사용자에게 Azure Communication Services 통화에 마이크를 사용할 수 있는 권한을 사용하지 않았다는 시각적 알림을 제공합니다.

카메라 값

이름 설명 사용 가능한 값: 사용 사례 완화 단계
cameraFrozen 카메라가 5초 넘게 프레임 생성을 중지합니다. - 로컬 비디오 스트림이 중지된 경우 True로 설정합니다. 이 진단은 원격 쪽 사용자가 화면에서 중지된 비디오를 보거나 원격 참가자의 화면에서 비디오가 렌더링되지 않음을 의미합니다.
- 중지가 끝나고 사용자가 정상적으로 비디오를 볼 수 있는 경우 False로 설정됩니다.
통화 중에 카메라가 연결이 끊어지거나 네트워크에 문제가 생겨 카메라가 중지되었습니다. 값이 True로 설정된 경우 최종 사용자에게 원격 참가자 네트워크가 좋지 않을 수 있다는 알림을 제공하는 것을 고려하고 대역폭을 절약하기 위해 카메라를 끄도록 제안할 수 있습니다. 자세한 내용은 Azure Communication Services 통화에 필요한 인터넷 기능에 대한 네트워크 대역폭 요구 사항 섹션을 참조하세요.
cameraStartFailed 일반 카메라 오류입니다. - 카메라 디바이스가 시스템에서 사용하지 않도록 설정되었거나 다른 프로세스에서 사용되고 있기 때문에 로컬 비디오 전송을 시작하지 못한 경우 True로 설정됩니다.
- 선택한 카메라 디바이스가 로컬 비디오를 다시 보낼 경우 False로 설정됩니다.
카메라 오류 값이 True로 설정된 경우 최종 사용자에게 카메라가 시작되지 않는다는 시각적 알림을 제공합니다.
cameraStartTimedOut 카메라가 잘못된 상태인 일반적인 시나리오입니다. - 카메라 디바이스가 비디오 스트림 전송을 시작하는 동안 시간이 초과될 경우 True로 설정됩니다.
- 선택한 카메라 디바이스가 로컬 비디오를 다시 보낼 경우 False로 설정됩니다.
카메라 오류 값이 True로 설정된 경우 최종 사용자에게 카메라에 문제가 있을 수 있다는 시각적 알림을 제공합니다. (알림 제거를 위해 값이 False로 다시 설정된 경우).
cameraPermissionDenied 설정에서 카메라 사용 권한이 거부되었습니다. - 시스템 설정(비디오)에서 카메라 권한이 거부되면 True로 설정됩니다.
- 스트림이 성공적으로 획득되면 False로 설정됩니다.
참고: 이 진단은 macOS Chrome에서만 작동합니다.
설정에서 카메라 사용 권한이 사용하지 않도록 설정되었습니다. 값이 True로 설정된 경우 최종 사용자에게 Azure Communication Services 호출에 카메라를 사용할 수 있는 권한을 사용하지 않았다는 시각적 알림을 제공합니다.
cameraStoppedUnexpectedly 카메라 오작동 - 마이크가 예기치 않게 음소거 상태가 되면 True로 설정됩니다.
- 마이크가 오디오 스트림을 다시 성공적으로 보내기 시작하면 False로 설정됩니다.
카메라가 제대로 작동하는지 확인합니다. 값이 True로 설정된 경우 최종 사용자에게 카메라에 문제가 있을 수 있다는 시각적 알림을 제공합니다. (알림 제거를 위해 값이 False로 다시 설정된 경우).

기본만

이름 설명 사용 가능한 값: 사용 사례 완화 단계
speakerVolumeIsZero 디바이스(스피커)의 볼륨이 0입니다. - 스피커 볼륨이 0이면 True로 설정됩니다.
- 스피커 볼륨이 0이 아니면 False로 설정됩니다.
통화 중인 참가자의 오디오를 듣지 않습니다. 값이 True로 설정된 경우 실수로 볼륨을 가장 낮게(0) 설정한 것일 수 있습니다.
speakerMuted 스피커 디바이스가 음소거되었습니다. - 스피커 디바이스가 음소거되면 True로 설정됩니다.
- 스피커 디바이스가 음소거되지 않으면 False로 설정됩니다.
통화 중인 참가자의 오디오를 듣지 않습니다. 값이 True로 설정된 경우 실수로 스피커를 음소거한 것일 수 있습니다.
speakerBusy 스피커가 이미 사용 중입니다. 디바이스가 단독 모드로 사용 중이거나, 디바이스가 공유 모드로 사용 중인데 호출자가 디바이스를 단독 모드로 사용할 것을 요청했습니다. - 스피커 디바이스 스트림 획득 시간이 초과되면(오디오) True로 설정됩니다.
- 스피커 획득에 성공하면 False로 설정됩니다.
통화 중인 참가자의 오디오를 스피커로 듣지 않습니다. 값이 True로 설정된 경우 다른 애플리케이션이 스피커를 사용하고 있는지 확인하고 해당 애플리케이션을 닫을 수 있도록 최종 사용자에게 시각적 알림을 제공합니다.
speakerNotFunctioning 스피커가 작동하지 않습니다(오디오 디바이스 클라이언트를 초기화하지 못했거나 디바이스가 5초 넘게 비활성 상태). - 스피커를 사용할 수 없거나 디바이스 스트림 획득 시간이 초과되면(오디오) True로 설정됩니다.
- 스피커 획득에 성공하면 False로 설정됩니다.
통화 중인 참가자의 오디오를 스피커로 듣지 않습니다. 스피커 디바이스의 상태를 확인합니다.
microphoneBusy 마이크가 이미 사용 중입니다. 디바이스가 단독 모드로 사용 중이거나, 디바이스가 공유 모드로 사용 중인데 호출자가 디바이스를 단독 모드로 사용할 것을 요청했습니다. - 마이크 디바이스 스트림 획득 시간이 초과되면(오디오) True로 설정됩니다.
- 마이크 획득에 성공하면 False로 설정됩니다.
통화 중인 다른 참가자에게 오디오가 전달되지 않습니다. 값이 True로 설정된 경우 다른 애플리케이션이 마이크를 사용하고 있는지 확인하고 해당 애플리케이션을 닫을 수 있도록 최종 사용자에게 시각적 알림을 제공합니다.

진단 액세스

사용자 대상 진단은 핵심 Call API의 확장된 기능으로, 활성 호출을 진단할 수 있도록 합니다.

let userFacingDiagnostics = self.call?.feature(Features.localUserDiagnostics)

사용자 대상 진단 이벤트

  • medianetwork 진단 원본에 대한 대리자를 구현합니다. MediaDiagnosticsDelegateNetworkDiagnosticsDelegate.
extension CallObserver: MediaDiagnosticsDelegate {
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsCameraFrozen args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsSpeakerMuted args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsCameraStartFailed args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsSpeakerVolumeZero args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsSpeakerNotFunctioning args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsCameraPermissionDenied args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsMicrophoneNotFunctioning args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsCameraStartTimedOut args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsMicrophoneMutedUnexpectedly args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsZeroSpeakerDevicesAvailable args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...                            
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsZeroMicrophoneDevicesAvailable args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsSpeakingWhileMicrophoneIsMuted args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsSpeakerBusy args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsMicrophoneBusy args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
}

extension CallObserver: NetworkDiagnosticsDelegate {
  func networkDiagnostics(_ networkDiagnostics: NetworkDiagnostics,
                          didChangeIsNetworkRelaysUnreachable args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func networkDiagnostics(_ networkDiagnostics: NetworkDiagnostics,
                          didChangeNetworkReconnectionQuality args: DiagnosticQualityChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func networkDiagnostics(_ networkDiagnostics: NetworkDiagnostics,
                          didChangeNetworkSendQuality args: DiagnosticQualityChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func networkDiagnostics(_ networkDiagnostics: NetworkDiagnostics,
                          didChangeIsNetworkUnavailable args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func networkDiagnostics(_ networkDiagnostics: NetworkDiagnostics,
                          didChangeNetworkReceiveQuality args: DiagnosticQualityChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
}
  • medianetwork 진단에 대한 참조를 유지하고 이벤트를 수신 대기할 대리자 개체를 설정합니다.
self.mediaDiagnostics = userFacingDiagnostics?.media
self.networkDiagnostics = userFacingDiagnostics?.network
self.mediaDiagnostics?.delegate = self.callObserver
self.networkDiagnostics?.delegate = self.callObserver

참고 항목

SDK를 통해 CallKit를 사용하도록 설정했거나 애플리케이션에서 CallKit 통합을 구현하는 경우 CallKit에 음소거 상태를 보고하면 OS는 프라이버시를 이유로 애플리케이션이 마이크를 놓게 할 수 있습니다. 그러면 마이크 디바이스의 입력을 캡처하여 사용자가 말하고 있다는 것을 감지할 수 없으므로 didIsSpeakingWhileMicrophoneIsMuted 이벤트가 예상대로 작동하지 않습니다.

최신 사용자 대상 진단 가져오기

  • 발생한 최신 통화 진단 값을 가져옵니다. 진단에 대한 값을 아직 받지 못한 경우 nil 또는 .unknown이 반환됩니다.
let lastSpeakerNotFunctionValue = self.mediaDiagnostics.latest.isSpeakerNotFunctioning // Boolean?
let lastNetworkRelayNotReachableValue = self.networkDiagnostics.latest.networkRelaysUnreachable // Boolean?
let lastReceiveQualityValue = self.networkDiagnostics.latest.networkReceiveQuality // DiagnosticQuality (.good, .poor, .bad)
// or .unknown if there isn't a diagnostic for this.

진단 값

다음과 같은 사용자 대상 진단을 사용할 수 있습니다.

네트워크 값

이름 설명 사용 가능한 값: 사용 사례 완화 단계
networkUnavailable 사용 가능한 네트워크가 없습니다. - 사용 가능한 네트워크가 없어서 호출을 시작할 수 없으면 True로 설정됩니다.
- ICE 후보가 있는 경우 False로 설정됩니다.
디바이스가 네트워크에 연결되지 않았습니다. 통화에 음성 통화를 유지할 수 있는 신뢰 가능한 인터넷 연결이 있는지 확인합니다. 자세한 내용은 네트워크 최적화 섹션을 참조하세요.
networkRelaysUnreachable 네트워크에 문제가 있습니다. - 네트워크에 Azure Communication Services 릴레이에 연결하도록 허용하지 않는 제약 조건이 있으면 True로 설정됩니다.
- 새 호출 시 False로 설정됩니다.
호출하는 동안 WiFi 신호가 켜지고 꺼질 때 방화벽 규칙 및 네트워크 라우팅을 통해 클라이언트가 Microsoft 턴 서버에 연결할 수 있는지 확인합니다. 자세한 내용은 방화벽 구성 섹션을 참조하세요.
networkReconnectionQuality 연결이 끊어졌으며 네트워크에 다시 연결하고 있습니다. - 네트워크 연결이 끊어지면 Bad로 설정됩니다.
- 미디어 전송 연결이 끊어지면 Poor로 설정됩니다.
- 새 세션이 연결되면 Good으로 설정됩니다.
낮은 대역폭, 인터넷 없음 통화에 음성 통화를 유지할 수 있는 신뢰 가능한 인터넷 연결이 있는지 확인합니다. 자세한 내용은 네트워크 대역폭 요구 사항 섹션을 참조하세요.
networkReceiveQuality 들어오는 스트림 품질에 대한 표시기입니다. - 스트림을 받는 데 심각한 문제가 있으면 Bad로 설정됩니다.
- 스트림을 받는 데 경미한 문제가 있으면 Poor로 설정됩니다.
- 스트림을 받는 데 문제가 없으면 Good으로 설정됩니다.
- 통화에 활성 오디오 흐름이 있는 경우에만, 즉 참가자가 일정 기간 동안 적극적으로 말하는 경우에만 표시됩니다.
낮은 대역폭 통화에 음성 통화를 유지할 수 있는 신뢰 가능한 인터넷 연결이 있는지 확인합니다. 자세한 내용은 네트워크 대역폭 요구 사항 섹션을 참조하세요. 가용 인터넷 대역폭을 절약할 수 있도록 최종 사용자에게 카메라를 끄는 것이 좋겠다고 제안합니다.
networkSendQuality 들어오는 스트림 품질에 대한 표시기입니다. - 스트림을 보내는 데 심각한 문제가 있으면 Bad로 설정됩니다.
- 스트림을 보내는 데 경미한 문제가 있으면 Poor로 설정됩니다.
- 스트림을 보내는 데 문제가 없으면 Good으로 설정됩니다.
- 수신 품질 진단과 비슷하게 통화에 활성 오디오 흐름이 있는 경우에만, 즉 참가자가 일정 기간 동안 적극적으로 말하는 경우에만 표시됩니다. 그러나 품질을 확인하기 위해 다른 쪽의 정보를 사용하기 때문에 1:1 통화에서만 작동합니다. 다른 쪽에서 수신한 데이터를 보내야 합니다.
낮은 대역폭 통화에 음성 통화를 유지할 수 있는 신뢰 가능한 인터넷 연결이 있는지 확인합니다. 자세한 내용은 네트워크 대역폭 요구 사항 섹션을 참조하세요. 또한 가용 인터넷 대역폭을 절약할 수 있도록 최종 사용자에게 카메라를 끄는 것이 좋겠다고 제안합니다.

오디오 값

이름 설명 사용 가능한 값: 사용 사례 완화 단계
noSpeakerDevicesAvailable 사용자 시스템에 오디오 출력 디바이스(스피커)가 없습니다. - 시스템에 스피커 디바이스가 없고 스피커 선택이 지원되는 경우 True로 설정됩니다.
- 시스템에 스피커 디바이스가 1개 이상 있고 스피커를 선택할 수 있으면 False로 설정됩니다.
모든 스피커가 플러그가 뽑혀 있습니다. 값이 True로 설정된 경우 최종 사용자에게 현재 통화 세션에 사용할 수 있는 스피커가 없다는 시각적 알림을 제공하는 것이 좋습니다.
speakingWhileMicrophoneIsMuted 음소거 상태에서 말합니다. - 로컬 마이크가 음소거되고 로컬 사용자가 말하는 경우 True로 설정됩니다.
- 로컬 사용자가 말하기를 중지하거나 마이크를 음소거 해제할 때 False로 설정됩니다.
- 노이즈를 방지하고 보다 나은 사용자 환경을 제공하기 위해 사용자 작업 없이 일정 시간 동안 트리거되는 경우 이 진단 이벤트를 자동으로 사용하지 않도록 설정할 수 있습니다. 새 음소거 작업이 발생하면 다시 사용하도록 설정됩니다.
통화하는 동안 마이크를 음소거하고 마이크에 대고 말합니다. 값이 True로 설정된 경우 최종 사용자에게 대화 중이며 오디오가 음소거되었다는 점을 모를 수 있다는 시각적 알림을 제공하는 것이 좋습니다.
noMicrophoneDevicesAvailable 사용자 시스템에 오디오 캡처 디바이스(마이크)가 없습니다. - 시스템에 마이크 디바이스가 없는 경우 True로 설정됩니다.
- 시스템에 마이크 디바이스가 1개 이상 있으면 False로 설정됩니다.
모든 마이크는 통화 중에 연결이 끊어집니다. 값이 True로 설정된 경우 최종 사용자에게 현재 통화 세션에 마이크가 없다는 시각적 알림을 제공하는 것이 좋습니다. 자세한 내용은 디바이스 관리자에서 마이크를 사용하도록 설정 섹션을 참조하세요.
microphoneNotFunctioning 마이크가 작동하지 않습니다. - 마이크 디바이스가 시스템에서 사용하지 않도록 설정되었거나 다른 프로세스에서 사용되고 있기 때문에 로컬 오디오 스트림 전송을 시작하지 못한 경우 True로 설정됩니다. 이 UFD가 발생하는 데 약 10초가 걸립니다.
- 마이크가 오디오 스트림을 다시 성공적으로 보내기 시작하면 False로 설정됩니다.
마이크를 사용할 수 없습니다. 시스템에서 마이크 액세스가 사용하지 않도록 설정되었습니다. 값이 True로 설정된 경우 최종 사용자에게 마이크에 문제가 있다는 시각적 알림을 제공합니다.
microphoneMuteUnexpectedly 마이크가 음소거되었습니다. - 마이크가 예기치 않게 음소거 상태가 되면 True로 설정됩니다.
- 마이크가 오디오 스트림을 성공적으로 보내기 시작하면 False로 설정됩니다.
마이크가 시스템에서 음소거되었습니다. 대부분의 경우는 사용자가 모바일 디바이스에서 Azure Communication Services 통화 중이며 전화가 걸려올 때 발생합니다. 대부분의 경우 운영 체제는 사용자가 전화를 받을 수 있도록 Azure Communication Services 통화를 음소거합니다. 값이 True로 설정된 경우 최종 사용자에게 전화가 걸려왔기 때문에 통화가 음소거되었다는 시각적 알림을 제공합니다. 자세한 내용은 OS에서 Azure Communication Services 통화를 음소거 섹션을 참조하세요.
microphonePermissionDenied 디바이스의 볼륨이 낮거나 macOS에서 거의 무음입니다. - 시스템 설정(오디오)에서 오디오 권한이 거부되면 True로 설정됩니다.
- 스트림이 성공적으로 획득되면 False로 설정됩니다.
참고: 이 진단은 macOS에서만 작동합니다.
설정에서 마이크 사용 권한이 사용하지 않도록 설정되었습니다. 값이 True로 설정된 경우 최종 사용자에게 Azure Communication Services 통화에 마이크를 사용할 수 있는 권한을 사용하지 않았다는 시각적 알림을 제공합니다.

카메라 값

이름 설명 사용 가능한 값: 사용 사례 완화 단계
cameraFrozen 카메라가 5초 넘게 프레임 생성을 중지합니다. - 로컬 비디오 스트림이 중지된 경우 True로 설정합니다. 이 진단은 원격 쪽 사용자가 화면에서 중지된 비디오를 보거나 원격 참가자의 화면에서 비디오가 렌더링되지 않음을 의미합니다.
- 중지가 끝나고 사용자가 정상적으로 비디오를 볼 수 있는 경우 False로 설정됩니다.
통화 중에 카메라가 연결이 끊어지거나 네트워크에 문제가 생겨 카메라가 중지되었습니다. 값이 True로 설정된 경우 최종 사용자에게 원격 참가자 네트워크가 좋지 않을 수 있다는 알림을 제공하는 것을 고려하고 대역폭을 절약하기 위해 카메라를 끄도록 제안할 수 있습니다. 자세한 내용은 Azure Communication Services 통화에 필요한 인터넷 기능에 대한 네트워크 대역폭 요구 사항 섹션을 참조하세요.
cameraStartFailed 일반 카메라 오류입니다. - 카메라 디바이스가 시스템에서 사용하지 않도록 설정되었거나 다른 프로세스에서 사용되고 있기 때문에 로컬 비디오 전송을 시작하지 못한 경우 True로 설정됩니다.
- 선택한 카메라 디바이스가 로컬 비디오를 다시 보낼 경우 False로 설정됩니다.
카메라 오류 값이 True로 설정된 경우 최종 사용자에게 카메라가 시작되지 않는다는 시각적 알림을 제공합니다.
cameraStartTimedOut 카메라가 잘못된 상태인 일반적인 시나리오입니다. - 카메라 디바이스가 비디오 스트림 전송을 시작하는 동안 시간이 초과될 경우 True로 설정됩니다.
- 선택한 카메라 디바이스가 로컬 비디오를 다시 보낼 경우 False로 설정됩니다.
카메라 오류 값이 True로 설정된 경우 최종 사용자에게 카메라에 문제가 있을 수 있다는 시각적 알림을 제공합니다. (알림 제거를 위해 값이 False로 다시 설정된 경우).
cameraPermissionDenied 설정에서 카메라 사용 권한이 거부되었습니다. - 시스템 설정(비디오)에서 카메라 권한이 거부되면 True로 설정됩니다.
- 스트림이 성공적으로 획득되면 False로 설정됩니다.
참고: 이 진단은 macOS Chrome에서만 작동합니다.
설정에서 카메라 사용 권한이 사용하지 않도록 설정되었습니다. 값이 True로 설정된 경우 최종 사용자에게 Azure Communication Services 호출에 카메라를 사용할 수 있는 권한을 사용하지 않았다는 시각적 알림을 제공합니다.
cameraStoppedUnexpectedly 카메라 오작동 - 마이크가 예기치 않게 음소거 상태가 되면 True로 설정됩니다.
- 마이크가 오디오 스트림을 다시 성공적으로 보내기 시작하면 False로 설정됩니다.
카메라가 제대로 작동하는지 확인합니다. 값이 True로 설정된 경우 최종 사용자에게 카메라에 문제가 있을 수 있다는 시각적 알림을 제공합니다. (알림 제거를 위해 값이 False로 다시 설정된 경우).

기본만

이름 설명 사용 가능한 값: 사용 사례 완화 단계
speakerVolumeIsZero 디바이스(스피커)의 볼륨이 0입니다. - 스피커 볼륨이 0이면 True로 설정됩니다.
- 스피커 볼륨이 0이 아니면 False로 설정됩니다.
통화 중인 참가자의 오디오를 듣지 않습니다. 값이 True로 설정된 경우 실수로 볼륨을 가장 낮게(0) 설정한 것일 수 있습니다.
speakerMuted 스피커 디바이스가 음소거되었습니다. - 스피커 디바이스가 음소거되면 True로 설정됩니다.
- 스피커 디바이스가 음소거되지 않으면 False로 설정됩니다.
통화 중인 참가자의 오디오를 듣지 않습니다. 값이 True로 설정된 경우 실수로 스피커를 음소거한 것일 수 있습니다.
speakerBusy 스피커가 이미 사용 중입니다. 디바이스가 단독 모드로 사용 중이거나, 디바이스가 공유 모드로 사용 중인데 호출자가 디바이스를 단독 모드로 사용할 것을 요청했습니다. - 스피커 디바이스 스트림 획득 시간이 초과되면(오디오) True로 설정됩니다.
- 스피커 획득에 성공하면 False로 설정됩니다.
통화 중인 참가자의 오디오를 스피커로 듣지 않습니다. 값이 True로 설정된 경우 다른 애플리케이션이 스피커를 사용하고 있는지 확인하고 해당 애플리케이션을 닫을 수 있도록 최종 사용자에게 시각적 알림을 제공합니다.
speakerNotFunctioning 스피커가 작동하지 않습니다(오디오 디바이스 클라이언트를 초기화하지 못했거나 디바이스가 5초 넘게 비활성 상태). - 스피커를 사용할 수 없거나 디바이스 스트림 획득 시간이 초과되면(오디오) True로 설정됩니다.
- 스피커 획득에 성공하면 False로 설정됩니다.
통화 중인 참가자의 오디오를 스피커로 듣지 않습니다. 스피커 디바이스의 상태를 확인합니다.
microphoneBusy 마이크가 이미 사용 중입니다. 디바이스가 단독 모드로 사용 중이거나, 디바이스가 공유 모드로 사용 중인데 호출자가 디바이스를 단독 모드로 사용할 것을 요청했습니다. - 마이크 디바이스 스트림 획득 시간이 초과되면(오디오) True로 설정됩니다.
- 마이크 획득에 성공하면 False로 설정됩니다.
통화 중인 다른 참가자에게 오디오가 전달되지 않습니다. 값이 True로 설정된 경우 다른 애플리케이션이 마이크를 사용하고 있는지 확인하고 해당 애플리케이션을 닫을 수 있도록 최종 사용자에게 시각적 알림을 제공합니다.

진단 액세스

사용자 대상 진단은 핵심 Call API의 확장된 기능으로, 활성 호출을 진단할 수 있도록 합니다.

this.diagnosticsCallFeature = call.Features.LocalUserDiagnostics;

사용자 대상 진단 이벤트

  • 진단 이벤트에 대한 수신기를 구현합니다.
private async void Call__OnNetworkUnavailableChanged(object sender, FlagDiagnosticChangedEventArgs args)
{
  var value = args.Value;
  // Handle the diagnostic event value changed...
}

// Listen to other network diagnostics

private async void Call__OnMediaSpeakerNotFunctioningChanged(object sender, FlagDiagnosticChangedEventArgs args)
{
  var value = args.Value;
  // Handle the diagnostic event value changed...
}

// Listen to other media diagnostics
  • 이벤트를 수신 대기할 이벤트 메서드를 설정합니다.
this.diagnosticsCallFeature = call.Features.LocalUserDiagnostics;
this.networkDiagnostics = diagnosticsCallFeature.Network;
this.mediaDiagnostics = diagnosticsCallFeature.Media;

this.networkDiagnostics.NetworkUnavailableChanged += Call__OnNetworkUnavailableChanged;
// Listen to other network events as well ... 

this.mediaDiagnostics.SpeakerNotFunctioningChanged += Call__OnMediaSpeakerNotFunctioningChanged;
// Listen to other media events as well ... 

// Removing listeners

this.networkDiagnostics.NetworkUnavailable -= Call__NetworkUnavailableChanged;
// Remove the other listeners as well ... 

this.mediaDiagnostics.SpeakerNotFunctioningChanged -= Call__OnMediaSpeakerNotFunctioningChanged;
// Remove the other listeners as well ... 

최신 사용자 대상 진단 가져오기

  • 현재 호출에서 발생한 최신 진단 값을 가져옵니다. 진단에 대한 값을 아직 받지 못한 경우 null 또는 .unknown이 반환됩니다.
this.diagnosticsCallFeature = call.Features.LocalUserDiagnostics;
this.networkDiagnostics = diagnosticsCallFeature.Network;
this.mediaDiagnostics = diagnosticsCallFeature.Media;

bool? lastSpeakerNotFunctionValue = this.mediaDiagnostics.GetLatestDiagnostics().IsSpeakerNotFunctioning; // Boolean?
bool? lastNetworkRelayNotReachableValue = this.networkDiagnostics.GetLatestDiagnostics().IsNetworkRelaysUnreachable; // Boolean?
DiagnosticQuality lastReceiveQualityValue = this.networkDiagnostics.GetLatestDiagnostics().NetworkReceiveQuality; // DiagnosticQuality (.good, .poor, .bad)
// or .unknown if there isn't a diagnostic for this.