本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
C SDK 的用戶端指標
使用 Amazon Kinesis Video Streams with WebRTC 建置的應用程式由各種移動組件組成,包括聯網、訊號、候選者交換、對等連線和資料交換。C 中的 Kinesis Video Streams with WebRTC 支援各種用戶端指標,可讓您監控和追蹤應用程式中這些元件的效能和用量。支援的指標分為兩個主要類別:專門為 Kinesis Video Streams 的訊號和聯網實作定義的自訂指標,以及衍生自 W3C
訊號指標
訊號指標可用來了解訊號用戶端在應用程式執行時的行為。您可以使用 STATUS signalingClientGetMetrics (SIGNALING_CLIENT_HANDLE, PSignalingClientMetrics) API 來取得這些訊號指標。以下是使用模式範例:
SIGNALING_CLIENT_HANDLE signalingClientHandle; SignalingClientMetrics signalingClientMetrics; STATUS retStatus = signalingClientGetMetrics(signalingClientHandle, &signalingClientMetrics); printf("Signaling client connection duration: %" PRIu64 " ms", (signalingClientMetrics.signalingClientStats.connectionDuration / HUNDREDS_OF_NANOS_IN_A_MILLISECOND));
您可以在 Stats.hsignalingClientStats中找到 的定義。
目前支援下列訊號指標:
| 指標 | Description |
|---|---|
| cpApiCallLatency | 計算控制平面 API 呼叫的延遲。使用指數移動平均 (EMA) 完成計算。相關聯的呼叫包括: describeChannel、createChannel、getChannelEndpoint 和 deleteChannel。 |
| dpApiCallLatency | 計算資料平面 API 呼叫的延遲。使用指數移動平均 (EMA) 完成計算。相關聯的呼叫包括:getIceConfig。 |
| signalingClientUptime | 這表示用戶端物件存在的時間。每次叫用此指標時,都會發出最新的執行時間值。 |
| connectionDuration | 如果建立連線,這會發出連線存活的持續時間。否則,會發出 0 的值。這與發出用戶端正常運作時間不同,因為連線會不斷出現,但 signalingClientUptime 表示用戶端物件本身。 |
| numberOfMessagesSent | 此值會在對等傳送優惠、回答或 ICE 候選項目時更新。 |
| numberOfMessagesReceived | 與 numberOfMessagesSent 不同,此指標會針對任何類型的訊號訊息進行更新。訊號訊息的類型可在 中使用SIGNALING_MESSAGE_TYPE。 |
| iceRefreshCount | 這會在叫用 getIceConfig 時遞增。調用此 的速率是以 TTL 為基礎,做為所收到 ICE 組態的一部分。每次收到一組新的 ICE 組態時,都會將計時器設定為下次重新整理,因為組態中的登入資料有效性減去一些寬限期。 |
| numberOfErrors | 計數器用於追蹤訊號用戶端內產生的錯誤數目。取得 ICE 組態、取得訊號狀態、追蹤訊號指標、傳送訊號訊息,以及將訊號用戶端連線至 Web 通訊端以追蹤傳送/接收訊息時所產生的錯誤。 |
| numberOfRuntimeErrors | 指標包含訊號用戶端核心執行時所發生的錯誤。這裡會追蹤重新連線失敗、訊息接收失敗和 ICE 組態重新整理錯誤等案例。 |
| numberOfReconnects | 指標會在每次重新連線時遞增。這是了解 設定中網路連線穩定性的實用指標。 |
C SDK 支援的 W3C 標準指標
使用 W3C
-
網路:
-
Ice Candidate
:這些指標提供有關所選本機和遠端候選項目的資訊,以便在對等之間進行資料交換。這包括候選伺服器的伺服器來源、IP 地址、為通訊選取的候選類型,以及候選優先順序。這些指標可作為快照報告。 -
Ice 伺服器
:這些指標用於收集支援的不同 ICE 伺服器的操作資訊。這在嘗試了解主要用於通訊和連線檢查的伺服器時非常有用。在某些情況下,如果收集候選項目失敗,檢查這些指標也很有用。 -
Ice Candidate Pair
:這些指標用於了解在對等和時間相關測量之間交換的位元組/封包數量。
-
-
媒體和資料:
您可以使用 STATUS rtcPeerConnectionGetMetrics (PRtcPeerConnection, PRtcRtpTransceiver, PRtcStats) API 來收集與 ICE、RTP 和資料通道相關的指標。以下是使用範例:
RtcStats rtcStats; rtcStats.requestedTypeOfStats = RTC_STATS_TYPE_LOCAL_CANDIDATE; STATUS retStatus = rtcPeerConnectionGetMetrics (pRtcPeerConnection, NULL, &rtcStats); printf(“Local Candidate address: %s\n”, rtcStats.rtcStatsObject.localIceCandidateStats.address);
以下是另一個顯示使用模式以取得收發器相關統計資料的範例:
RtcStats rtcStats; PRtcRtpTransceiver pVideoRtcRtpTransceiver; rtcStats.requestedTypeOfStats = RTC_STATS_TYPE_OUTBOUND_RTP; STATUS retStatus = rtcPeerConnectionGetMetrics (pRtcPeerConnection, pVideoRtcRtpTransceiver, &rtcStats); printf(“Number of packets discarded on send: %s\n”, rtcStats.rtcStatsObject.outboundRtpStreamStats.packetsDiscardedOnSend);
在上述範例中,如果 rtcPeerConnectionGetMetrics() 的第二個引數是 NULL,則會傳回清單中第一個收發器的資料。
rtcStatsObject 的定義可在 Stats.h
您可以在 WebRTC C SDK 儲存庫的範例目錄中,以及 Kinesis Video Streams 示範儲存庫
使用 W3C
聯網
ICE 伺服器指標:
| 指標 | Description |
|---|---|
| URL | 要追蹤之 STUN/TURN 伺服器的 URL |
| 連接埠 | 用戶端使用的連接埠號碼 |
| 通訊協定 | 從 ICE 伺服器 URI 擷取的傳輸通訊協定。如果值為 UDP,ICE 會透過 UDP 嘗試 TURN,否則 ICE 會透過 TCP/TLS 嘗試 TURN。如果 URI 不包含傳輸,ICE 會透過 UDP 和 TCP/TLS 嘗試 TURN。如果是 STUN 伺服器,此欄位為空白。 |
| 傳送的請求總數 | 值會針對每個 srflx 候選請求更新,同時從輪換候選項目傳送繫結請求。 |
| 收到的回應總數 | 每次收到 STUN 繫結回應時,都會更新此值。 |
| 往返時間總計 | 每次收到請求的同等回應時,此值都會更新。系統會使用檢查總和做為金鑰,在雜湊映射中追蹤請求封包。 |
ICE 候選統計資料:僅包含所選候選項目 (本機和遠端) 的相關資訊。
| 指標 | Description |
|---|---|
| address | 這表示本機和遠端候選項目的 IP 地址。 |
| port | 候選的連接埠號碼 |
| protocol | 用來取得候選項目的通訊協定。有效值為 UDP/TCP。 |
| candidateType | 選取的候選類型 - 主機、srflx 或轉送。 |
| priority | 所選本機和遠端候選項目的優先順序。 |
| url | 所選本機候選項目的來源。這會顯示所選候選項目是否從 STUN 伺服器或 TURN 伺服器接收。 |
| relayProtocol | 如果使用 TURN 伺服器來取得選取的本機候選項目,此欄位會指出使用哪個通訊協定來取得它。有效值為 TCP/UDP。 |
ICE 候選配對統計資料:僅包含所選候選配對的相關資訊。
| 指標 | Description |
|---|---|
| localCandidateId | 配對中所選本機候選項目的 ID。 |
| remoteCandidateId | 配對中所選遠端候選項目的 ID。 |
| state | 正在檢查的候選配對狀態。 |
| 已指定 | 設定為 TRUE,因為正在為選取的候選配對提取統計資料。 |
| packetsSent | 傳送的封包數量。這是在 . 呼叫中計算的writeFrame。此資訊也可以從傳出的 RTP 統計資料中擷取,但由於 Ice 候選配對包含 lastPacketSent 時間戳記,因此計算兩個時間點之間傳送的封包數量可能很有用。 |
| packetsReceived | 每次呼叫 incomingDataHandler 時都會更新。 |
| bytesSent | 這是在 writeFrame() 呼叫的 iceAgentSendPacket()中計算的。這在計算位元速率時非常有用。目前,這也包含 標頭和填補,因為 ICE 層對 RTP 封包格式來說是絕對的。 |
| bytesReceived | 每次呼叫 incomingDataHandler 時都會更新。目前,這也包含 標頭和填補,因為 ICE 層對 RTP 封包格式來說是絕對的。 |
| lastPacketSentTimestamp | 每次傳送封包時都會更新。這可以與 packetsSent 和應用程式中記錄的開始時間搭配使用,以達到目前的封包傳輸速率。 |
| lastPacketReceivedTimestamp | 這會在 中接收資料時更新incomingDataHandler()。這可與 packetsReceived 搭配使用,以推斷目前的封包接收速率。開始時間必須記錄在回transceiverOnFrame()呼中的應用程式層。 |
| firstRequestTimestamp | 在 中成功傳送第一個 STUN 繫結請求時記錄iceAgentSendStunPacket()。這可以與 lastRequestTimestamp 和 requestsSent 搭配使用,以尋找 STUN 繫結請求之間的平均時間。 |
| lastRequestTimestamp | 每次成功在 中傳送 STUN 繫結請求時都會記錄iceAgentSendStunPacket()。 |
| lastResponseTimestamp | 每次收到 STUN 繫結回應時都會記錄。 |
| totalRoundTripTime | 在收到請求的繫結回應時更新。請求和回應會根據檢查總和映射到雜湊表中。 |
| currentRoundTripTime | 在收到候選配對請求的繫結回應時,最新的往返時間會更新。 |
| requestsReceived | 在每個收到的 STUN 繫結請求上更新的計數器。 |
| requestsSent | 在 中傳送的每個 STUN 繫結請求上更新的計數器iceAgentSendStunPacket()。 |
| responsesSent | 在傳送的每個 STUN 繫結回應上更新的計數器,以回應 中的繫結請求handleStunPacket()。 |
| responsesReceived | 在 中收到的每個 STUN 繫結回應上更新的計數器handleStunPacket()。 |
| packetsDiscardedOnSend | 當封包傳送失敗時更新。換句話說,這會在iceUtilsSendData()失敗時更新。這有助於判斷在特定持續時間內捨棄的封包百分比。 |
| bytesDiscardedOnSend | 當封包傳送失敗時更新。換句話說,這會在iceUtilsSendData()失敗時更新。這在判斷在特定持續時間內捨棄的封包百分比時非常有用。請注意,計數器也包含封包的標頭。 |
媒體
傳出 RTP 統計資料
| 指標 | Description |
|---|---|
| voiceActivityFlag | 這目前是 Include.h 中RtcEncoderStats定義的一部分。如果最後一個音訊封包包含語音,則旗標設定為 TRUE。目前未在範例中設定 旗標。 |
| packetsSent | 這表示針對所選 SSRC 送出的 RTP 封包總數。這是 https://www.w3.org/TR/webrtc-stats/#sentrtpstats-dict* |
| bytesSent | 已傳送的位元組總數,不包括 RTP 標頭和填補。這會在每次 writeFrame 呼叫時更新。 |
| encoderImplementation | 這是由應用程式層更新為 RtcEncoderStats 物件的一部分。 |
| packetsDiscardedOnSend | 如果 ICE 代理程式因任何原因無法傳送加密的 RTP 封包,此欄位會更新iceAgentSendPacket。 |
| bytesDiscardedOnSend | 如果 ICE 代理程式因任何原因無法傳送加密的 RTP 封包,此欄位也會更新iceAgentSendPacket。 |
| framesSent | 只有在媒體串流堆疊類型為 MEDIA_STREAM_TRACK_KIND_VIDEO 時,才會遞增。 |
| hugeFramesSent | 此計數器會針對影格的平均大小 2.5 倍的影格進行更新。透過計算 fps (根據上次已知的影格計數時間和以時間間隔編碼的影格數量) 並使用應用程式設定的 RtcEncoderStats 中的 targetBitrate 來取得影格的大小。 |
| framesEncoded | 只有在成功編碼影格後,才會針對影片軌跡更新此計數器。它會在每次 writeFrame 呼叫時更新。 |
| keyFramesEncoded | 只有在金鑰影格成功編碼後,才會針對視訊軌更新此計數器。它會在每次 writeFrame 呼叫時更新。 |
| framesDiscardedOnSend | 當影格傳送因iceAgentSendPacket呼叫失敗而失敗時,會更新此項目。框架由一組封包組成,目前,如果傳送時因錯誤而捨棄任何封包,framesDiscardedOnSend 會失敗。 |
| frameWidth | 這理想地代表最後一個編碼影格的影格寬度。目前,應用程式將此值設定為 RtcEncoderStats* * 的一部分,而且意義不大。 |
| frameHeight | 這理想地代表最後一個編碼影格的影格高度。目前,應用程式將此值設定為 RtcEncoderStats 的一部分,意義不大。 |
| frameBitDepth | 這表示最後一個編碼影格的每個像素寬度的位元深度。目前,這是由應用程式設定為 RtcEncoderStats 的一部分,並翻譯為傳出統計資料。 |
| nackCount | 每次在 RTP 封包上收到 NACK 並再次嘗試傳送封包時,都會更新此值。堆疊支援在接收 NACK 時重新傳輸封包。 |
| firCount | 收到 FIR 封包 (onRtcpPacket->onRtcpFIRPacket) 時會更新此值。它會指出串流落後且必須略過影格才能趕上進度的頻率。FIR 封包目前未解碼以擷取欄位,因此即使已設定計數,也不會採取任何動作。 |
| pliCount | 收到 PLI 封包 (onRtcpPacket->onRtcpPLIPacket) 時會更新此值。這表示一或多個影格已遺失部分編碼的影片資料量。 |
| sliCount | 收到 SLI 封包 (onRtcpPacket->onRtcpSLIPacket) 時會更新此值。它指出封包遺失影響單一影格的頻率。 |
| qualityLimitationResolutionChanges | 目前,堆疊支援此指標,但不會監控每個編碼影格的影格寬度和高度。 |
| lastPacketSentTimestamp | 傳送最後一個封包的時間戳記。它會在每次 writeFrame 呼叫時更新。 |
| headerBytesSent | 為此 SSRC 傳送的 RTP 標頭和填補位元組總數,不包括實際 RTP 承載。 |
| bytesDiscardedOnSend | 當因 iceAgentSendPacket 呼叫失敗而導致框架傳送失敗時,就會更新此項目。框架由一組封包組成,而封包則由位元組組成,目前,如果傳送時因錯誤而捨棄任何封包,則 bytesDiscardedOnSend 會失敗。 |
| retransmittedPacketsSent | 接收 PLI/SLI/NACK 時重新傳輸的封包數量。目前,堆疊只會計算 NACK 的重新傳送封包,因為不支援 PLI 和 SLI 型重新傳輸。 |
| retransmittedBytesSent | 接收 PLI/SLI/NACK 時重新傳輸的位元組數。目前,堆疊只會計算 NACK 的重新傳送位元組,因為不支援 PLI 和 SLI 型重新傳輸。 |
| targetBitrate | 這是在應用程式層級中設定。 |
| totalEncodedBytesTarget | 每次對影格進行編碼時,目標影格大小都會增加,以位元組為單位。這是使用框架結構中的大小參數進行更新。 |
| framesPerSecond | 這是根據上次已知編碼影格所記錄的時間,以及在一秒內傳送的影格數來計算。 |
| totalEncodeTime | 這在應用程式中設定為任意值,並在內部轉譯為傳出統計資料。 |
| totalPacketSendDelay | 目前將此設為 0,因為 iceAgentSendPacket 會立即傳送封包。 |
遠端傳入 RTP 統計資料:
| 指標 | Description |
|---|---|
| roundTripTime | 接收 RTCP 封包類型 201 (接收者報告) 時,會從 RTCP 接收者報告中擷取此值。報告包含上次傳送者報告和自上次傳送者報告後延遲等詳細資訊,以計算往返時間。寄件者報告大約每 200 毫秒產生一次,其中包含傳送的封包數和從傳出統計資料擷取的位元組數等資訊。 |
| totalRoundTripTime | 計算出的往返時間總和 |
| fractionLost | 代表自傳送上一個寄件者/接收者 reporfractionLost 以來,SSRC 遺失的 RTP 封包部分。 |
| reportsReceived | 每次收到接收者報告類型封包時更新。 |
| roundTripTimeMeasurements | 指出針對包含有效往返時間的 SSRC 收到的報告總數。不過,目前此值會遞增,因此其意義與 reportsReceived 相同。 |
傳入 RTP 統計資料:
| 指標 | Description |
|---|---|
| packetsReceived | 收到特定 SSRC 的封包時,計數器會更新。 |
| 抖動 | 此指標表示特定 SSRC 以秒為單位測量的封包抖動。 |
| jitterBufferDelay | 此指標表示抖動緩衝區中每個封包所花費的時間總和。 |
| jitterBufferEmittedCount | 從抖動緩衝區流出的音訊範例或影片影格總數。 |
| packetsDiscarded | 當抖動緩衝區已滿且封包無法推送至其中時,計數器會更新。這可用於計算在固定持續時間內捨棄的封包百分比。 |
| framesDropped | 此值會在叫用 onFrameDroppedFunc() 時更新。 |
| lastPacketReceivedTimestamp | 代表此 SSRC 收到最後一個封包的時間戳記。 |
| headerBytesReceived | 計數器會在接收 RTP 封包時更新。 |
| bytesReceived | 收到的位元組數。這不包含標頭位元組。此指標可用來計算傳入位元速率。 |
| packetsFailedDecryption | 當 SRTP 封包的解密失敗時,這會遞增。 |
資料管道
資料管道指標:
| 指標 | Description |
|---|---|
| label | Label 是要檢查的資料通道名稱。 |
| protocol | 由於我們的堆疊使用 SCTP,因此通訊協定會設定為常數 SCTP。 |
| dataChannelIdentifier | 用於唯一識別資料通道的偶數或奇數識別符。如果 SDK 是提供者,即使 SDK 是接聽者,此值也會更新為奇數值。 |
| state | 查詢統計資料時資料通道的狀態。目前支援的兩個狀態為 RTC_DATA_CHANNEL_STATE_CONNECTING (建立頻道時) 和 RTC_DATA_CHANNEL_STATE_OPEN (在 onOpen() 事件中設定)。 |
| messagesSent | 當 SDK 透過資料通道傳送訊息時,計數器會更新。 |
| bytesSent | 計數器會以送出的訊息中的位元組進行更新。這可用來了解有多少位元組不會因為失敗而傳送,也就是了解傳送的位元組百分比。 |
| messagesReceived | 指標會在回onMessage()呼中遞增。 |
| bytesReceived | 指標會在回onMessage()呼中產生。 |