WebRTC 통계 API의 식별자

W3C 후보 권고안 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2025/CRD-webrtc-stats-20250925/
최신 발행 버전:
https://www.w3.org/TR/webrtc-stats/
최신 편집자 초안:
https://w3c.github.io/webrtc-stats/
이력:
https://www.w3.org/standards/history/webrtc-stats/
커밋 이력
테스트 스위트:
https://github.com/web-platform-tests/wpt/tree/master/webrtc-stats
구현 보고서:
https://wpt.fyi/webrtc-stats
편집자:
Harald Alvestrand (Google)
Varun Singh (daily.co)
Henrik Boström (Google)
피드백:
GitHub w3c/webrtc-stats (풀 리퀘스트, 새 이슈, 열린 이슈)
public-webrtc@w3.org 제목 줄에 [webrtc-stats] … 메시지 주제 …를 포함할 것 (아카이브)
참여
메일링 리스트

초록

이 문서는 RTCPeerConnection에 대한 통계 정보에 접근할 수 있게 하는 WebIDL 객체 집합을 정의한다.

이러한 객체는 [WEBRTC]에 지정된 getStats API에서 반환된다.

이 문서의 상태

이 절은 이 문서가 발행된 시점의 상태를 설명한다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 찾을 수 있다.

이전 후보 권고안으로 발행된 이후, stats 객체는 기반 데이터 소스와 더 잘 맞도록 크게 재구성되었다. 또한 networkType 속성은 프라이버시 보존을 위해 폐기 예정이 되었고, statsended 이벤트는 더 이상 필요하지 않아 제거되었다.

이 문서는 Web Real-Time Communications Working Group권고안 트랙을 사용하여 후보 권고안 초안으로 발행하였다.

후보 권고안으로의 발행은 W3C와 그 회원들의 보증을 의미하지 않는다. 후보 권고안 초안은 워킹 그룹이 후속 후보 권고안 스냅샷에 포함하려는 이전 후보 권고안의 변경사항을 통합한다.

이것은 초안 문서이며 언제든지 다른 문서로 갱신, 대체 또는 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 적절하지 않다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었다. W3C는 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지한다. 해당 페이지에는 특허 공개 방법에 대한 지침도 포함되어 있다. 자신이 아는 특허가 필수 청구항을 포함한다고 믿는 실제 지식을 가진 개인은 W3C 특허 정책의 6절에 따라 정보를 공개해야 한다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받는다.

1. 소개

이 절은 비규범적이다.

피어 연결을 통해 전송되는 오디오, 비디오 또는 데이터 패킷은 손실될 수 있으며, 다양한 정도의 네트워크 지연을 겪을 수 있다. WebRTC를 구현하는 웹 애플리케이션은 기본 네트워크 및 미디어 파이프라인의 성능을 모니터링할 수 있기를 기대한다.

이 문서는 웹 애플리케이션이 사용자 에이전트에서 메트릭을 추출하는 데 사용하는 통계 식별자를 정의한다.

2. 적합성

비규범으로 표시된 절뿐만 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고는 비규범적이다. 그 밖의 모든 것은 규범적이다.

이 문서의 핵심어 MAY, MUST, MUST NOT, SHOULD는 여기에 표시된 것처럼 모두 대문자로 나타날 때에만, BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석해야 한다.

이 명세는 단일 제품, 즉 사용자 에이전트에 적용되는 적합성 기준을 정의한다.

ECMAScript를 사용하여 이 명세에 정의된 객체를 구현하는 구현체는 이 문서가 Web IDL 명세와 그 용어를 사용하므로, Web IDL 명세 [WEBIDL]에 정의된 ECMAScript 바인딩과 일치하는 방식으로 이를 구현해야 MUST 한다.

이 명세는 적합한 구현체가 어떤 객체를 생성해야 하는지를 정의하지 않는다. 이 명세를 참조하는 명세는 적합성을 지정할 필요가 있다. 그런 명세는 문서 텍스트에 다음과 같은 내용을 넣어야 한다(예제일 뿐).

3. 용어

용어 RTCPeerConnection, RTCDataChannel, RTCDtlsTransport, RTCDtlsTransportState, RTCIceTransport, RTCIceRole, RTCIceTransportState, RTCDataChannelState, RTCIceCandidateType, RTCStats, RTCCertificate는 [WEBRTC]에 정의되어 있다.

RTCPriorityType은 [WEBRTC-PRIORITY]에 정의되어 있다.

용어 RTP stream은 [RFC7656]에 정의되어 있다.

용어 Synchronization Source (SSRC), RTCP Sender Report (SR), RTCP Receiver Report (RR)는 [RFC3550]에 정의되어 있다.

용어 RTCP Extended Report (XR)는 [RFC3611]에 정의되어 있다.

audio sample은 오디오 트랙의 어떤 채널에 샘플이 있음을 의미한다. 여러 오디오 채널이 사용되는 경우, 샘플을 기반으로 하는 메트릭은 더 높은 비율로 증가하지 않으며, 여러 채널에 동시에 샘플이 있더라도 단일 샘플로 계산된다.

4. 기본 개념

stats 모델의 기본 객체는 stats 객체이다. 이를 설명하기 위해 다음 용어를 정의한다.

모니터링되는 객체

데이터 값 집합을 유지하는 내부 객체. 대부분의 모니터링되는 객체는 WebRTC API에 정의된 객체이며, 이러한 객체의 내부 속성으로 생각할 수 있다.

Stats 객체
이는 특정 시점에 모니터링되는 객체에서 복사된 값 집합이다. getStats API 호출을 통해 WebIDL 딕셔너리로 반환된다.
Stats 객체 참조

모니터링되는 객체는 안정적인 식별자 id를 가지며, 이는 모니터링되는 객체에서 생성된 모든 stats 객체에 반영된다. Stats 객체는 이 id 값을 사용하여 다른 stats 객체에 대한 참조를 포함할 수 있다. stats 객체에서 이러한 참조는 참조된 stats 객체의 id 값을 포함하는 DOMString으로 표현된다.

모든 stats 객체 참조는 DOMString 유형이고 멤버 이름은 Id로 끝나거나, 유형이 sequence<DOMString>이고 멤버 이름이 Ids로 끝난다.

Stats 값
stats 객체 내의 단일 값을 가리킨다.

모니터링되는 객체는 자신의 수명 동안 포함하는 값을 지속적으로 변경하지만, getStats API 호출을 통해서는 절대 보이지 않는다. Stats 객체는 일단 반환되면 변경되지 않는다.

stats API는 [WEBRTC]에 정의되어 있다. 이는 stats 객체들의 컬렉션을 반환하도록 정의되어 있으며, 각 객체는 RTCStats 딕셔너리에서 직접 또는 간접적으로 상속하는 딕셔너리이다. 이 API는 [WEBRTC]에서 규범적으로 정의되어 있지만, 참조의 편의를 위해 여기에 재현한다.

WebIDLdictionary RTCStats {
    required DOMHighResTimeStamp timestamp;
    required RTCStatsType        type;
    required DOMString           id;
};

타임스탬프는 DOMHighResTimeStamp [HIGHRES-TIME]로 표현되며, 정보가 수집되는 시점의 Performance.timeOrigin + Performance.now()로 정의된다.

4.1 stats 객체 설계 지침

새 stats 객체를 도입할 때에는 다음 원칙을 따라야 한다.

stats 딕셔너리의 새 멤버는 [API-DESIGN-PRINCIPLES]에 따라 표준 관례(camelCase)에 맞게 이름을 지어야 한다.

Id로 끝나는 이름(예: transportId)은 항상 stats 객체 참조이다. Ids로 끝나는 이름은 항상 sequence<DOMString> 유형이며, 여기서 각 DOMStringstats 객체 참조이다.

stats 값의 자연스러운 이름이 id로 끝날 경우(예를 들어 stats 값이 모니터링되는 객체의 프로토콜 내 식별자인 경우), 권장 관례는 dataChannelIdentifier처럼 이름이 identifier로 끝나도록 하는 것이다.

Stats는 Javascript에 의해 샘플링된다. 일반적으로 애플리케이션은 stats가 얼마나 자주 샘플링되는지 전체적으로 제어할 수 없으며, 구현체는 stats의 의도된 사용이 무엇인지 알 수 없다. 설계상 애플리케이션이 stats 생성 방식에 영향을 줄 수 있는 제어 표면은 없다.

따라서 구현체가 "average" 비율을 계산하도록 하는 것은 좋은 생각이 아니다. 이는 미리 설정할 수 없는 어떤 평균 시간 간격을 의미하기 때문이다. 대신 권장 접근 방식은 값의 측정 횟수를 세고, 그 합 자체가 의미 없더라도 주어진 측정값을 합산하는 것이다. 그러면 JS 애플리케이션은 getStats()를 두 번 호출하고, 두 합의 차이를 두 횟수의 차이로 나누어 원하는 임의의 시간 간격에 대한 평균을 계산할 수 있다.

바이트 수와 같이 시간에 대해 측정되는 stats의 경우 별도의 카운터가 필요하지 않다. 대신 타임스탬프의 차이로 나누면 된다.

4.2 stats 객체 구현 지침

stats 객체를 구현할 때에는 다음 지침을 따라야 한다.

4.3 모니터링되는 객체의 수명 고려사항

객체 설명은 stats의 관점에서 모니터링되는 객체의 수명이 무엇인지 말할 것이다. 모니터링되는 객체가 삭제되면, 그것은 더 이상 stats에 나타나지 않는다. 이 일이 일어나기 전까지는 나타난다. 이는 구현에서 객체의 실제 수명과 대응할 수도 있고 그렇지 않을 수도 있다. 이 명세에서 중요한 것은 stats에 무엇이 나타나는가이다.

모니터링되는 객체가 RTCPeerConnection의 수명 동안 몇 개의 인스턴스로만 존재할 수 있다면, 그것을 "영원한" 것으로 간주하고 stats에 보고되는 객체 집합에서 절대 삭제하지 않는 것이 가장 간단할 수 있다. 이러한 유형의 객체는 RTCPeerConnection을 더 이상 사용할 수 없게 될 때까지 계속 보인다. 또한 pc.close() 이후의 getStats()에서도 보인다. 이는 해당 명세에서 수명이 언급되지 않은 경우의 기본값이다.

시간이 지나면서 많은 인스턴스로 존재할 수 있는 객체는 그것들이 삭제되는 정의된 시점을 가져야 하며, 그 시점에 이후의 getStats() 호출에 더 이상 나타나지 않는다. 객체가 삭제되면, 이후의 어떤 getStats() 호출도 삭제된 객체를 참조하는 stats 객체 참조를 포함하지 않음을 보장할 수 있다. 또한 삭제된 객체의 stats id가 다른 객체에 재사용되지 않음을 보장한다. 이는 삭제된 모니터링되는 객체에 대한 stats 객체를 수집하는 애플리케이션이 어떤 getStats() 호출 결과에서도 가리켜진 객체를 항상 고유하게 식별할 수 있도록 보장한다.

4.4 getStats() 결과 캐싱/스로틀링 지침

getStats() 호출은 WebRTC의 많은 구성 요소를 건드리며 실행하는 데 상당한 시간이 걸릴 수 있다. 구현체는 성능상의 이점을 위해 getStats() 호출의 캐싱이나 스로틀링을 활용할 수도 있고 활용하지 않을 수도 있지만, 모든 구현체는 다음을 준수해야 한다.

API 호출, promise 해결 또는 이벤트 발생의 결과로 RTCPeerConnection의 상태가 가시적으로 변경될 때, 그 이후의 새로운 getStats() 호출은 영향을 받는 객체에 대해 최신 딕셔너리를 반환해야 한다.

stats 객체가 삭제되면, 이후의 getStats() 호출은 그 모니터링되는 객체에 대한 stats를 반환해서는 MUST NOT 안 된다.

5. stats 객체 유형의 유지보수 절차

5.1 새 stats 객체 추가

이 문서는 상호운용 가능한 stats 객체 유형을 지정한다. 새 객체 유형에 대한 제안은 GitHub에서 유지되는 편집자 초안에서 할 수 있다. 새 표준 유형은 W3C 권고안의 향후 개정판에 나타날 수 있다.

stats 객체 안에서 새 stats 객체 유형이나 stats 값의 필요성이 발견되면, 이슈를 Github에 제기해야 하며, 검토 절차를 통해 해당 stat를 편집자 초안에 추가할지 여부를 결정한다.

편집자 초안에 대한 변경 pull request는 논의의 지침 역할을 할 수 있지만, 최종 병합은 검토 절차에 달려 있다.

WebRTC WG가 존재하는 동안에는 그것이 검토 기구 역할을 한다. 해산된 이후에는 W3C가 적절한 검토를 마련해야 한다.

요구되는 검토 수준은 [RFC5226] 4.1절에 정의된 IETF 절차의 "expert review" 수준이다. 필요한 문서화에는 새 stats의 이름, 그 데이터 유형, 그리고 그것들이 기반으로 하는 정의가 포함되며, 상호운용 가능한 구현을 허용하는 수준으로 지정되어야 한다. 명세는 다른 문서에 대한 참조로 구성될 수 있다.

특정 버전(예를 들어 적합성을 위해)을 참조하려는 다른 명세는 날짜가 지정된 버전을 참조해야 한다. 이러한 버전은 업데이트가 발생할 때 정기적으로 생성된다.

6. 프라이버시 우려를 완화하기 위한 절차

WebRTC의 Statistics API는 하드웨어 기능 및 네트워크 특성을 포함하여 시스템에 대한 정보를 노출한다. 이 API가 부과하는 핑거프린팅 표면을 제한하기 위해, 일부 메트릭은 이 절의 알고리즘에서 허용하는 경우에만 노출된다. (이것은 핑거프린팅 벡터이다.)

6.1 하드웨어 기능 노출 제한

수동적 핑거프린팅을 피하기 위해, 하드웨어 기능은 캡처 중인 컨텍스트에서만 노출되어야 한다. 이는 아래 알고리즘을 사용하여 테스트된다.

하드웨어 노출이 허용되는지 확인하려면, 다음 단계를 실행한다.

  1. 컨텍스트 캡처링 상태가 true이면, true를 반환한다.

  2. 그렇지 않으면 false를 반환한다.

7. RTCStatsType

type 멤버는 RTCStatsType 유형이며, RTCStats 객체가 나타내는 객체의 유형을 표시한다. 주어진 type을 가진 객체는 하나의 IDL 딕셔너리 유형만 가질 수 있지만, 여러 type 값이 같은 IDL 딕셔너리 유형을 나타낼 수도 있다. 예를 들어, "local-candidate"와 "remote-candidate"는 모두 IDL 딕셔너리 유형 RTCIceCandidateStats를 사용한다.

이 명세는 RTCStatsType의 허용된 값에 대해 규범적이다.

7.1 RTCStatsType 열거형

WebIDLenum RTCStatsType {
"codec",
"inbound-rtp",
"outbound-rtp",
"remote-inbound-rtp",
"remote-outbound-rtp",
"media-source",
"media-playout",
"peer-connection",
"data-channel",
"transport",
"candidate-pair",
"local-candidate",
"remote-candidate",
"certificate"
};

다음 문자열은 RTCStatsType에 유효한 값이다.

codec

RTCPeerConnection 객체가 전송하거나 수신하는 RTP stream에서 현재 사용 중인 코덱에 대한 통계이다. 이는 RTCCodecStats로 접근한다.

inbound-rtp

RTCPeerConnection 객체로 현재 수신되는 인바운드 RTP stream에 대한 통계이다. 이는 RTCInboundRtpStreamStats로 접근한다.

RTX 스트림은 별도의 RTCInboundRtpStreamStats 객체로 나타나지 않지만, 관련 RTCInboundRtpStreamStats 객체의 packetsReceived, bytesReceived, retransmittedPacketsReceivedretransmittedBytesReceived 카운터에 영향을 준다.

FEC 스트림은 별도의 RTCInboundRtpStreamStats 객체로 나타나지 않지만, 관련 RTCInboundRtpStreamStats 객체의 packetsReceived, bytesReceived, fecPacketsReceivedfecBytesReceived 카운터에 영향을 준다.

outbound-rtp

RTCPeerConnection 객체로 현재 전송되는 아웃바운드 RTP stream에 대한 통계이다. 이는 RTCOutboundRtpStreamStats로 접근한다.

simulcast 사용으로 인해 같은 sender에 연결된 RTP stream이 여러 개 있는 경우, RTP stream마다 하나의 RTCOutboundRtpStreamStats가 있으며, 각각은 ssrc 멤버의 서로 다른 값을 가진다. RTX 스트림은 별도의 RTCOutboundRtpStreamStats 객체로 나타나지 않지만, 관련 RTCOutboundRtpStreamStats 객체의 packetsSent, bytesSent, retransmittedPacketsSentretransmittedBytesSent 카운터에 영향을 준다.

remote-inbound-rtp

RTCPeerConnection 객체로 현재 전송되는 아웃바운드 스트림에 대응하는 원격 엔드포인트의 인바운드 RTP stream에 대한 통계이다. 이는 원격 엔드포인트에서 측정되고 RTCP Receiver Report (RR) 또는 RTCP Extended Report (XR)로 보고된다. 이는 RTCRemoteInboundRtpStreamStats로 접근한다.

remote-outbound-rtp

RTCPeerConnection 객체로 현재 수신되는 인바운드 스트림에 대응하는 원격 엔드포인트의 아웃바운드 RTP stream에 대한 통계이다. 이는 원격 엔드포인트에서 측정되고 RTCP Sender Report (SR)로 보고된다. 이는 RTCRemoteOutboundRtpStreamStats로 접근한다.

media-source

현재 RTCRtpSender에 연결된 MediaStreamTrack이 생성하는 미디어에 대한 통계이다. 이는 인코더에 공급되는 미디어를 반영한다. 즉, getUserMedia() 제약이 적용된 이후의 미디어이다 (즉, 카메라가 생성한 원시 미디어가 아니다). 이는 kind에 따라 RTCAudioSourceStats 또는 RTCVideoSourceStats이다.

media-playout

오디오 재생과 관련된 통계이다. 이는 RTCAudioPlayoutStats로 접근한다.

peer-connection

RTCPeerConnection 객체와 관련된 통계이다. 이는 RTCPeerConnectionStats로 접근한다.

data-channel

RTCDataChannel id와 관련된 통계이다. 이는 RTCDataChannelStats로 접근한다.

transport

RTCPeerConnection 객체와 관련된 전송 통계이다. 이는 RTCTransportStats로 접근한다.

candidate-pair

RTCIceTransport 객체와 관련된 ICE 후보 쌍 통계이다. 이는 RTCIceCandidatePairStats로 접근한다.

전송의 현재 쌍이 아닌 후보 쌍은 RTCIceTransport가 ICE 재시작을 수행할 때, 상태가 "new"로 변경되는 시점에 삭제된다. 전송의 현재 쌍인 후보 쌍은 ICE 재시작 후 RTCIceTransport가 새 후보에서 생성된 후보 쌍을 사용하도록 전환할 때 삭제된다. 이 시점은 외부에서 관찰 가능한 다른 이벤트와 대응하지 않는다.

local-candidate

RTCIceTransport 객체와 관련된 ICE 로컬 후보 통계이다. 이는 로컬 후보에 대한 RTCIceCandidateStats로 접근한다.

로컬 후보는 RTCIceTransport가 ICE 재시작을 수행하고, 해당 후보가 더 이상 삭제되지 않은 어떤 후보 쌍의 멤버도 아닐 때 삭제된다.

remote-candidate

RTCIceTransport 객체와 관련된 ICE 원격 후보 통계이다. 이는 원격 후보에 대한 RTCIceCandidateStats로 접근한다.

원격 후보는 RTCIceTransport가 ICE 재시작을 수행하고, 해당 후보가 더 이상 삭제되지 않은 어떤 후보 쌍의 멤버도 아닐 때 삭제된다.

certificate

RTCIceTransport가 사용하는 인증서에 대한 정보이다. 이는 RTCCertificateStats로 접근한다.

8. Stats 딕셔너리

8.1 RTP 통계 계층 구조

RTP 통계를 위한 딕셔너리는 계층 구조로 구성되어 있으므로, 여러 다른 컨텍스트에서 의미가 있는 stats는 IDL에서 한 번만 표현된다.

여기서 노출되는 메트릭은 로컬 측정값과 RTCP 패킷으로 보고된 값에 대응한다. 복합 RTCP 패킷은 Sender Report (SR) 및 Receiver Report (RR)와 같은 여러 RTCP 보고 블록을 포함하는 반면, 비복합 RTCP 패킷은 단일 RTCP SR 또는 RR 블록만 포함할 수 있다.

모든 RTP 모니터링되는 객체의 수명은 SSRC에 묶인다. RTCOutboundRtpStreamStats는 로컬 또는 원격 SDP answer를 설정하여 RTP sender가 구성될 때 생성된다 (setLocalDescription() 또는 setRemoteDescription()를 통해, 그리고 signaling state가 "stable"로 돌아올 때). RTCInboundRtpStreamStats는 이 SSRC에 대한 첫 RTP 패킷이 수신될 때 생성되며, 원격 RTP stream stats 객체(RTCRemoteInboundRtpStreamStatsRTCRemoteOutboundRtpStreamStats)는 대응하는 RTCP 패킷이 처음 수신될 때 생성된다.

RTP 모니터링되는 객체는 대응하는 RTP sender 또는 RTP receiver가 대응하는 RTP stream을 제거하도록 재구성될 때 삭제된다. 이는 ssrc가 변경되거나, simulcast 레이어가 제거되거나, RTCRtpTransceivercurrentDirection"stopped"가 될 때 이전 SSRC에 대해 발생한다. transceiver가 "inactive"가 되거나 encoding의 active 매개변수가 false로 설정되는 경우에는 모니터링되는 객체가 삭제되지 않는다. 삭제 이벤트가 발생한 후 SSRC가 재사용되면, 이는 새로운 RTP 모니터링되는 객체로 간주되며, 새 RTP stream stats는 재설정된 카운터와 새 ID를 가진다.

주어진 RTP stats 객체의 총 카운터는 항상 증가해야 하지만, SSRC 변경, simulcast 레이어 제거 또는 transceiver 중지로 인해 RTP stats 객체가 삭제되거나 새 RTP stats 객체로 대체될 수 있다. 호출자는 여러 RTP stats 객체에 걸쳐 패킷 카운터를 집계할 때 이를 인식해야 한다(집계값은 삭제로 인해 감소할 수 있다).

RTCRtpSender가 두 개의 simulcast 레이어(SSRC=111 및
SSRC=222)를 전송하고 있다. 두 개의 "outbound-rtp" stats 객체가 관찰되며,
하나는 SSRC=111이고 다른 하나는 SSRC=222이다. 두 객체의 패킷 카운터는
증가하고 있다.

RTCRtpSender.setParameters()를 사용하여 한 레이어가 비활성화된다.
이는 한 레이어를 일시 중지하지만(그 패킷 카운터는 멈춤), RTP
모니터링되는 객체는 삭제되지 않는다. RTCRtpTransceiver가
"inactive"로 협상되어도 RTP 모니터링되는 객체는 여전히 삭제되지 않는다.
RTCRtpTransceiver가 다시 "sendonly"가 되면, 동일한
"outbound-rtp" 객체가 계속 사용된다.

나중에 RTCRtpTransceiver.stop()이 호출된다. "outbound-rtp" 객체는
여전히 존재하지만 그 패킷 카운터는 멈춘 상태이다. 재협상이
발생하고 transceiver.currentDirection이 "stopped"가 되면, 이제
두 "outbound-rtp" 객체가 모두 삭제된다.

계층 구조는 다음과 같다.

RTCRtpStreamStats: 모든 RTP stream의 모든 끝에 적용되는 stats

8.2 RTCRtpStreamStats 딕셔너리

WebIDLdictionary RTCRtpStreamStats : RTCStats {
             required unsigned long       ssrc;
             required DOMString           kind;
             DOMString           transportId;
             DOMString           codecId;
};

Dictionary RTCRtpStreamStats 멤버

ssrc 유형은 unsigned long

synchronization source(SSRC) 식별자는 [RFC3550]에 따른 부호 없는 정수 값으로, 이 stats 객체가 설명하는 RTP 패킷의 스트림을 식별하는 데 사용된다.

아웃바운드 및 인바운드 로컬의 경우, SSRC는 해당 엔드포인트가 각각 전송하고 수신한 RTP stream에 대한 stats를 설명한다. 원격 인바운드 및 원격 아웃바운드의 경우, SSRC는 원격 엔드포인트가 수신하고 원격 엔드포인트로 전송된 RTP stream에 대한 stats를 설명한다.

kind 유형은 DOMString

"audio" 또는 "video" 중 하나이다. 이는 관련 MediaStreamTrackkind 속성과 일치해야 MUST 한다.

transportId 유형은 DOMString

이는 이 RTP stream과 연결된 RTCTransportStats를 생성하기 위해 검사된 객체와 연결된 고유 식별자이다.

codecId 유형은 DOMString

이는 이 RTP stream과 연결된 RTCCodecStats를 생성하기 위해 검사된 객체와 연결된 고유 식별자이다.

8.3 RTCCodecStats 딕셔너리

Codec은 RTP transport에 등록될 때 생성되지만, 사용 중인(즉 RTP stream이 참조하는) codec의 하위 집합만 getStats()에서 노출된다.

RTCCodecStats 객체는 하나 이상의 codecId가 해당 codec을 참조할 때 생성된다. RTCCodecStats에 대한 참조가 더 이상 존재하지 않으면, stats 객체는 삭제된다. 미래에 같은 codec이 다시 사용되면, RTCCodecStats 객체는 이전과 같은 id로 되살아난다.

Codec 객체는 같은 transport를 사용하는 media section의 여러 RTP stream에서 참조될 수 있지만, 서로 다른 transport에 있는 유사한 codec은 서로 다른 RTCCodecStats 객체를 가진다.

참고

사용자 에이전트는 sdpFmtpLine이 방향마다 다르지 않는 한, payload type당, transport당 정보를 하나의 "codec" 항목으로 병합해야 한다. 방향마다 다르면 두 항목(encode용 하나와 decode용 하나)이 필요하다.

WebIDLdictionary RTCCodecStats : RTCStats {
             required unsigned long payloadType;
             required DOMString     transportId;
             required DOMString     mimeType;
             unsigned long clockRate;
             unsigned long channels;
             DOMString     sdpFmtpLine;
};

Dictionary RTCCodecStats 멤버

payloadType 유형은 unsigned long

RTP encoding 또는 decoding에서 사용되는 payload type.

transportId 유형은 DOMString

이 codec이 사용되는 transport의 고유 식별자이며, 대응하는 RTCTransportStats 객체를 찾는 데 사용할 수 있다.

mimeType 유형은 DOMString

IANA media types registry [IANA-MEDIA-TYPES]에 정의된 codec MIME media type/subtype, 예: video/VP8.

clockRate 유형은 unsigned long

미디어 샘플링 속도를 나타낸다.

channels 유형은 unsigned long

존재하는 경우 채널 수(mono=1, stereo=2)를 나타낸다.

sdpFmtpLine 유형은 DOMString

codec에 대응하는 SDP의 a=fmtp 줄에서 가져온 "format specific parameters" 필드이다. 그러한 필드가 존재하는 경우에 해당하며, [RFC8829] (5.8절)에 정의된 대로이다.

8.4 RTCReceivedRtpStreamStats 딕셔너리

WebIDLdictionary RTCReceivedRtpStreamStats : RTCRtpStreamStats {
             unsigned long long   packetsReceived;
             unsigned long long   packetsReceivedWithEct1;
             unsigned long long   packetsReceivedWithCe;
             unsigned long long   packetsReportedAsLost;
             unsigned long long   packetsReportedAsLostButRecovered;
             long long            packetsLost;
             double               jitter;
};

Dictionary RTCReceivedRtpStreamStats 멤버

packetsReceived 유형은 unsigned long long

SSRC에 대해 수신된 RTP 패킷의 총수. 여기에는 재전송이 포함된다. 수신 엔드포인트에서는 [RFC3550] 6.4.1절에 정의된 대로 계산된다. 송신 엔드포인트에서는 packetsReceivedRTCP Receiver Report에 보고된 Extended Highest Sequence Number Received에서 Cumulative Number of Packets Lost를 빼고, 그런 다음 이 SSRC로 보낸 RTCP Sender Report의 초기 Extended Sequence Number를 빼고 하나를 더하여 추정된다. 이는 [RFC3550] 부록 A.3에서 논의된 내용을 sender 쪽에 맞게 반영한 것이다. 아직 RTCP Receiver Report가 수신되지 않았다면 0을 반환한다.

packetsReceivedWithEct1 유형은 unsigned long long

"ECT(1)" 표시가 있는 이 SSRC에 대해 수신된 RTP 패킷의 총수.

packetsReceivedWithCe 유형은 unsigned long long

"CE" 표시가 있는 이 SSRC에 대해 수신된 RTP 패킷의 총수.

packetsReportedAsLost 유형은 unsigned long long

[RFC8888] 3.1절 보고서가 zero R bit로 전송된 RTP 패킷의 총수. "ccfb" feedback 메커니즘에 대한 지원이 협상된 경우에만 존재한다.

packetsReportedAsLostButRecovered 유형은 unsigned long long

[RFC8888] 3.1절 보고서가 zero R bit로 전송되었지만, 같은 패킷에 대한 이후 보고서에서 R bit가 1로 설정된 RTP 패킷의 총수. "ccfb" feedback 메커니즘에 대한 지원이 협상된 경우에만 존재한다.

packetsLost 유형은 long long

SSRC에 대해 손실된 RTP 패킷의 총수. [RFC3550] 6.4.1절에 정의된 대로 계산된다. 이것이 추정되는 방식 때문에, 수신된 패킷이 전송된 패킷보다 많으면 음수가 될 수 있음에 유의하라.

jitter 유형은 double

SSRC에 대해 초 단위로 측정된 Packet Jitter. [RFC3550] 6.4.1절에 정의된 대로 계산된다.

8.5 RTCInboundRtpStreamStats 딕셔너리

RTCInboundRtpStreamStats 딕셔너리는 들어오는 RTP 미디어 스트림의 측정 메트릭을 나타낸다. 통계 객체에 보고되는 타임스탬프는 데이터가 샘플링된 시점이다.

WebIDLdictionary RTCInboundRtpStreamStats : RTCReceivedRtpStreamStats {
             required DOMString   trackIdentifier;
             DOMString            mid;
             DOMString            remoteId;
             unsigned long        framesDecoded;
             unsigned long        keyFramesDecoded;
             unsigned long        framesRendered;
             unsigned long        framesDropped;
             unsigned long        frameWidth;
             unsigned long        frameHeight;
             double               framesPerSecond;
             unsigned long long   qpSum;
             double               totalDecodeTime;
             double               totalInterFrameDelay;
             double               totalSquaredInterFrameDelay;
             unsigned long        pauseCount;
             double               totalPausesDuration;
             unsigned long        freezeCount;
             double               totalFreezesDuration;
             DOMHighResTimeStamp  lastPacketReceivedTimestamp;
             unsigned long long   headerBytesReceived;
             unsigned long long   packetsDiscarded;
             unsigned long long   fecBytesReceived;
             unsigned long long   fecPacketsReceived;
             unsigned long long   fecPacketsDiscarded;
             unsigned long long   bytesReceived;
             unsigned long        nackCount;
             unsigned long        firCount;
             unsigned long        pliCount;
             double               totalProcessingDelay;
             DOMHighResTimeStamp  estimatedPlayoutTimestamp;
             double               jitterBufferDelay;
             double               jitterBufferTargetDelay;
             unsigned long long   jitterBufferEmittedCount;
             double               jitterBufferMinimumDelay;
             unsigned long long   totalSamplesReceived;
             unsigned long long   concealedSamples;
             unsigned long long   silentConcealedSamples;
             unsigned long long   concealmentEvents;
             unsigned long long   insertedSamplesForDeceleration;
             unsigned long long   removedSamplesForAcceleration;
             double               audioLevel;
             double               totalAudioEnergy;
             double               totalSamplesDuration;
             unsigned long        framesReceived;
             DOMString            decoderImplementation;
             DOMString            playoutId;
             boolean              powerEfficientDecoder;
             unsigned long        framesAssembledFromMultiplePackets;
             double               totalAssemblyTime;
             unsigned long long   retransmittedPacketsReceived;
             unsigned long long   retransmittedBytesReceived;
             unsigned long        rtxSsrc;
             unsigned long        fecSsrc;
             double               totalCorruptionProbability;
             double               totalSquaredCorruptionProbability;
             unsigned long long   corruptionMeasurements;
            };

Dictionary RTCInboundRtpStreamStats 멤버

trackIdentifier 유형은 DOMString

MediaStreamTrackid 속성 값.

mid 유형은 DOMString

이 스트림을 소유한 RTCRtpTransceivernull이 아닌 mid 값을 가지면, 이는 그 값이며, 그렇지 않으면 이 멤버는 MUST NOT 존재해야 한다.

remoteId 유형은 DOMString

remoteId는 같은 SSRC에 대한 원격 RTCRemoteOutboundRtpStreamStats 객체를 찾는 데 사용된다.

framesDecoded

audio에 대해서는 MUST NOT 존재해야 한다. 이는 이 RTP stream에 대해 올바르게 디코딩된 프레임의 총수를 나타낸다. 즉, 프레임이 드롭되지 않았다면 표시되었을 프레임이다.

keyFramesDecoded 유형은 unsigned long

audio에 대해서는 MUST NOT 존재해야 한다. 이는 VP8 [RFC6386]의 키 프레임이나 H.264 [RFC6184]의 IDR 프레임과 같은 키 프레임 중 이 RTP 미디어 스트림에 대해 성공적으로 디코딩된 총수를 나타낸다. 이는 framesDecoded의 하위 집합이다. framesDecoded - keyFramesDecoded는 디코딩된 델타 프레임 수를 제공한다.

framesRendered

audio에 대해서는 MUST NOT 존재해야 한다. 이는 렌더링된 프레임의 총수를 나타낸다. 프레임이 렌더링된 직후 증가한다.

framesDropped 유형은 unsigned long

audio에 대해서는 MUST NOT 존재해야 한다. 이 receiver의 트랙에 대해 디코딩 전에 드롭되었거나 프레임이 표시 기한을 놓쳐 드롭된 프레임의 총수이다. 측정은 receiver가 생성될 때 시작되며 [RFC7004]의 부록 A (g)에 정의된 누적 메트릭이다.

frameWidth 유형은 unsigned long

audio에 대해서는 MUST NOT 존재해야 한다. 마지막으로 디코딩된 프레임의 너비를 나타낸다. 첫 번째 프레임이 디코딩되기 전에는 이 멤버가 MUST NOT 존재해야 한다.

frameHeight 유형은 unsigned long

audio에 대해서는 MUST NOT 존재해야 한다. 마지막으로 디코딩된 프레임의 높이를 나타낸다. 첫 번째 프레임이 디코딩되기 전에는 이 멤버가 MUST NOT 존재해야 한다.

framesPerSecond 유형은 double

audio에 대해서는 MUST NOT 존재해야 한다. 지난 1초 동안 디코딩된 프레임 수이다.

qpSum 유형은 unsigned long long

audio에 대해서는 MUST NOT 존재해야 한다. 이 receiver가 디코딩한 프레임의 QP 값의 합이다. 프레임 수는 framesDecoded에 있다.

QP 값의 정의는 codec에 따라 달라진다. VP8의 경우 QP 값은 프레임 헤더에 구문 요소 y_ac_qi로 실린 값이며, [RFC6386] 19.2절에 정의되어 있다. 범위는 0..127이다.

QP 값은 사용된 quantizer 값을 나타내는 지표일 뿐임에 유의하라. 많은 형식은 프레임 내에서 quantizer 값을 달리할 수 있는 방법을 가진다.

totalDecodeTime 유형은 double

audio에 대해서는 MUST NOT 존재해야 한다. 이 스트림의 framesDecoded 프레임을 디코딩하는 데 사용된 총 초 수이다. 평균 디코딩 시간은 이 값을 framesDecoded로 나누어 계산할 수 있다. 하나의 프레임을 디코딩하는 데 걸리는 시간은 디코더에 프레임을 공급한 시점부터 디코더가 그 프레임에 대한 디코딩된 데이터를 반환할 때까지 지난 시간이다.

totalInterFrameDelay 유형은 double

audio에 대해서는 MUST NOT 존재해야 한다. 연속적으로 렌더링된 프레임 사이의 interframe delay를 초 단위로 합산한 값이며, 프레임이 렌더링된 직후 기록된다. interframe delay 분산은 totalInterFrameDelay, totalSquaredInterFrameDelay, 그리고 framesRendered로부터 다음 공식에 따라 계산할 수 있다. (totalSquaredInterFrameDelay - totalInterFrameDelay^2/ framesRendered)/framesRendered.

totalSquaredInterFrameDelay 유형은 double

audio에 대해서는 MUST NOT 존재해야 한다. 연속적으로 렌더링된 프레임 사이의 interframe delay 제곱을 초 단위로 합산한 값이며, 프레임이 렌더링된 직후 기록된다. interframe delay 분산을 계산하는 방법에 대한 자세한 내용은 totalInterFrameDelay를 참조하라.

pauseCount 유형은 unsigned long

audio에 대해서는 MUST NOT 존재해야 한다. 이 receiver가 겪은 video pause의 총수를 센다. 마지막으로 렌더링된 프레임 이후 지난 시간이 5초를 초과하면 video가 일시 중지된 것으로 간주한다. pauseCount는 그러한 일시 중지 후 프레임이 렌더링될 때 증가한다.

totalPausesDuration 유형은 double

audio에 대해서는 MUST NOT 존재해야 한다. pause의 총 지속 시간(pauseCount의 pause 정의 참조)이며 초 단위이다. 이 값은 프레임이 렌더링될 때 업데이트된다.

freezeCount 유형은 unsigned long

audio에 대해서는 MUST NOT 존재해야 한다. 이 receiver가 겪은 video freeze의 총수를 센다. frame duration, 즉 연속으로 렌더링된 두 프레임 사이의 시간 간격이 Max(3 * avg_frame_duration_ms, avg_frame_duration_ms + 150) 이상이면 freeze이다. 여기서 avg_frame_duration_ms는 마지막 30개의 렌더링된 프레임 지속 시간의 선형 평균이다.

totalFreezesDuration 유형은 double

audio에 대해서는 MUST NOT 존재해야 한다. frozen으로 간주되는 렌더링된 프레임의 총 지속 시간(freezeCount의 freeze 정의 참조)이며 초 단위이다. 이 값은 프레임이 렌더링될 때 업데이트된다.

lastPacketReceivedTimestamp 유형은 DOMHighResTimeStamp

SSRC에 대해 마지막 패킷이 수신된 시점의 타임스탬프를 나타낸다. 이는 로컬 엔드포인트에서 통계가 생성된 시간을 나타내는 timestamp와 다르다.

headerBytesReceived 유형은 unsigned long long

SSRC에 대해 수신된 RTP 헤더 및 padding 바이트의 총수. 여기에는 재전송이 포함된다. IP 또는 UDP와 같은 transport layer 헤더의 크기는 포함하지 않는다. headerBytesReceived + bytesReceived는 transport를 통해 payload로 수신된 바이트 수와 같다.

packetsDiscarded 유형은 unsigned long long

지연 도착 또는 조기 도착으로 인해 jitter buffer에서 폐기된 RTP 패킷의 누적 수, 즉 이러한 패킷은 재생되지 않는다. 패킷 중복으로 인해 폐기된 RTP 패킷은 이 메트릭에 보고되지 않는다 [XRBLOCK-STATS]. [RFC7002] 3.2절 및 부록 A.a에 정의된 대로 계산된다.

fecBytesReceived 유형은 unsigned long long

SSRC에 대해 수신된 RTP FEC 바이트의 총수이며, payload 바이트만 포함한다. 이는 bytesReceived의 하위 집합이다. 다른 ssrc를 사용하는 FEC 메커니즘이 협상된 경우, FEC 패킷은 별도의 SSRC를 통해 전송되지만 여기에 여전히 계산된다.

fecPacketsReceived 유형은 unsigned long long

SSRC에 대해 수신된 RTP FEC 패킷의 총수. 다른 ssrc를 사용하는 FEC 메커니즘이 협상된 경우, FEC 패킷은 별도의 SSRC를 통해 전송되지만 여기에 여전히 계산된다. 이 카운터는 media 패킷과 in-band로 FEC 패킷을 수신할 때도 증가할 수 있다(예: Opus).

fecPacketsDiscarded 유형은 unsigned long long

SSRC에 대해 수신된 RTP FEC 패킷 중 error correction payload가 애플리케이션에 의해 폐기된 총수. 이는 1. FEC 패킷이 보호하는 모든 source packet이 수신되었거나 별도의 FEC 패킷으로 이미 복구된 경우, 또는 2. FEC 패킷이 늦게 도착하여, 즉 recovery window 밖에 도착했고, 손실된 RTP 패킷이 playout 중에 이미 건너뛰어진 경우 발생할 수 있다. 이는 fecPacketsReceived의 하위 집합이다.

bytesReceived 유형은 unsigned long long

SSRC에 대해 수신된 바이트의 총수. 여기에는 재전송이 포함된다. [RFC3550] 6.4.1절에 정의된 대로 계산된다.

firCount 유형은 unsigned long

audio에 대해서는 MUST NOT 존재해야 한다. 이 receiver가 전송한 Full Intra Request (FIR) 패킷의 총수를 센다. 이는 [RFC5104] 4.3.1절에 정의되어 있다. [RFC2032]에 표시된 RTCP FIR은 계산하지 않는다. 이는 [RFC4587]에 의해 폐기되었다.

pliCount 유형은 unsigned long

audio에 대해서는 MUST NOT 존재해야 한다. 이 receiver가 전송한 Picture Loss Indication (PLI) 패킷의 총수를 센다. 이는 [RFC4585] 6.3.1절에 정의되어 있다.

totalProcessingDelay 유형은 double

이는 각 audio sample 또는 video frame이 첫 RTP 패킷이 수신된 시점(reception timestamp)부터 대응하는 sample 또는 frame이 디코딩된 시점(decoded timestamp)까지 걸리는 시간을 초 단위로 합산한 값이다. 이 시점에서 audio sample 또는 video frame은 MediaStreamTrack에 의해 playout될 준비가 된 것이다. 여기서 playout 준비란 일반적으로 audio sample 또는 video frame이 decoder에 의해 완전히 디코딩된 이후를 의미한다.

관련 복잡성을 고려하여, 도착 시간 또는 reception timestamp는 가능한 한 네트워크 계층에 가까운 곳에서 측정되고, decoded timestamp는 완전한 sample 또는 frame이 디코딩되는 즉시 측정된다.

audio의 경우, 여러 sample이 같은 RTP 패킷으로 수신되며, 모든 sample은 같은 reception timestamp와 서로 다른 decoded timestamp를 공유한다. video의 경우, frame은 여러 RTP 패킷에 걸쳐 수신된다. 이 경우 frame을 포함하는 가장 이른 timestamp가 reception timestamp로 계산되며, decoded timestamp는 완전한 frame이 디코딩되는 시점에 대응한다.

이 메트릭은 디코딩되지 않은 프레임, 즉 framesDropped에 대해서는 증가하지 않는다. 평균 처리 지연은 totalProcessingDelay를 video의 경우 framesDecoded로 (또는 audio의 경우 provisional stats spec의 totalSamplesDecoded로) 나누어 계산할 수 있다.

nackCount 유형은 unsigned long

이 receiver가 전송한 Negative ACKnowledgement (NACK) 패킷의 총수를 센다. 이는 [RFC4585] 6.2.1절에 정의되어 있다.

estimatedPlayoutTimestamp 유형은 DOMHighResTimeStamp

이는 이 receiver 트랙의 추정 playout 시간이다. playout 시간은 알려진 timestamp를 가진 마지막 재생 가능한 audio sample 또는 video frame의 NTP timestamp이다(RTCP SR 패킷에서 RTP timestamp를 NTP timestamp로 매핑한 것). 이것은 재생 준비가 된 이후 경과한 시간으로 외삽된다. 이는 sender의 NTP clock time에서 트랙의 "current time"이며, 현재 재생 중인 audio가 없어도 존재할 수 있다.

이는 같은 source의 두 track에 대해 audio와 video가 얼마나 동기화되지 않았는지를 추정하는 데 유용할 수 있다. audioInboundRtpStats.estimatedPlayoutTimestamp - videoInboundRtpStats.estimatedPlayoutTimestamp.

jitterBufferDelay 유형은 double

jitter buffer의 목적은 RTP 패킷을 frame으로 재결합하고(video의 경우) 부드러운 playout을 제공하는 것이다. 여기서 설명하는 모델은 sample 또는 frame이 여전히 압축되어 있으며 아직 디코딩되지 않았다고 가정한다. 이는 각 audio sample 또는 video frame이 첫 패킷이 jitter buffer에 수신된 시점(ingest timestamp)부터 jitter buffer를 빠져나가는 시점(emit timestamp)까지 걸리는 시간을 초 단위로 합산한 값이다. audio의 경우 여러 sample이 같은 RTP 패킷에 속하므로 같은 ingest timestamp를 가지지만 서로 다른 jitter buffer emit timestamp를 가진다. video의 경우 frame은 여러 RTP 패킷에 걸쳐 수신될 수 있으므로 ingest timestamp는 jitter buffer에 들어간 frame의 가장 이른 패킷이며, emit timestamp는 전체 frame이 jitter buffer를 빠져나갈 때이다. 이 메트릭은 sample 또는 frame이 빠져나와 buffer에서의 시간을 완료할 때 (그리고 jitterBufferEmittedCount를 증가시킬 때) 증가한다. 평균 jitter buffer delay는 jitterBufferDelayjitterBufferEmittedCount로 나누어 계산할 수 있다.

jitterBufferTargetDelay 유형은 double

이 값은 jitter buffer에서 sample이 emit될 때마다 target jitter buffer delay만큼 증가한다. 추가되는 target은 sample이 jitter buffer에서 emit된 시점의 target delay(초 단위)이다. 평균 target delay를 얻으려면 jitterBufferEmittedCount로 나눈다.

jitterBufferEmittedCount 유형은 unsigned long long

jitter buffer에서 나온 audio sample 또는 video frame의 총수 (jitterBufferDelay를 증가시킴).

jitterBufferMinimumDelay 유형은 double

AV 동기화를 달성하기 위해서나 jitterBufferTarget이 RTCRtpReceiver에 설정되었기 때문에 jitter buffer delay가 더 높은 값으로 증가할 수 있는 다양한 이유가 있다. 이러한 메커니즘 중 하나를 사용할 때는, WebRTC 클라이언트가 추가되는 지연량을 추적할 수 있도록 달성할 수 있었던 최소 jitter buffer delay를 추적하는 것이 유용할 수 있다.

이 메트릭은 jitterBufferTargetDelay와 같은 방식으로 동작하지만, jitterBufferTarget(위 링크 참조), AV sync, 또는 다른 메커니즘처럼 jitter buffer target delay를 증가시키는 외부 메커니즘의 영향을 받지 않는다는 점이 다르다. 이 메트릭은 jitter 및 packet loss와 같은 네트워크 특성에만 순수하게 기반하며, 외부 요인이 영향을 주지 않는다면 얻을 수 있는 최소 jitter buffer delay로 볼 수 있다. 이 메트릭은 jitterBufferEmittedCount가 업데이트될 때마다 업데이트된다.

totalSamplesReceived 유형은 unsigned long long

video에 대해서는 MUST NOT 존재해야 한다. 이 RTP stream에서 수신된 sample의 총수이다. 여기에는 concealedSamples가 포함된다.

concealedSamples 유형은 unsigned long long

video에 대해서는 MUST NOT 존재해야 한다. concealed sample인 sample의 총수이다. concealed sample은 재생되기 전에 로컬에서 생성된 합성 sample로 대체된 sample이다. concealed되어야 하는 sample의 예로는 손실된 패킷의 sample(packetsLost에 보고됨) 또는 너무 늦게 도착하여 재생할 수 없는 패킷의 sample (packetsDiscarded에 보고됨)이 있다.

silentConcealedSamples 유형은 unsigned long long

video에 대해서는 MUST NOT 존재해야 한다. 삽입된 concealed sample 중 "silent"인 sample의 총수이다. silent sample을 재생하면 silence 또는 comfort noise가 발생한다. 이는 concealedSamples의 하위 집합이다.

concealmentEvents 유형은 unsigned long long

video에 대해서는 MUST NOT 존재해야 한다. concealment event의 수이다. 이 카운터는 non-concealed sample 이후 concealed sample이 합성될 때마다 증가한다. 즉, 연속된 여러 concealed sample은 concealedSamples count를 여러 번 증가시키지만, concealment event는 하나이다.

insertedSamplesForDeceleration 유형은 unsigned long long

video에 대해서는 MUST NOT 존재해야 한다. playout이 느려질 때, 이 카운터는 수신된 sample 수와 재생된 sample 수의 차이만큼 증가한다. sample을 삽입하여 playout이 느려지는 경우, 이는 삽입된 sample의 수가 된다.

removedSamplesForAcceleration 유형은 unsigned long long

video에 대해서는 MUST NOT 존재해야 한다. playout이 빨라질 때, 이 카운터는 수신된 sample 수와 재생된 sample 수의 차이만큼 증가한다. sample을 제거하여 speedup이 달성되는 경우, 이는 제거된 sample의 수가 된다.

audioLevel 유형은 double

video에 대해서는 MUST NOT 존재해야 한다. 수신 track의 audio level을 나타낸다. 로컬에 연결된 track의 audio level은 대신 RTCAudioSourceStats를 참조하라.

값은 0..1(선형) 사이이며, 1.0은 0 dBov, 0은 silence를 나타내고, 0.5는 0 dBov에서 sound pressure level이 대략 6 dBSPL 변한 것을 나타낸다.

audioLeveltotalAudioEnergy 아래에 설명된 알고리즘을 사용하여 작은 구간에 대해 평균된다. 사용되는 구간은 구현 정의이다.

totalAudioEnergy 유형은 double

video에 대해서는 MUST NOT 존재해야 한다. 수신 track의 audio energy를 나타낸다. 로컬에 연결된 track의 audio energy는 대신 RTCAudioSourceStats를 참조하라.

이 값은 다음과 같이 계산되어야 MUST 한다. 수신된 각 audio sample에 대해 (따라서 totalSamplesReceived에 의해 계산됨), sample의 값을 인코딩 가능한 최고 intensity 값으로 나눈 뒤 제곱하고, sample의 지속 시간(초)을 곱한 값을 더한다. 즉, duration * Math.pow(energy/maxEnergy, 2)이다.

이는 [RFC6464]에 정의된 것처럼 audioLevel과 같은 단위를 사용하는 root mean square (RMS) 값을 얻는 데 사용할 수 있다. 공식 Math.sqrt(totalAudioEnergy/totalSamplesDuration)을 사용하여 이러한 단위로 변환할 수 있다. 이 계산은 원하는 임의의 시간 구간에 대한 평균 audio level을 계산하기 위해 서로 다른 두 getStats() 호출 값의 차이를 사용하여 수행할 수도 있다. 즉, Math.sqrt((energy2 - energy1)/(duration2 - duration1))를 수행한다.

예를 들어, 10ms audio 패킷이 RMS 0.5(1.0 중)로 생성되면, 이는 totalAudioEnergy0.5 * 0.5 * 0.01 = 0.0025를 더해야 한다. RMS 0.1인 또 다른 10ms 패킷이 수신되면, 마찬가지로 totalAudioEnergy0.0001을 더해야 한다. 그러면 Math.sqrt(totalAudioEnergy/totalSamplesDuration)Math.sqrt(0.0026/0.02) = 0.36이 되며, 이는 연속된 20ms audio 구간에 대해 RMS 계산을 수행하여 얻을 수 있는 값과 같다.

여러 audio channel이 사용되는 경우, sample의 audio energy는 어떤 channel의 가장 높은 energy를 가리킨다.

totalSamplesDuration 유형은 double

video에 대해서는 MUST NOT 존재해야 한다. 수신 track의 audio duration을 나타낸다. 로컬에 연결된 track의 audio duration은 대신 RTCAudioSourceStats를 참조하라.

수신된 모든 sample의 총 지속 시간을 초 단위로 나타낸다 (따라서 totalSamplesReceived에 의해 계산됨). 이는 totalAudioEnergy와 함께 사용하여 서로 다른 구간에 대한 평균 audio level을 계산할 수 있다.

framesReceived 유형은 unsigned long

audio에 대해서는 MUST NOT 존재해야 한다. 이 RTP stream에서 수신된 완전한 frame의 총수를 나타낸다. 이 메트릭은 완전한 frame이 수신될 때 증가한다.

decoderImplementation 유형은 DOMString

하드웨어 노출이 허용되지 않는 한 MUST NOT 존재해야 한다. (이것은 핑거프린팅 벡터이다.)

audio에 대해서는 MUST NOT 존재해야 한다. 사용된 decoder implementation을 식별한다. 이는 상호운용성 문제를 진단하는 데 유용하다.

playoutId 유형은 DOMString

video에 대해서는 MUST NOT 존재해야 한다. audio playout이 발생 중이면, 이는 대응하는 RTCAudioPlayoutStats를 찾는 데 사용된다.

powerEfficientDecoder 유형은 boolean

하드웨어 노출이 허용되지 않는 한 MUST NOT 존재해야 한다. (이것은 핑거프린팅 벡터이다.)

audio에 대해서는 MUST NOT 존재해야 한다. 현재 사용 중인 decoder가 사용자 에이전트에 의해 전력 효율적인 것으로 간주되는지 여부. 이는 구성이 hardware acceleration을 결과로 하는지 여부를 반영해야 SHOULD 하지만, 사용자 에이전트는 해당 구성이 전력 효율적인 것으로 간주되는지 결정할 때 다른 정보도 고려할 수 MAY 있다.

framesAssembledFromMultiplePackets 유형은 unsigned long

audio에 대해서는 MUST NOT 존재해야 한다. 이는 둘 이상의 RTP 패킷으로 구성된 이 RTP stream에 대해 올바르게 디코딩된 frame의 총수를 나타낸다. 그러한 frame의 경우 totalAssemblyTime이 증가한다. 평균 frame assembly time은 totalAssemblyTimeframesAssembledFromMultiplePackets로 나누어 계산할 수 있다.

totalAssemblyTime 유형은 double

audio에 대해서는 MUST NOT 존재해야 한다. 각 video frame이 첫 RTP 패킷이 수신된 시점(reception timestamp)부터 frame의 마지막 RTP 패킷이 수신된 시점까지 걸리는 시간을 초 단위로 합산한 값이다. 둘 이상의 RTP 패킷으로 구성된 frame에 대해서만 증가한다.

관련 복잡성을 고려하여, 도착 시간 또는 reception timestamp는 가능한 한 네트워크 계층에 가까운 곳에서 측정된다. 이 메트릭은 디코딩되지 않은 frame, 즉 framesDropped나 다른 이유로 디코딩에 실패한 frame(있는 경우)에 대해서는 증가하지 않는다. 둘 이상의 RTP 패킷으로 구성된 frame에 대해서만 증가한다.

retransmittedPacketsReceived 유형은 unsigned long long

SSRC에 대해 수신된 retransmitted packet의 총수. 이는 packetsReceived의 하위 집합이다. RTX가 협상되지 않은 경우, retransmitted packet을 식별할 수 없으며 이 멤버는 MUST NOT 존재해야 한다.

retransmittedBytesReceived 유형은 unsigned long long

SSRC에 대해 수신된 retransmitted byte의 총수이며, payload 바이트만 포함한다. 이는 bytesReceived의 하위 집합이다. RTX가 협상되지 않은 경우, retransmitted packet을 식별할 수 없으며 이 멤버는 MUST NOT 존재해야 한다.

rtxSsrc 유형은 unsigned long

별도의 RTP stream에서 재전송을 위한 RTX가 협상된 경우, 이는 이 stream의 ssrc와 연결된 RTX stream의 SSRC이다. RTX가 협상되지 않은 경우, 이 값은 MUST NOT 존재해야 한다.

fecSsrc 유형은 unsigned long

별도의 RTP stream을 사용하는 FEC 메커니즘이 협상된 경우, 이는 이 stream의 ssrc와 연결된 FEC stream의 SSRC이다. FEC가 협상되지 않았거나 같은 RTP stream을 사용하는 경우, 이 값은 MUST NOT 존재해야 한다.

totalCorruptionProbability 유형은 double

audio에 대해서는 MUST NOT 존재해야 한다. 이 SSRC에 대해 수행된 모든 corruption probability 측정값의 누적 합을 나타낸다. 이 속성이 언제 corruptionMeasurements를 참조하여 SHOULD 존재해야 하는지 확인하라.

totalCorruptionProbability에 더해지는 각 측정값은 [0.0, 1.0] 범위에 있어야 MUST 한다. 여기서 0.0 값은 시스템이 처리된 프레임에 corruption이 없거나 무시할 수 있을 정도라고 추정했음을 나타낸다. 마찬가지로 1.0 값은 처리된 프레임에 보이는 corruption이 거의 확실히 있음을 나타낸다. 그 사이의 값은 보이는 corruption이 있을 가능성이 있지만, 예를 들어 magnitude가 낮거나 frame의 작은 부분에만 존재할 수 있음을 나타낸다.

참고

corruption likelihood 값은 추정치이지 보장이 아니다. 추정치가 0.0이더라도, 예를 들어 frame의 매우 작은 영역만 영향을 받은 경우 corruption이 존재할 수 있다(즉 false negative). 마찬가지로, 추정치가 1.0이더라도, 예를 들어 frame 평균보다 훨씬 높은 QP를 가진 macroblock이 있는 경우 corruption이 존재하지 않을 수 있다(즉 false positive). PSNR 측정 등에도 edge case가 있는 것처럼, 이러한 메트릭은 frame별 절대적 진실로 사용하기보다는 주로 통계 분석의 기초로 사용해야 한다.

totalSquaredCorruptionProbability 유형은 double

audio에 대해서는 MUST NOT 존재해야 한다. 이 SSRC에 대해 수행된 모든 corruption probability 측정값의 제곱 누적 합을 나타낸다. 이 속성이 언제 corruptionMeasurements를 참조하여 SHOULD 존재해야 하는지 확인하라.

corruptionMeasurements 유형은 unsigned long long

audio에 대해서는 MUST NOT 존재해야 한다. 사용자 에이전트가 corruption probability 측정을 수행할 수 있을 때, 이 카운터는 각 측정마다 증가하며, totalCorruptionProbabilitytotalSquaredCorruptionProbability는 각각 이 측정값 및 측정값의 제곱과 함께 집계된다. RTP 패킷에 corruption-detection header extension이 있는 경우, corruption probability measurements는 MUST 존재해야 한다.

참고

http://www.webrtc.org/experiments/rtp-hdrext/corruption-detection에 문서화된 corruption-detection header extension은 실험적이다. IETF 표준이 수립되면 식별자와 형식이 변경될 수 있다.

RTCRemoteInboundRtpStreamStats 딕셔너리는 특정 들어오는 RTP stream에 대한 remote endpoint의 측정 메트릭을 나타낸다(송신 endpoint의 나가는 RTP stream에 대응한다). statistics 객체에 보고되는 timestamp는 대응하는 RTCP RR이 수신된 시점이다.

WebIDLdictionary RTCRemoteInboundRtpStreamStats : RTCReceivedRtpStreamStats {
             DOMString            localId;
             double               roundTripTime;
             double               totalRoundTripTime;
             double               fractionLost;
             unsigned long long   roundTripTimeMeasurements;
             unsigned long long   packetsWithBleachedEct1Marking;
};

Dictionary RTCRemoteInboundRtpStreamStats 멤버

localId 유형은 DOMString

localId는 같은 SSRC에 대한 로컬 RTCOutboundRtpStreamStats 객체를 찾는 데 사용된다.

roundTripTime 유형은 double

RTCP Receiver Report (RR)의 RTCP timestamp를 기반으로 추정한 이 SSRC에 대한 왕복 시간이며, 초 단위로 측정된다. [RFC3550] 6.4.1절에 정의된 대로 계산된다. DLSR 값이 0이 아닌 RTCP Receiver Report가 수신될 때까지 MUST NOT 존재해야 한다.

totalRoundTripTime 유형은 double

세션 시작 이후 모든 round trip time 측정값의 누적 합을 초 단위로 나타낸다. 개별 round trip time은 RTCP Receiver Report (RR) [RFC3550]의 RTCP timestamp를 기반으로 계산되므로 0이 아닌 DLSR 값이 필요하다. 평균 round trip time은 totalRoundTripTimeroundTripTimeMeasurements로 나누어 계산할 수 있다.

fractionLost 유형은 double

SSRC에 대해 보고된 packet loss fraction이다. [RFC3550] 6.4.1절 및 부록 A.3에 정의된 대로 계산된다.

roundTripTimeMeasurements 유형은 unsigned long long

SSRC에 대해 유효한 round trip time을 포함하는 수신된 RTCP RR 블록의 총수를 나타낸다. 0이 아닌 DLSR 값을 가진 RTCP Receiver Report가 수신되지 않아 roundTripTime을 계산할 수 없는 경우, 이 카운터는 증가하지 않는다.

packetsWithBleachedEct1Marking 유형은 unsigned long long

[RFC3168] 3절에 따라 ECT(1) marking으로 전송되었지만, [RFC8888] report에서 해당 packet이 "not-ECT" marking으로 수신되었다는 정보를 제공한 packet 수.

8.7 RTCSentRtpStreamStats 딕셔너리

WebIDLdictionary RTCSentRtpStreamStats : RTCRtpStreamStats {
            unsigned long long packetsSent;
            unsigned long long bytesSent;
};

Dictionary RTCSentRtpStreamStats 멤버

packetsSent 유형은 unsigned long long

SSRC에 대해 전송된 RTP packet의 총수. 여기에는 retransmission이 포함된다. [RFC3550] 6.4.1절에 정의된 대로 계산된다.

bytesSent 유형은 unsigned long long

SSRC에 대해 전송된 byte의 총수. 여기에는 retransmission이 포함된다. [RFC3550] 6.4.1절에 정의된 대로 계산된다.

8.8 RTCOutboundRtpStreamStats 딕셔너리

RTCOutboundRtpStreamStats 딕셔너리는 나가는 RTP stream에 대한 측정 메트릭을 나타낸다. statistics 객체에 보고되는 timestamp는 데이터가 샘플링된 시점이다.

WebIDLdictionary RTCOutboundRtpStreamStats : RTCSentRtpStreamStats {
             DOMString            mid;
             DOMString            mediaSourceId;
             DOMString            remoteId;
             DOMString            rid;
             unsigned long        encodingIndex;
             unsigned long long   headerBytesSent;
             unsigned long long   retransmittedPacketsSent;
             unsigned long long   retransmittedBytesSent;
             unsigned long        rtxSsrc;
             double               targetBitrate;
             unsigned long long   totalEncodedBytesTarget;
             unsigned long        frameWidth;
             unsigned long        frameHeight;
             double               framesPerSecond;
             unsigned long        framesSent;
             unsigned long        hugeFramesSent;
             unsigned long        framesEncoded;
             unsigned long        keyFramesEncoded;
             unsigned long long   qpSum;
             record<DOMString, double> psnrSum;
             unsigned long long   psnrMeasurements;
             double               totalEncodeTime;
             double               totalPacketSendDelay;
             RTCQualityLimitationReason                 qualityLimitationReason;
             record<DOMString, double> qualityLimitationDurations;
             unsigned long        qualityLimitationResolutionChanges;
             unsigned long        nackCount;
             unsigned long        firCount;
             unsigned long        pliCount;
             DOMString            encoderImplementation;
             boolean              powerEfficientEncoder;
             boolean              active;
             DOMString            scalabilityMode;
             unsigned long long   packetsSentWithEct1;
};

Dictionary RTCOutboundRtpStreamStats 멤버

mid 유형은 DOMString

이 stream을 소유한 RTCRtpTransceivernull이 아닌 mid 값을 가지면, 이는 그 값이며, 그렇지 않으면 이 멤버는 존재해서는 MUST NOT 안 된다.

mediaSourceId 유형은 DOMString

이 stream의 sender에 현재 연결된 track을 나타내는 stats 객체, 즉 RTCMediaSourceStats의 식별자이다.

remoteId 유형은 DOMString

remoteId는 같은 SSRC에 대한 원격 RTCRemoteInboundRtpStreamStats 객체를 찾는 데 사용된다.

rid 유형은 DOMString

audio에 대해서는 존재해서는 MUST NOT 안 된다. 이 RTP stream에 대해 rid가 설정된 경우에만 존재한다. rid가 설정되어 있으면 RID RTP header extension이 협상되었는지 여부와 관계없이 이 값은 존재한다.

encodingIndex 유형은 unsigned long

audio에 대해서는 존재해서는 MUST NOT 안 된다. 이는 RTP sender의 encodings 목록에서 이 RTP stream을 나타내는 encoding의 index이다.

headerBytesSent 유형은 unsigned long long

SSRC에 대해 전송된 RTP header 및 padding byte의 총수. IP 또는 UDP와 같은 transport layer header의 크기는 포함하지 않는다. headerBytesSent + bytesSent는 transport를 통해 payload로 전송된 byte 수와 같다.

retransmittedPacketsSent 유형은 unsigned long long

SSRC에 대해 retransmitted된 packet의 총수. 이는 packetsSent의 하위 집합이다. RTX가 협상되지 않은 경우, retransmitted packet은 이 ssrc를 통해 전송된다. RTX가 협상된 경우, retransmitted packet은 별도의 SSRC를 통해 전송되지만 여기에도 계산된다.

retransmittedBytesSent 유형은 unsigned long long

SSRC에 대해 retransmitted된 byte의 총수이며, payload byte만 포함한다. 이는 bytesSent의 하위 집합이다. RTX가 협상되지 않은 경우, retransmitted byte는 이 ssrc를 통해 전송된다. RTX가 협상된 경우, retransmitted byte는 별도의 SSRC를 통해 전송되지만 여기에도 계산된다.

rtxSsrc 유형은 unsigned long

별도의 RTP stream에서 retransmission을 위한 RTX가 협상된 경우, 이는 이 stream의 ssrc와 연결된 RTX stream의 SSRC이다. RTX가 협상되지 않은 경우, 이 값은 존재해서는 MUST NOT 안 된다.

targetBitrate 유형은 double

현재 encoder target을 bits per second 단위로 반영한다. target은 encoder의 설정을 반영하는 순간값이지만, 그 결과로 전송되는 payload bytes per second는 retransmission을 제외하고 target과 밀접하게 상관되어야 SHOULD 한다. bytesSentretransmittedBytesSent도 참조하라. targetBitrate는 Transport Independent Application Specific (TIAS) bitrate [RFC3890]와 같은 방식으로 정의된다.

totalEncodedBytesTarget 유형은 unsigned long long

audio에 대해서는 존재해서는 MUST NOT 안 된다. 이 값은 frame이 encode될 때마다 target frame size(바이트)만큼 증가한다. 실제 frame size는 이 수보다 크거나 작을 수 있다. 이 값은 framesEncoded가 증가할 때마다 증가한다.

frameWidth 유형은 unsigned long

audio에 대해서는 존재해서는 MUST NOT 안 된다. 마지막으로 encode된 frame의 너비를 나타낸다. encode된 frame의 해상도는 media source보다 낮을 수 있다(RTCVideoSourceStats.width 참조). 첫 번째 frame이 encode되기 전에는 이 멤버가 존재해서는 MUST NOT 안 된다.

frameHeight 유형은 unsigned long

audio에 대해서는 존재해서는 MUST NOT 안 된다. 마지막으로 encode된 frame의 높이를 나타낸다. encode된 frame의 해상도는 media source보다 낮을 수 있다(RTCVideoSourceStats.height 참조). 첫 번째 frame이 encode되기 전에는 이 멤버가 존재해서는 MUST NOT 안 된다.

framesPerSecond 유형은 double

audio에 대해서는 존재해서는 MUST NOT 안 된다. 지난 1초 동안 encode된 frame 수이다. 이는 media source frame rate보다 낮을 수 있다(RTCVideoSourceStats.framesPerSecond 참조).

framesSent 유형은 unsigned long

audio에 대해서는 존재해서는 MUST NOT 안 된다. 이 RTP stream에서 전송된 frame의 총수를 나타낸다.

hugeFramesSent 유형은 unsigned long

audio에 대해서는 존재해서는 MUST NOT 안 된다. 이 RTP stream이 전송한 huge frame의 총수를 나타낸다. huge frame은 정의상 encode된 크기가 frame 평균 크기의 최소 2.5배인 frame이다. frame의 평균 크기는 frame이 encode된 시점의 target bitrate per second를 target FPS로 나눈 값으로 정의된다. 이것들은 일반적으로 picture에 많은 변화가 있어 encode하기 복잡한 frame이다. 이는 예를 들어 streamed presentation에서 slide change를 추정하는 데 사용할 수 있다.

2.5라는 multiplier는 WebRTC standalone implementation을 사용하는 sample presentation의 encoded frame size를 분석하여 선택되었다. 2.5는 충분히 큰 multiplier이면서도 모든 slide change event를 huge frame으로 식별하게 했다. 그러나 1.4%의 false positive slide change detection을 발생시켰고, 이는 합리적인 것으로 간주된다.

framesEncoded 유형은 unsigned long

audio에 대해서는 존재해서는 MUST NOT 안 된다. 이 RTP media stream에 대해 성공적으로 encode된 frame의 총수를 나타낸다.

keyFramesEncoded 유형은 unsigned long

audio에 대해서는 존재해서는 MUST NOT 안 된다. VP8 [RFC6386]의 key frame이나 H.264 [RFC6184]의 IDR-frame과 같은 key frame 중 이 RTP media stream에 대해 성공적으로 encode된 총수를 나타낸다. 이는 framesEncoded의 하위 집합이다. framesEncoded - keyFramesEncoded는 encode된 delta frame 수를 제공한다.

qpSum 유형은 unsigned long long

audio에 대해서는 존재해서는 MUST NOT 안 된다. 이 sender가 encode한 frame의 QP 값의 합이다. frame 수는 framesEncoded에 있다.

QP 값의 정의는 codec에 따라 달라진다. VP8의 경우 QP 값은 frame header에 syntax element y_ac_qi로 실린 값이며, [RFC6386] 19.2절에 정의되어 있다. 범위는 0..127이다.

QP 값은 사용된 quantizer 값을 나타내는 지표일 뿐임에 유의하라. 많은 format은 frame 내에서 quantizer 값을 달리할 수 있는 방법을 가진다.

psnrSum 유형은 record<DOMString, double>

하드웨어 노출이 허용되지 않는 한 존재해서는 MUST NOT 안 된다. (이것은 핑거프린팅 벡터이다.)

audio에 대해서는 존재해서는 MUST NOT 안 된다. 이 sender가 encode한 frame의 PSNR 값 누적 합이다. record는 "y", "u" 및 "v" component의 값을 포함한다. 측정 횟수는 psnrMeasurements에 있다.

PSNR은 [ISO-29170-1:2017]에 정의되어 있다.

참고

PSNR 메트릭은 frame별 절대적 진실을 나타내기보다는 통계 분석을 위한 것이다.

psnrMeasurements 유형은 unsigned long long

하드웨어 노출이 허용되지 않는 한 존재해서는 MUST NOT 안 된다. (이것은 핑거프린팅 벡터이다.)

audio에 대해서는 존재해서는 MUST NOT 안 된다. PSNR이 측정된 횟수이다. psnrSum의 component는 이 측정값과 함께 집계된다.

PSNR은 [ISO-29170-1:2017]에 정의되어 있다. PSNR 측정 빈도는 구현 정의이다.

참고

사용자 에이전트는 각 encoder implementation에 대해 고정된 빈도로 PSNR을 측정하고, 눈에 띄는 성능 저하를 유발하지 않는 한 가능한 한 자주 측정하는 것이 권장된다.

totalEncodeTime 유형은 double

audio에 대해서는 존재해서는 MUST NOT 안 된다. 이 stream의 framesEncoded frame을 encode하는 데 소비된 총 초 수이다. 평균 encode 시간은 이 값을 framesEncoded로 나누어 계산할 수 있다. 하나의 frame을 encode하는 데 걸리는 시간은 encoder에 frame을 공급한 시점부터 encoder가 그 frame에 대한 encoded data를 반환할 때까지 지난 시간이다. 이는 그 결과 data를 packetize하는 데 걸릴 수 있는 추가 시간은 포함하지 않는다.

totalPacketSendDelay 유형은 double

packet이 network로 전송되기 전에 로컬에서 buffer된 총 초 수이다. 시간은 packet이 RTP packetizer에서 emit된 시점부터 OS network socket으로 넘겨지는 시점까지 측정된다. 이 측정값은 totalPacketSendDelaypacketsSent가 증가할 때 더해진다.

qualityLimitationReason 유형은 RTCQualityLimitationReason

audio에 대해서는 존재해서는 MUST NOT 안 된다. 해상도 및/또는 framerate를 제한하는 현재 이유이거나, 제한되지 않는 경우 "none"이다.

구현체는 가장 제한적인 요인을 보고한다. 구현체가 여러 요인이 존재할 수 있어 가장 제한적인 요인을 결정할 수 없는 경우, 이유는 다음 우선순위 순서로 보고되어야 MUST 한다: "bandwidth", "cpu", "other".

참고

CPU 및 bandwidth resource의 소비는 상호 의존적이고 추정하기 어려워, "가장 제한적인 요인"이 무엇인지 결정하기 어렵다. 여기서 권장하는 우선순위 순서는 "bandwidth"가 일반적으로 더 변동적이므로 "cpu"보다 더 가능성 있고 더 유용한 signal이라는 heuristic에 기반한다.

qualityLimitationDurations 유형은 record<DOMString, double>

audio에 대해서는 존재해서는 MUST NOT 안 된다. 이 stream이 각 quality limitation state에서 소비한 총 시간(초)의 record이다. record는 "none"을 포함한 모든 RTCQualityLimitationReason type에 대한 mapping을 포함한다.

모든 entry의 합에서 qualityLimitationDurations["none"]을 빼면 stream이 제한된 총 시간을 얻을 수 있다.

qualityLimitationResolutionChanges 유형은 unsigned long

audio에 대해서는 존재해서는 MUST NOT 안 된다. quality limited 상태이기 때문에(qualityLimitationReason이 "none" 이외의 값을 가짐) 해상도가 변경된 횟수이다. counter는 처음에 0이며 해상도가 올라가거나 내려갈 때 증가한다. 예를 들어, 720p track이 얼마 동안 480p로 전송되다가 720p로 복구되면, qualityLimitationResolutionChanges는 값 2를 가진다.

nackCount 유형은 unsigned long

이 sender가 수신한 Negative ACKnowledgement (NACK) packet의 총수를 센다. 이는 [RFC4585] 6.2.1절에 정의되어 있다.

firCount 유형은 unsigned long

audio에 대해서는 존재해서는 MUST NOT 안 된다. 이 sender가 수신한 Full Intra Request (FIR) packet의 총수를 센다. 이는 [RFC5104] 4.3.1절에 정의되어 있다. [RFC2032]에 표시된 RTCP FIR은 계산하지 않는다. 이는 [RFC4587]에 의해 폐기되었다.

pliCount 유형은 unsigned long

audio에 대해서는 존재해서는 MUST NOT 안 된다. 이 sender가 수신한 Picture Loss Indication (PLI) packet의 총수를 센다. 이는 [RFC4585] 6.3.1절에 정의되어 있다.

encoderImplementation 유형은 DOMString

하드웨어 노출이 허용되지 않는 한 존재해서는 MUST NOT 안 된다. (이것은 핑거프린팅 벡터이다.)

audio에 대해서는 존재해서는 MUST NOT 안 된다. 사용된 encoder implementation을 식별한다. 이는 상호운용성 문제를 진단하는 데 유용하다.

powerEfficientEncoder 유형은 boolean

하드웨어 노출이 허용되지 않는 한 존재해서는 MUST NOT 안 된다. (이것은 핑거프린팅 벡터이다.)

audio에 대해서는 존재해서는 MUST NOT 안 된다. 현재 사용 중인 encoder가 사용자 에이전트에 의해 전력 효율적인 것으로 간주되는지 여부. 이는 구성이 hardware acceleration을 결과로 하는지 여부를 반영해야 SHOULD 하지만, 사용자 에이전트는 해당 구성이 전력 효율적인 것으로 간주되는지 결정할 때 다른 정보도 고려할 수 MAY 있다.

active 유형은 boolean

RTP stream이 전송되도록 구성되어 있는지 또는 비활성화되어 있는지를 나타낸다. active stream은 network condition에 의해 제한되는 경우처럼 실제로는 전송 중이 아닐 수도 있음에 유의하라.

scalabilityMode 유형은 DOMString

audio에 대해서는 존재해서는 MUST NOT 안 된다. 이 RTP stream에 대해 scalability mode가 현재 구성되어 있을 때만 존재한다.

packetsSentWithEct1 유형은 unsigned long long
[RFC3168] 5절에 정의되고 [RFC9331]에 설명된 L4S protocol에서 사용되는 ECT(1) marking이 있는, 이 SSRC에 대해 전송된 RTP packet의 총수.

8.9 RTCQualityLimitationReason enum

WebIDLenum RTCQualityLimitationReason {
            "none",
            "cpu",
            "bandwidth",
            "other",
          };
RTCQualityLimitationReason 열거형 설명
Enum 값 설명
none

resolution 및/또는 framerate가 제한되지 않는다.

cpu

resolution 및/또는 framerate가 주로 CPU load로 인해 제한된다.

bandwidth

resolution 및/또는 framerate가 bandwidth estimation 중 congestion cue로 인해 주로 제한된다. 일반적으로 congestion control algorithm은 bandwidth estimation을 수행하기 위해 inter-arrival time, round-trip time, packet 또는 다른 congestion cue를 사용한다.

other

resolution 및/또는 framerate가 위와 다른 이유로 주로 제한된다.

RTCRemoteOutboundRtpStreamStats 딕셔너리는 remote endpoint의 나가는 RTP stream에 대한 측정 메트릭을 나타낸다 (sending endpoint의 나가는 RTP stream에 대응한다). statistics 객체에 보고되는 timestamp는 대응하는 RTCP SR이 수신된 시점이다.

WebIDLdictionary RTCRemoteOutboundRtpStreamStats : RTCSentRtpStreamStats {
             DOMString           localId;
             DOMHighResTimeStamp remoteTimestamp;
             unsigned long long  reportsSent;
             double              roundTripTime;
             double              totalRoundTripTime;
             unsigned long long  roundTripTimeMeasurements;
};
localId 유형은 DOMString

localId는 같은 SSRC에 대한 로컬 RTCInboundRtpStreamStats 객체를 찾는 데 사용된다.

remoteTimestamp 유형은 DOMHighResTimeStamp

remoteTimestamp는, DOMHighResTimeStamp [HIGHRES-TIME] 유형이며, 이 statistics가 remote endpoint에 의해 전송된 remote timestamp를 나타낸다. 이는 statistics가 local endpoint에 의해 생성되었거나 수신된 시간을 나타내는 timestamp와 다르다. remoteTimestamp가 존재하는 경우, 이는 remote endpoint의 clock을 반영하는 RTCP Sender Report (SR) block의 NTP timestamp에서 파생된다. 해당 clock은 local clock과 동기화되어 있지 않을 수 있다.

reportsSent 유형은 unsigned long long

SSRC에 대해 전송된 RTCP Sender Report (SR) block의 총수를 나타낸다.

roundTripTime 유형은 double

[RFC3611]에 정의된 DLRR report block을 포함하는 최신 RTCP Sender Report (SR)를 기반으로 추정한 이 SSRC에 대한 round trip time이다. round trip time의 계산은 [RFC3611] 4.5절에 정의되어 있다. 최신 SR에 DLRR report block이 포함되어 있지 않거나, DLRR report block의 last RR timestamp가 zero이거나, DLRR report block의 delay since last RR 값이 zero이면 MUST NOT 존재해야 한다.

totalRoundTripTime 유형은 double

세션 시작 이후 모든 round trip time 측정값의 누적 합을 초 단위로 나타낸다. 개별 round trip time은 RTCP Sender Report (SR) [RFC3611]의 DLRR report block을 기반으로 계산된다. roundTripTime을 계산할 수 없는 경우, 이 counter는 증가하지 않는다. 평균 round trip time은 totalRoundTripTimeroundTripTimeMeasurements로 나누어 계산할 수 있다.

roundTripTimeMeasurements 유형은 unsigned long long

[RFC3611]에 따라 유효한 round trip time을 도출할 수 있는 DLRR report block을 포함하는, 이 SSRC에 대해 수신된 RTCP Sender Report (SR) block의 총수를 나타낸다. roundTripTime을 계산할 수 없는 경우, 이 counter는 증가하지 않는다.

8.11 RTCMediaSourceStats 딕셔너리

RTCMediaSourceStats 딕셔너리는 현재 하나 이상의 sender에 연결된 track을 나타낸다. 이는 encoding 이전의 frame rate 및 resolution과 같은 media source 정보를 포함한다. 이는 MediaStreamTrack에서 RTCRtpSender들로 전달되는 media이다. 이는 encoding 단계 이후에 측정된 메트릭을 설명하는 RTCOutboundRtpStreamStats의 멤버와 대조된다. 예를 들어, track은 고해상도 카메라에서 capture될 수 있고, 그 frame은 track constraint로 인해 downscale된 다음 CPU 및 network condition으로 인해 encoder에 의해 추가로 downscale될 수 있다. 이 딕셔너리는 track에서 전달되어 나온 video frame 또는 audio sample을 반영한다. 즉, track constraint가 적용된 후이지만 encoding이나 추가 downsampling이 발생하기 전이다.

Media source 객체는 하위 딕셔너리 RTCAudioSourceStats 또는 RTCVideoSourceStats 중 하나이다. type은 같은 ("media-source") 값이지만 kind는 track의 종류에 따라 ("audio" 또는 "video") 다르다.

media source stats 객체는 track이 어떤 RTCRtpSender에 연결될 때 생성되며, 이후 수명 동안 여러 sender에 연결될 수 있다. 이 객체의 수명은 track이 같은 RTCPeerConnection의 어떤 sender에도 더 이상 연결되지 않을 때 끝난다. media source 객체가 끝난 track이 다시 연결되면, counter(예: frame 수)가 재설정된 새로운 media source stats 객체가 생성된다.

WebIDLdictionary RTCMediaSourceStats : RTCStats {
             required DOMString       trackIdentifier;
             required DOMString       kind;
};

Dictionary RTCMediaSourceStats 멤버

trackIdentifier 유형은 DOMString

MediaStreamTrackid 속성 값.

kind 유형은 DOMString

MediaStreamTrackkind 속성 값. 이는 "audio" 또는 "video" 중 하나이다. "audio"이면 이 stats 객체는 RTCAudioSourceStats 유형이다. "video"이면 이 stats 객체는 RTCVideoSourceStats 유형이다.

8.12 RTCAudioSourceStats 딕셔너리

RTCAudioSourceStats 딕셔너리는 하나 이상의 sender에 연결된 audio track을 나타낸다. 이는 RTCMediaSourceStats이며, 그 kind"audio"이다.

WebIDLdictionary RTCAudioSourceStats : RTCMediaSourceStats {
              double              audioLevel;
              double              totalAudioEnergy;
              double              totalSamplesDuration;
              double              echoReturnLoss;
              double              echoReturnLossEnhancement;
};

Dictionary RTCAudioSourceStats 멤버

audioLevel 유형은 double

media source의 audio level을 나타낸다. 원격 source track의 audio level은 대신 RTCInboundRtpStreamStats를 참조하라.

값은 0..1(선형) 사이이며, 여기서 1.0은 0 dBov, 0은 silence를 나타내고, 0.5는 0 dBov에서 sound pressure level이 대략 6 dBSPL 변한 것을 나타낸다.

audioLeveltotalAudioEnergy 아래에 설명된 알고리즘을 사용하여 작은 구간에 대해 평균된다. 사용되는 구간은 구현 정의이다.

totalAudioEnergy 유형은 double

media source의 audio energy를 나타낸다. 원격 source track의 audio energy는 대신 RTCInboundRtpStreamStats를 참조하라.

이 값은 다음과 같이 계산되어야 MUST 한다. 이 stats 객체의 수명 동안 media source가 생성한 각 audio sample에 대해, sample 값을 encode 가능한 최고 intensity 값으로 나눈 뒤 제곱하고, sample의 지속 시간(초)을 곱한 값을 더한다. 즉, duration * Math.pow(energy/maxEnergy, 2)이다.

이는 [RFC6464]에 정의된 것처럼 audioLevel과 같은 단위를 사용하는 root mean square (RMS) 값을 얻는 데 사용할 수 있다. 공식 Math.sqrt(totalAudioEnergy/totalSamplesDuration)을 사용하여 이러한 단위로 변환할 수 있다. 이 계산은 원하는 임의의 시간 구간에 대한 평균 audio level을 계산하기 위해 서로 다른 두 getStats() 호출 값의 차이를 사용하여 수행할 수도 있다. 즉, Math.sqrt((energy2 - energy1)/(duration2 - duration1))를 수행한다.

예를 들어, 10ms audio packet이 RMS 0.5(1.0 중)로 생성되면, 이는 totalAudioEnergy0.5 * 0.5 * 0.01 = 0.0025를 더해야 한다. RMS 0.1인 또 다른 10ms packet이 수신되면, 마찬가지로 totalAudioEnergy0.0001을 더해야 한다. 그러면 Math.sqrt(totalAudioEnergy/totalSamplesDuration)Math.sqrt(0.0026/0.02) = 0.36이 되며, 이는 연속된 20ms audio 구간에 대해 RMS 계산을 수행하여 얻을 수 있는 값과 같다.

여러 audio channel이 사용되는 경우, sample의 audio energy는 어떤 channel의 가장 높은 energy를 가리킨다.

totalSamplesDuration 유형은 double

media source의 audio duration을 나타낸다. 원격 source track의 audio duration은 대신 RTCInboundRtpStreamStats를 참조하라.

이 stats 객체의 수명 동안 이 source가 생성한 모든 sample의 총 지속 시간을 초 단위로 나타낸다. totalAudioEnergy와 함께 사용하여 서로 다른 구간에 대한 평균 audio level을 계산할 수 있다.

echoReturnLoss 유형은 double

echo cancellation이 적용되는 microphone에서 MediaStreamTrack이 source될 때만 존재한다. [ECHO] (2012) 3.14절에 정의된 대로 decibel 단위로 계산된다.

여러 audio channel이 사용되는 경우, 어떤 sample에 대해서든 가장 낮은 audio energy의 channel이 고려된다.

echoReturnLossEnhancement 유형은 double

echo cancellation이 적용되는 microphone에서 MediaStreamTrack이 source될 때만 존재한다. [ECHO] (2012) 3.15절에 정의된 대로 decibel 단위로 계산된다.

여러 audio channel이 사용되는 경우, 어떤 sample에 대해서든 가장 낮은 audio energy의 channel이 고려된다.

8.13 RTCVideoSourceStats 딕셔너리

RTCVideoSourceStats 딕셔너리는 하나 이상의 sender에 연결된 video track을 나타낸다. 이는 RTCMediaSourceStats이며, 그 kind"video"이다.

WebIDLdictionary RTCVideoSourceStats : RTCMediaSourceStats {
             unsigned long   width;
             unsigned long   height;
             unsigned long   frames;
             double          framesPerSecond;
};

Dictionary RTCVideoSourceStats 멤버

width 유형은 unsigned long

이 source에서 발생한 마지막 frame의 너비이며, pixel 단위이다. frame이 생성되기 전에는 이 멤버가 MUST NOT 존재해야 한다.

height 유형은 unsigned long

이 source에서 발생한 마지막 frame의 높이이며, pixel 단위이다. frame이 생성되기 전에는 이 멤버가 MUST NOT 존재해야 한다.

frames 유형은 unsigned long

이 source에서 발생한 frame의 총수를 나타낸다.

framesPerSecond 유형은 double

이 source에서 발생한 frame 수이며, 지난 1초 동안 측정된다. 이 객체의 수명 중 첫 1초 동안에는 이 멤버가 MUST NOT 존재해야 한다.

8.14 RTCAudioPlayoutStats 딕셔너리

playout path가 audio device를 나타내는 경우에만 적용된다. 하나의 playout path를 나타낸다. 동일한 playout stats 객체가 여러 RTCInboundRtpStreamStats에 의해 참조되는 경우, 이는 audio mixing이 발생하고 있음을 나타내며, 이 경우 이 stats 객체의 sample counter는 mixing 이후의 sample을 가리킨다.

WebIDLdictionary RTCAudioPlayoutStats : RTCStats {
             required DOMString kind;
             double             synthesizedSamplesDuration;
             unsigned long      synthesizedSamplesEvents;
             double             totalSamplesDuration;
             double             totalPlayoutDelay;
             unsigned long long totalSamplesCount;
};
참고

RTCAudioPlayoutStats 딕셔너리와 그 모든 metric은 합의 부족으로 인해 위험 상태의 기능이다.

Dictionary RTCAudioPlayoutStats 멤버

kind 유형은 DOMString

audio playout에 대해 이는 "audio" 값을 가진다. 이는 재생 중인 MediaStreamTrackkind 속성을 반영한다.

synthesizedSamplesDuration 유형은 double

playout path가 device playout을 위해 audio sample을 제때 생성할 수 없으면, 대신 playout될 sample이 합성된다. synthesizedSamplesDuration은 초 단위로 측정되며, 이 playout path에 의해 audio sample이 합성될 때마다 증가한다. 이 metric은 totalSamplesDuration과 함께 사용하여 재생된 media 중 합성된 비율을 계산할 수 있다.

합성은 일반적으로 pipeline 성능이 부족한 경우에만 발생한다. RTCInboundRtpStreamStats에 의해 합성된 sample은 여기서 계산되지 않고, RTCInboundRtpStreamStats.concealedSamples에서 계산된다.

synthesizedSamplesEvents 유형은 unsigned long

synthesized samples event의 수이다. 이 counter는 non-synthesized sample 이후 sample이 합성될 때마다 증가한다. 즉, 연속된 여러 synthesized sample은 synthesizedSamplesDuration을 여러 번 증가시키지만, synthesization samples event는 하나이다.

totalSamplesDuration 유형은 double

playout된 모든 audio sample의 총 지속 시간이며, 초 단위이다. synthesized sample과 non-synthesized sample을 모두 포함한다.

totalPlayoutDelay 유형은 double

audio sample이 playout device에 의해 pull될 때, 이 counter는 해당 audio sample에 대한 playout path의 추정 delay만큼 증가한다. playout delay는 emit된 시점부터 device에서 실제 playout되는 시점까지의 delay를 포함한다. 이 metric은 totalSamplesCount와 함께 사용하여 sample당 평균 playout delay를 계산할 수 있다.

totalSamplesCount 유형은 unsigned long long

audio sample이 playout device에 의해 pull될 때, 이 counter는 playout을 위해 emit된 sample 수만큼 증가한다.

8.15 RTCPeerConnectionStats 딕셔너리

WebIDLdictionary RTCPeerConnectionStats : RTCStats {
            unsigned long dataChannelsOpened;
            unsigned long dataChannelsClosed;
};

Dictionary RTCPeerConnectionStats 멤버

dataChannelsOpened 유형은 unsigned long

수명 동안 "open" 상태에 들어간 고유한 RTCDataChannel의 수를 나타낸다.

dataChannelsClosed 유형은 unsigned long

수명 동안 "open" 상태를 벗어난 고유한 RTCDataChannel의 수를 나타낸다(어느 한쪽에 의해 닫혔거나 underlying transport가 닫혔기 때문). "connecting"에서 "closing" 또는 "closed"로 transition하면서 한 번도 "open"이 되지 않은 RTCDataChannel은 이 수에 포함되지 않는다.

언제든 열려 있는 data channel의 총수는 dataChannelsOpened - dataChannelsClosed로 계산할 수 있다. 이 수는 항상 양수이다.

8.16 RTCDataChannelStats 딕셔너리

WebIDLdictionary RTCDataChannelStats : RTCStats {
             DOMString           label;
             DOMString           protocol;
             unsigned short      dataChannelIdentifier;
             required RTCDataChannelState state;
             unsigned long       messagesSent;
             unsigned long long  bytesSent;
             unsigned long       messagesReceived;
             unsigned long long  bytesReceived;
};

Dictionary RTCDataChannelStats 멤버

label 유형은 DOMString
RTCDataChannel 객체의 label 값.
protocol 유형은 DOMString
RTCDataChannel 객체의 protocol 값.
dataChannelIdentifier 유형은 unsigned short

RTCDataChannel 객체의 id 속성.

state 유형은 RTCDataChannelState
RTCDataChannel 객체의 readyState 값.
messagesSent 유형은 unsigned long

전송된 API "message" event의 총수를 나타낸다.

bytesSent 유형은 unsigned long long

RTCDataChannel에서 전송된 payload byte의 총수를 나타낸다.

messagesReceived 유형은 unsigned long

수신된 API "message" event의 총수를 나타낸다.

bytesReceived 유형은 unsigned long long

RTCDataChannel에서 수신된 payload byte의 총수를 나타낸다.

8.17 RTCTransportStats 딕셔너리

RTCTransportStats 객체는 RTCDtlsTransport와 그 underlying RTCIceTransport에 대응하는 stats를 나타낸다. bundling이 사용되는 경우, bundle group의 모든 MediaStreamTrack에 단일 transport가 사용된다. bundling이 사용되지 않는 경우, 서로 다른 MediaStreamTrack은 서로 다른 transport를 사용한다. Bundling은 [WEBRTC]에 설명되어 있다.

WebIDLdictionary RTCTransportStats : RTCStats {
             unsigned long long    packetsSent;
             unsigned long long    packetsReceived;
             unsigned long long    bytesSent;
             unsigned long long    bytesReceived;
             RTCIceRole            iceRole;
             DOMString             iceLocalUsernameFragment;
             required RTCDtlsTransportState dtlsState;
             RTCIceTransportState  iceState;
             DOMString             selectedCandidatePairId;
             DOMString             localCertificateId;
             DOMString             remoteCertificateId;
             DOMString             tlsVersion;
             DOMString             dtlsCipher;
             RTCDtlsRole           dtlsRole;
             DOMString             srtpCipher;
             unsigned long         selectedCandidatePairChanges;
             unsigned long         ccfbMessagesSent;
	     unsigned long         ccfbMessagesReceived;
};

Dictionary RTCTransportStats 멤버

packetsSent 유형은 unsigned long long

이 transport를 통해 전송된 packet의 총수를 나타낸다.

packetsReceived 유형은 unsigned long long

이 transport에서 수신된 packet의 총수를 나타낸다.

bytesSent 유형은 unsigned long long

RTCIceTransport에서 전송된 payload byte의 총수를 나타낸다. 즉, header, padding 또는 ICE connectivity check는 포함하지 않는다.

bytesReceived 유형은 unsigned long long

RTCIceTransport에서 수신된 payload byte의 총수를 나타낸다. 즉, header, padding 또는 ICE connectivity check는 포함하지 않는다.

iceRole 유형은 RTCIceRole

underlying RTCDtlsTransport.iceTransportrole 속성의 현재 값으로 설정된다.

iceLocalUsernameFragment 유형은 DOMString

RTCIceTransport에 대한 message validation procedure [RFC5245]에서 사용되는 local username fragment의 현재 값으로 설정된다. setLocalDescription() 시 및 ICE restart 시 갱신될 수 있다.

dtlsState 유형은 RTCDtlsTransportState

underlying RTCDtlsTransportstate 속성의 현재 값으로 설정된다.

iceState 유형은 RTCIceTransportState

underlying RTCIceTransportstate 속성의 현재 값으로 설정된다.

selectedCandidatePairId 유형은 DOMString

이는 이 transport와 연관된 RTCIceCandidatePairStats를 생성하기 위해 검사된 객체와 연결된 고유 식별자이다.

localCertificateId 유형은 DOMString

DTLS가 협상된 component에 대해, local certificate를 제공한다.

remoteCertificateId 유형은 DOMString

DTLS가 협상된 component에 대해, remote certificate를 제공한다.

tlsVersion 유형은 DOMString

DTLS가 협상된 component에 대해, 합의된 TLS version이다. DTLS negotiation이 완료된 후에만 존재한다.

값은 존재하는 경우 ServerHello.supported_versions에서 오며, 그렇지 않으면 ServerHello.version에서 온다. 이는 version의 두 byte를 나타내는 4개의 대문자 hexadecimal digit으로 표현된다.

dtlsCipher 유형은 DOMString

IANA cipher suite registry [IANA-TLS-CIPHERS]의 "Description" 열에 정의된, DTLS transport에 사용되는 cipher suite의 설명적 이름.

dtlsRole 유형은 RTCDtlsRole

DTLS role에 따라 "client" 또는 "server"이다. DTLS negotiation이 시작되기 전에는 "unknown"이다.

srtpCipher 유형은 DOMString

IANA DTLS-SRTP protection profile registry [IANA-DTLS-SRTP]의 "Profile" 열에 정의되고 [RFC5764]에서 추가로 설명된, SRTP transport에 사용되는 protection profile의 설명적 이름.

selectedCandidatePairChanges 유형은 unsigned long

이 transport의 selected candidate pair가 변경된 횟수. selected candidate pair가 없는 상태에서 selected candidate pair가 있는 상태로, 또는 그 반대로 전환되는 경우도 이 counter를 증가시킨다. 초기값은 0이며, 초기 candidate pair가 선택되면 1이 된다.

ccfbMessagesSent 유형은 unsigned long

[RFC8888] 3.1절에 설명된 CongestionControl Feedback Packet 유형의 Transport-Layer Feedback Message 중, 이 transport에서 전송된 수.

ccfbMessagesReceived 유형은 unsigned long

[RFC8888] 3.1절에 설명된 CongestionControl Feedback Packet 유형의 Transport-Layer Feedback Message 중, 이 transport에서 수신된 수.

RTCDtlsRole enum

WebIDLenum RTCDtlsRole {
      "client",
      "server",
      "unknown",
};
RTCDtlsRole 열거형 설명
Enum 값 설명
client

RTCPeerConnection이 [RFC6347]에 정의된 DTLS client로 동작하고 있다.

server

RTCPeerConnection이 [RFC6347]에 정의된 DTLS server로 동작하고 있다.

unknown

RTCPeerConnection의 DTLS role이 아직 결정되지 않았다.

8.18 RTCIceCandidateStats 딕셔너리

RTCIceCandidateStats는 [RFC5245] 15.1절의 candidate 속성을 반영한다. 이는 RTCIceCandidate 객체에 대응한다.

WebIDLdictionary RTCIceCandidateStats : RTCStats {
             required DOMString       transportId;
             DOMString?               address;
             long                     port;
             DOMString                protocol;
             required RTCIceCandidateType candidateType;
             long                     priority;
             DOMString                url;
             RTCIceServerTransportProtocol relayProtocol;
             DOMString                foundation;
             DOMString                relatedAddress;
             long                     relatedPort;
             DOMString                usernameFragment;
             RTCIceTcpCandidateType   tcpType;
};

Dictionary RTCIceCandidateStats 멤버

transportId 유형은 DOMString

이는 이 candidate와 연관된 RTCTransportStats를 생성하기 위해 검사된 객체와 연결된 고유 식별자이다.

address 유형은 DOMString

이는 candidate의 address이며, IPv4 address, IPv6 address 및 fully qualified domain name (FQDN)을 허용한다. 자세한 내용은 [RFC5245] 15.1절을 참조하라.

사용자 에이전트는 웹 애플리케이션이 대응하는 RTCPeerConnection에 구성한 remote candidate address만 노출되도록 해야 한다. 이는 peer reflexive remote candidate에 특히 중요하다. 기본적으로 사용자 에이전트는 모든 remote candidate의 RTCIceCandidateStats 딕셔너리에서 address 멤버를 null로 두어야 MUST 한다. RTCPeerConnection 인스턴스가 웹 애플리케이션이 addIceCandidate()를 사용하여 address를 알게 되면, 사용자 에이전트는 새로 알게 된 address와 일치하는 대응 RTCPeerConnection의 모든 remote RTCIceCandidateStats 딕셔너리에서 'address' 멤버 값을 노출할 수 있다.

port 유형은 long

이는 candidate의 port number이다.

protocol 유형은 DOMString

transport에 대한 유효한 값은 "udp""tcp" 중 하나이다. [RFC5245] 15.1절에 정의된 "transport"를 기반으로 한다.

candidateType 유형은 RTCIceCandidateType

이 열거형은 [WEBRTC]에 정의되어 있다.

priority 유형은 long

[RFC5245] 15.1절에 정의된 대로 계산된다.

url 유형은 DOMString

"srflx" 유형 또는 "relay" 유형의 local candidate에 대해, 이는 candidate가 얻어진 ICE server의 URL이며 [WEBRTC]에 정의되어 있다.

remote candidate에 대해, 이 속성은 MUST NOT 존재해야 한다.

relayProtocol 유형은 RTCIceServerTransportProtocol

이는 endpoint가 TURN server와 통신하는 데 사용하는 protocol이다. 이는 local relay candidate에 대해서만 존재하며 [WEBRTC]에 정의되어 있다.

remote candidate에 대해, 이 속성은 MUST NOT 존재해야 한다.

foundation 유형은 DOMString

[RFC5245] 15.1절에 정의된 ICE foundation이다.

relatedAddress 유형은 DOMString

[RFC5245] 15.1절에 정의된 ICE rel-addr이다. serverreflexive, peerreflexive 및 relay candidate에 대해서만 설정된다.

relatedPort 유형은 long

[RFC5245] 15.1절에 정의된 ICE rel-addr이다. serverreflexive, peerreflexive 및 relay candidate에 대해서만 설정된다.

usernameFragment 유형은 DOMString

[RFC5245] 7.1.2.3절에 정의된 ICE username fragment이다. peerreflexive remote candidate에 대해서는 ICE username fragment가 이전에 signaling되지 않았다면 설정되지 않는다.

tcpType 유형은 RTCIceTcpCandidateType

RTCIceTcpCandidateType에 정의되고 RTCIceCandidate에서 사용되는 ICE candidate TCP type이다.

8.19 RTCIceCandidatePairStats 딕셔너리

WebIDLdictionary RTCIceCandidatePairStats : RTCStats {
             required DOMString            transportId;
             required DOMString            localCandidateId;
             required DOMString            remoteCandidateId;
             required RTCStatsIceCandidatePairState state;
             boolean                       nominated;
             unsigned long long            packetsSent;
             unsigned long long            packetsReceived;
             unsigned long long            bytesSent;
             unsigned long long            bytesReceived;
             DOMHighResTimeStamp           lastPacketSentTimestamp;
             DOMHighResTimeStamp           lastPacketReceivedTimestamp;
             double                        totalRoundTripTime;
             double                        currentRoundTripTime;
             double                        availableOutgoingBitrate;
             double                        availableIncomingBitrate;
             unsigned long long            requestsReceived;
             unsigned long long            requestsSent;
             unsigned long long            responsesReceived;
             unsigned long long            responsesSent;
             unsigned long long            consentRequestsSent;
             unsigned long                 packetsDiscardedOnSend;
             unsigned long long            bytesDiscardedOnSend;
};

Dictionary RTCIceCandidatePairStats 멤버

transportId 유형은 DOMString

이는 이 candidate pair와 연관된 RTCTransportStats를 생성하기 위해 검사된 객체와 연결된 고유 식별자이다.

localCandidateId 유형은 DOMString

이는 이 candidate pair와 연관된 local candidate에 대한 RTCIceCandidateStats를 생성하기 위해 검사된 객체와 연결된 고유 식별자이다.

remoteCandidateId 유형은 DOMString

이는 이 candidate pair와 연관된 remote candidate에 대한 RTCIceCandidateStats를 생성하기 위해 검사된 객체와 연결된 고유 식별자이다.

state 유형은 RTCStatsIceCandidatePairState

한 pair 내 local candidate와 remote candidate에 대한 checklist의 상태를 나타낸다.

nominated 유형은 boolean

[RFC5245] 7.1.3.2.4절에 설명된 nominated flag 갱신과 관련된다.

packetsSent 유형은 unsigned long long

이 candidate pair에서 전송된 packet의 총수를 나타낸다.

packetsReceived 유형은 unsigned long long

이 candidate pair에서 수신된 packet의 총수를 나타낸다.

bytesSent 유형은 unsigned long long

이 candidate pair에서 전송된 payload byte의 총수를 나타낸다. 즉, header, padding 또는 ICE connectivity check는 포함하지 않는다.

bytesReceived 유형은 unsigned long long

이 candidate pair에서 수신된 payload byte의 총수를 나타낸다. 즉, header, padding 또는 ICE connectivity check는 포함하지 않는다.

lastPacketSentTimestamp 유형은 DOMHighResTimeStamp

이 특정 candidate pair에서 마지막 packet이 전송된 시점의 timestamp를 나타낸다. STUN packet은 제외한다.

lastPacketReceivedTimestamp 유형은 DOMHighResTimeStamp

이 특정 candidate pair에서 마지막 packet이 수신된 시점의 timestamp를 나타낸다. STUN packet은 제외한다.

totalRoundTripTime 유형은 double

STUN connectivity check [STUN-PATH-CHAR] response(responsesReceived)를 기반으로, consent를 검증하기 위해 전송된 request에 대한 response [RFC7675]를 포함하여, session 시작 이후 모든 round trip time 측정값의 합을 초 단위로 나타낸다. 평균 round trip time은 totalRoundTripTimeresponsesReceived로 나누어 계산할 수 있다.

currentRoundTripTime 유형은 double

consent verification을 위해 전송된 것 [RFC7675]을 포함하여, STUN connectivity check [STUN-PATH-CHAR]에서 계산된 최신 round trip time을 초 단위로 나타낸다.

availableOutgoingBitrate 유형은 double

underlying congestion control이 이 candidate pair를 사용하는 모든 outgoing RTP stream에 대한 사용 가능한 bitrate를 결합하여 계산한다. bitrate 측정은 IP 또는 TCP나 UDP와 같은 다른 transport layer의 크기를 계산하지 않는다. 이는 [RFC3890]에 정의된 TIAS와 유사하다. 즉 bits per second 단위로 측정되며 bitrate는 1초 window에 대해 계산된다. 사용 중인 candidate pair의 경우, estimate는 일반적으로 lastPacketSentTimestamp에 전송된 packet의 bitrate보다 낮지 않지만 더 높을 수 있다.

underlying congestion control이 예를 들어 TWCC와 같은 메커니즘을 사용하여 send-side bandwidth estimation을 계산했거나, 예를 들어 REMB에 설명된 것과 같은 receive-side estimation을 RTCP를 통해 수신한 경우에만 존재한다. bandwidth estimation에 고려된 packet 전송에 사용된 적이 없는 candidate pair 또는 이전에는 사용되었지만 현재 사용 중이 아닌 candidate pair에 대해서는 MUST NOT 존재해야 한다.

availableIncomingBitrate 유형은 double

underlying congestion control이 이 candidate pair를 사용하는 모든 incoming RTP stream에 대한 사용 가능한 bitrate를 결합하여 계산한다. bitrate 측정은 IP 또는 TCP나 UDP와 같은 다른 transport layer의 크기를 계산하지 않는다. 이는 [RFC3890]에 정의된 TIAS와 유사하다. 즉 bits per second 단위로 측정되며 bitrate는 1초 window에 대해 계산된다. 사용 중인 pair의 경우, estimate는 일반적으로 lastPacketReceivedTimestamp에 수신된 packet의 bitrate보다 낮지 않지만 더 높을 수 있다.

예를 들어 REMB와 같은 receive-side bandwidth estimation이 계산된 경우에만 존재한다. bandwidth estimation에 고려된 packet 수신에 사용된 적이 없는 candidate pair 또는 이전에는 사용되었지만 현재 사용 중이 아닌 candidate pair에 대해서는 MUST NOT 존재해야 한다.

requestsReceived 유형은 unsigned long long

수신된 connectivity check request의 총수(retransmission 포함)를 나타낸다. receiver는 request가 connectivity를 확인하기 위해 전송되었는지 consent를 확인하기 위해 전송되었는지 알 수 없으므로, 모든 connectivity check request가 여기에 계산된다.

requestsSent 유형은 unsigned long long

전송된 connectivity check request의 총수(retransmission 제외)를 나타낸다.

responsesReceived 유형은 unsigned long long

수신된 connectivity check response의 총수를 나타낸다.

responsesSent 유형은 unsigned long long

전송된 connectivity check response의 총수를 나타낸다. connectivity check request와 consent request를 구별할 수 없으므로, 모든 response가 계산된다.

consentRequestsSent 유형은 unsigned long long

전송된 consent request의 총수를 나타낸다.

packetsDiscardedOnSend 유형은 unsigned long

socket error로 인해 폐기된 이 candidate pair의 packet 총수. 즉, packet을 socket에 넘길 때 socket error가 발생했다. 이는 full buffer나 사용 가능한 memory 없음 등 다양한 이유로 발생할 수 있다.

bytesDiscardedOnSend 유형은 unsigned long long

socket error로 인해 폐기된 이 candidate pair의 byte 총수. 즉, byte를 포함하는 packet을 socket에 넘길 때 socket error가 발생했다. 이는 full buffer나 사용 가능한 memory 없음 등 다양한 이유로 발생할 수 있다. [RFC3550] 6.4.1절에 정의된 대로 계산된다.

8.19.1 RTCStatsIceCandidatePairState enum

WebIDLenum RTCStatsIceCandidatePairState {
    "frozen",
    "waiting",
    "in-progress",
    "failed",
    "succeeded"
};
RTCStatsIceCandidatePairState 열거형 설명
Enum 값 설명
frozen

[RFC5245] 5.7.4절에 정의되어 있다.

waiting

[RFC5245] 5.7.4절에 정의되어 있다.

in-progress

[RFC5245] 5.7.4절에 정의되어 있다.

failed

[RFC5245] 5.7.4절에 정의되어 있다.

succeeded

[RFC5245] 5.7.4절에 정의되어 있다.

8.20 RTCCertificateStats 딕셔너리

WebIDLdictionary RTCCertificateStats : RTCStats {
             required DOMString fingerprint;
             required DOMString fingerprintAlgorithm;
             required DOMString base64Certificate;
             DOMString issuerCertificateId;
};

Dictionary RTCCertificateStats 멤버

fingerprint 유형은 DOMString

certificate의 fingerprint. [RFC4572] 5절에 정의된 fingerprint 값만 사용한다.

fingerprintAlgorithm 유형은 DOMString

certificate fingerprint를 계산하는 데 사용된 hash function. 예: "sha-256".

base64Certificate 유형은 DOMString

certificate의 DER-encoded base-64 표현.

issuerCertificateId 유형은 DOMString

issuerCertificateId는 certificate chain에서 다음 certificate를 포함하는 stats 객체를 가리킨다. 현재 certificate가 chain의 끝(즉 self-signed certificate)에 있으면, 이는 설정되지 않는다.

9. 예제

9.1 stats 애플리케이션의 예

사용자가 나쁜 음질을 경험하고 있고 애플리케이션이 그 원인이 packet loss인지 판별하려는 경우를 생각해 보라. 다음 예제 코드를 사용할 수 있다.

var baselineReport, currentReport;
var sender = pc.getSenders()[0];

sender.getStats().then(function (report) {
    baselineReport = report;
})
.then(function() {
    return new Promise(function(resolve) {
        setTimeout(resolve, aBit); // ... 잠시 기다린다
    });
})
.then(function() {
    return sender.getStats();
})
.then(function (report) {
    currentReport = report;
    processStats();
})
.catch(function (error) {
  console.log(error.toString());
});

function processStats() {
    // current report의 요소를 baseline과 비교한다
    for (let now of currentReport.values()) {
        if (now.type != "outbound-rtp")
            continue;

        // baseline report에서 대응하는 stats를 가져온다
        let base = baselineReport.get(now.id);

        if (base) {
            remoteNow = currentReport.get(now.remoteId);
            remoteBase = baselineReport.get(base.remoteId);

            var packetsSent = now.packetsSent - base.packetsSent;
            var packetsReceived = remoteNow.packetsReceived - remoteBase.packetsReceived;

            // intervalFractionLoss가 > 0.3이면, 원인을 찾았을 가능성이 높다
            var intervalFractionLoss = (packetsSent - packetsReceived) / packetsSent;
        }
    });
}

10. 보안 및 프라이버시 고려 사항

WebRTC Statistics가 노출하는 데이터에는 [GETUSERMEDIA] 및 [WEBRTC]가 노출하는 대부분의 media 및 network 데이터도 포함된다. 따라서 데이터 노출과 관련한 이러한 명세들의 모든 프라이버시 및 보안 고려 사항은 이 명세에도 적용된다.

또한 RTCReceivedRtpStreamStats, RTCRemoteInboundRtpStreamStats, RTCSentRtpStreamStats, RTCOutboundRtpStreamStats, RTCRemoteOutboundRtpStreamStats, RTCIceCandidatePairStats, RTCTransportStats가 노출하는 속성들은 현재 JavaScript 계층에서 사용할 수 없는 network-layer 데이터를 노출한다.

WebRTC 1.0 명세에서 논의된 IP address 노출과 관련된 위험을 넘어서, 이 명세가 고유하게 노출하는 network 속성들의 일부 조합은 위치와 상관관계를 가질 수 있다.

예를 들어, RTCRemoteInboundRtpStreamStats에 노출되는 round-trip time은 peer들이 얼마나 멀리 떨어져 있는지에 대한 대략적인 표시를 제공할 수 있으며, 따라서 한 peer의 위치가 알려져 있다면 다른 peer에 관한 정보를 드러낼 수 있다.

isolated stream에 적용되는 경우, media metric은 애플리케이션이 해당 isolated stream의 일부 특성을 추론할 수 있게 할 수 있다. 예를 들어 audioLevel statistic을 관찰하여 누군가 말하고 있는지 추론할 수 있다.

다음 stats는 민감한 것으로 간주되며, isolated media stream에 대해 보고되어서는 MUST NOT 안 된다.

A. 유형별 WebRTC stats field 요약

RTCStatsType 딕셔너리 필드
"codec" RTCStats timestamp
type
id
RTCCodecStats payloadType
transportId
mimeType
clockRate
channels
sdpFmtpLine
"inbound-rtp" RTCStats timestamp
type
id
RTCRtpStreamStats ssrc
kind
transportId
codecId
RTCReceivedRtpStreamStats packetsReceived
packetsReceivedWithEct1
packetsReceivedWithCe
packetsReportedAsLost
packetsReportedAsLostButRecovered
packetsLost
jitter
RTCInboundRtpStreamStats trackIdentifier
mid
remoteId
framesDecoded
keyFramesDecoded
framesRendered
framesDropped
frameWidth
frameHeight
framesPerSecond
qpSum
totalDecodeTime
totalInterFrameDelay
totalSquaredInterFrameDelay
pauseCount
totalPausesDuration
freezeCount
totalFreezesDuration
lastPacketReceivedTimestamp
headerBytesReceived
packetsDiscarded
fecBytesReceived
fecPacketsReceived
fecPacketsDiscarded
bytesReceived
nackCount
firCount
pliCount
totalProcessingDelay
estimatedPlayoutTimestamp
jitterBufferDelay
jitterBufferTargetDelay
jitterBufferEmittedCount
jitterBufferMinimumDelay
totalSamplesReceived
concealedSamples
silentConcealedSamples
concealmentEvents
insertedSamplesForDeceleration
removedSamplesForAcceleration
audioLevel
totalAudioEnergy
totalSamplesDuration
framesReceived
decoderImplementation
playoutId
powerEfficientDecoder
framesAssembledFromMultiplePackets
totalAssemblyTime
retransmittedPacketsReceived
retransmittedBytesReceived
rtxSsrc
fecSsrc
totalCorruptionProbability
totalSquaredCorruptionProbability
corruptionMeasurements
"outbound-rtp" RTCStats timestamp
type
id
RTCRtpStreamStats ssrc
kind
transportId
codecId
RTCSentRtpStreamStats packetsSent
bytesSent
RTCOutboundRtpStreamStats mid
mediaSourceId
remoteId
rid
encodingIndex
headerBytesSent
retransmittedPacketsSent
retransmittedBytesSent
rtxSsrc
targetBitrate
totalEncodedBytesTarget
frameWidth
frameHeight
framesPerSecond
framesSent
hugeFramesSent
framesEncoded
keyFramesEncoded
qpSum
psnrSum
psnrMeasurements
totalEncodeTime
totalPacketSendDelay
qualityLimitationReason
qualityLimitationDurations
qualityLimitationResolutionChanges
nackCount
firCount
pliCount
encoderImplementation
powerEfficientEncoder
active
scalabilityMode
packetsSentWithEct1
"remote-inbound-rtp" RTCStats timestamp
type
id
RTCRtpStreamStats ssrc
kind
transportId
codecId
RTCReceivedRtpStreamStats packetsReceived
packetsReceivedWithEct1
packetsReceivedWithCe
packetsReportedAsLost
packetsReportedAsLostButRecovered
packetsLost
jitter
RTCRemoteInboundRtpStreamStats localId
roundTripTime
totalRoundTripTime
fractionLost
roundTripTimeMeasurements
packetsWithBleachedEct1Marking
"remote-outbound-rtp" RTCStats timestamp
type
id
RTCRtpStreamStats ssrc
kind
transportId
codecId
RTCSentRtpStreamStats packetsSent
bytesSent
RTCRemoteOutboundRtpStreamStats localId
remoteTimestamp
reportsSent
roundTripTime
totalRoundTripTime
roundTripTimeMeasurements
"media-source" RTCStats timestamp
type
id
RTCMediaSourceStats trackIdentifier
kind
RTCAudioSourceStats audioLevel
totalAudioEnergy
totalSamplesDuration
echoReturnLoss
echoReturnLossEnhancement
RTCVideoSourceStats width
height
frames
framesPerSecond
"media-playout" RTCStats timestamp
type
id
RTCAudioPlayoutStats kind
synthesizedSamplesDuration
synthesizedSamplesEvents
totalSamplesDuration
totalPlayoutDelay
totalSamplesCount
"peer-connection" RTCStats timestamp
type
id
RTCPeerConnectionStats dataChannelsOpened
dataChannelsClosed
"data-channel" RTCStats timestamp
type
id
RTCDataChannelStats label
protocol
dataChannelIdentifier
state
messagesSent
bytesSent
messagesReceived
bytesReceived
"transport" RTCStats timestamp
type
id
RTCTransportStats packetsSent
packetsReceived
bytesSent
bytesReceived
iceRole
iceLocalUsernameFragment
dtlsState
iceState
selectedCandidatePairId
localCertificateId
remoteCertificateId
tlsVersion
dtlsCipher
dtlsRole
srtpCipher
selectedCandidatePairChanges
ccfbMessagesSent
ccfbMessagesReceived
"candidate-pair" RTCStats timestamp
type
id
RTCIceCandidatePairStats transportId
localCandidateId
remoteCandidateId
state
nominated
packetsSent
packetsReceived
bytesSent
bytesReceived
lastPacketSentTimestamp
lastPacketReceivedTimestamp
totalRoundTripTime
currentRoundTripTime
availableOutgoingBitrate
availableIncomingBitrate
requestsReceived
requestsSent
responsesReceived
responsesSent
consentRequestsSent
packetsDiscardedOnSend
bytesDiscardedOnSend
"local-candidate" RTCStats timestamp
type
id
RTCIceCandidateStats transportId
address
port
protocol
candidateType
priority
url
relayProtocol
foundation
relatedAddress
relatedPort
usernameFragment
tcpType
"remote-candidate" RTCStats timestamp
type
id
RTCIceCandidateStats transportId
address
port
protocol
candidateType
priority
url
relayProtocol
foundation
relatedAddress
relatedPort
usernameFragment
tcpType
"certificate" RTCStats timestamp
type
id
RTCCertificateStats fingerprint
fingerprintAlgorithm
base64Certificate
issuerCertificateId

B. 감사의 말

편집자들은 지원을 제공한 Working Group 의장인 Stefan Håkansson과 Team Contact인 Dominique Hazaël-Massieux에게 감사를 표하고자 한다. 편집자들은 이 명세에 기여한 Bernard Aboba, Taylor Brandstetter, Henrik Boström, Jan-Ivar Bruaroey, Karthik Budigere, Cullen Jennings 및 Lennart Schulte에게 감사를 표하고자 한다.

C. 참고 문헌

C.1 규범적 참고 문헌

[API-DESIGN-PRINCIPLES]
Web Platform Design Principles. Martin Thomson; Jeffrey Yasskin. W3C. 18 September 2025. W3C Working Group Note. URL: https://www.w3.org/TR/design-principles/
[ECHO]
Digital network echo cancellers. ITU-T G.168. ITU-T. Standard. URL: https://www.itu.int/rec/T-REC-G.168/en
[GETUSERMEDIA]
Media Capture and Streams. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; youenn fablet. W3C. 11 September 2025. CRD. URL: https://www.w3.org/TR/mediacapture-streams/
[HIGHRES-TIME]
High Resolution Time. Yoav Weiss. W3C. 7 November 2024. W3C Working Draft. URL: https://www.w3.org/TR/hr-time-3/
[IANA-DTLS-SRTP]
DTLS-SRTP Protection Profiles. IANA. URL: https://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml
[IANA-MEDIA-TYPES]
Media Types. IANA. URL: https://www.iana.org/assignments/media-types/
[IANA-TLS-CIPHERS]
TLS Cipher Suite Registry. IANA. URL: https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4
[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[ISO-29170-1:2017]
Information technology — Advanced image coding and evaluation. ISO. URL: https://www.iso.org/standard/63637.html
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC3168]
The Addition of Explicit Congestion Notification (ECN) to IP. K. Ramakrishnan; S. Floyd; D. Black. IETF. September 2001. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc3168
[RFC3550]
RTP: A Transport Protocol for Real-Time Applications. H. Schulzrinne; S. Casner; R. Frederick; V. Jacobson. IETF. July 2003. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc3550
[RFC3611]
RTP Control Protocol Extended Reports (RTCP XR). T. Friedman, Ed.; R. Caceres, Ed.; A. Clark, Ed. IETF. November 2003. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc3611
[RFC3890]
A Transport Independent Bandwidth Modifier for the Session Description Protocol (SDP). M. Westerlund. IETF. September 2004. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc3890
[RFC4572]
Connection-Oriented Media Transport over the Transport Layer Security (TLS) Protocol in the Session Description Protocol (SDP). J. Lennox. IETF. July 2006. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc4572
[RFC4585]
Extended RTP Profile for Real-time Transport Control Protocol (RTCP)-Based Feedback (RTP/AVPF). J. Ott; S. Wenger; N. Sato; C. Burmeister; J. Rey. IETF. July 2006. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc4585
[RFC5104]
Codec Control Messages in the RTP Audio-Visual Profile with Feedback (AVPF). S. Wenger; U. Chandra; M. Westerlund; B. Burman. IETF. February 2008. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5104
[RFC5226]
Guidelines for Writing an IANA Considerations Section in RFCs. T. Narten; H. Alvestrand. IETF. May 2008. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc5226
[RFC5245]
Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal for Offer/Answer Protocols. J. Rosenberg. IETF. April 2010. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5245
[RFC5764]
Datagram Transport Layer Security (DTLS) Extension to Establish Keys for the Secure Real-time Transport Protocol (SRTP). D. McGrew; E. Rescorla. IETF. May 2010. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5764
[RFC6184]
RTP Payload Format for H.264 Video. Y.-K. Wang; R. Even; T. Kristensen; R. Jesup. IETF. May 2011. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6184
[RFC6347]
Datagram Transport Layer Security Version 1.2. E. Rescorla; N. Modadugu. IETF. January 2012. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6347
[RFC6386]
VP8 Data Format and Decoding Guide. J. Bankoski; J. Koleszar; L. Quillio; J. Salonen; P. Wilkins; Y. Xu. IETF. November 2011. Informational. URL: https://www.rfc-editor.org/rfc/rfc6386
[RFC6464]
A Real-time Transport Protocol (RTP) Header Extension for Client-to-Mixer Audio Level Indication. J. Lennox, Ed.; E. Ivov; E. Marocco. IETF. December 2011. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6464
[RFC7002]
RTP Control Protocol (RTCP) Extended Report (XR) Block for Discard Count Metric Reporting. A. Clark; G. Zorn; Q. Wu. IETF. September 2013. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7002
[RFC7004]
RTP Control Protocol (RTCP) Extended Report (XR) Blocks for Summary Statistics Metrics Reporting. G. Zorn; R. Schott; Q. Wu, Ed.; R. Huang. IETF. September 2013. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7004
[RFC7656]
A Taxonomy of Semantics and Mechanisms for Real-Time Transport Protocol (RTP) Sources. J. Lennox; K. Gross; S. Nandakumar; G. Salgueiro; B. Burman, Ed. IETF. November 2015. Informational. URL: https://www.rfc-editor.org/rfc/rfc7656
[RFC7675]
Session Traversal Utilities for NAT (STUN) Usage for Consent Freshness. M. Perumal; D. Wing; R. Ravindranath; T. Reddy; M. Thomson. IETF. October 2015. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7675
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC8829]
JavaScript Session Establishment Protocol (JSEP). J. Uberti; C. Jennings; E. Rescorla, Ed. IETF. January 2021. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8829
[RFC8888]
RTP Control Protocol (RTCP) Feedback for Congestion Control. Z. Sarker; C. Perkins; V. Singh; M. Ramalho. IETF. January 2021. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8888
[RFC9331]
The Explicit Congestion Notification (ECN) Protocol for Low Latency, Low Loss, and Scalable Throughput (L4S). K. De Schepper; B. Briscoe, Ed. IETF. January 2023. Experimental. URL: https://www.rfc-editor.org/rfc/rfc9331
[STUN-PATH-CHAR]
Discovery of path characteristics using STUN. T. Reddy; D. Wing; P. Martinsen; V. Singh. IETF. Internet Draft. URL: https://datatracker.ietf.org/doc/html/draft-reddy-tram-stun-path-data
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/
[WEBRTC]
WebRTC: Real-Time Communication in Browsers. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; Florent Castelli. W3C. 13 March 2025. W3C Recommendation. URL: https://www.w3.org/TR/webrtc/
[WEBRTC-IDENTITY]
Identity for WebRTC 1.0. Cullen Jennings; Martin Thomson. W3C. 27 September 2018. W3C Candidate Recommendation. URL: https://www.w3.org/TR/webrtc-identity/
[WEBRTC-PRIORITY]
WebRTC Priority Control API. Harald Alvestrand. W3C. 18 March 2021. W3C Candidate Recommendation. URL: https://www.w3.org/TR/webrtc-priority/
[XRBLOCK-STATS]
RTCP XR Metrics for WebRTC. Varun Singh; Rachel Huang; Roni Even; Dan Romascanu; Lingli Deng. IETF. Internet Draft. URL: https://datatracker.ietf.org/doc/html/draft-ietf-xrblock-rtcweb-rtcp-xr-metrics

C.2 정보성 참고 문헌

[RFC2032]
RTP Payload Format for H.261 Video Streams. T. Turletti; C. Huitema. IETF. October 1996. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc2032
[RFC4587]
RTP Payload Format for H.261 Video Streams. R. Even. IETF. August 2006. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc4587