View a markdown version of this page

C SDK 的用戶端指標 - Kinesis Video Streams

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

C SDK 的用戶端指標

使用 Amazon Kinesis Video Streams with WebRTC 建置的應用程式由各種移動組件組成,包括聯網、訊號、候選者交換、對等連線和資料交換。C 中的 Kinesis Video Streams with WebRTC 支援各種用戶端指標,可讓您監控和追蹤應用程式中這些元件的效能和用量。支援的指標分為兩個主要類別:專門為 Kinesis Video Streams 的訊號和聯網實作定義的自訂指標,以及衍生自 W3C 標準的媒體和資料相關通訊協定特定指標。請注意,目前 C 中的 Kinesis Video Streams with WebRTC 僅支援一部分的 W3C 標準指標。 WebRTC

訊號指標

訊號指標可用來了解訊號用戶端在應用程式執行時的行為。您可以使用 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.h signalingClientStats中找到 的定義。

目前支援下列訊號指標:

指標 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 標準指標

使用 W3CWebRTC 標準指標的子集。這些分為下列類別:

  • 網路:

    • Ice Candidate:這些指標提供有關所選本機和遠端候選項目的資訊,以便在對等之間進行資料交換。這包括候選伺服器的伺服器來源、IP 地址、為通訊選取的候選類型,以及候選優先順序。這些指標可作為快照報告。

    • Ice 伺服器:這些指標用於收集支援的不同 ICE 伺服器的操作資訊。這在嘗試了解主要用於通訊和連線檢查的伺服器時非常有用。在某些情況下,如果收集候選項目失敗,檢查這些指標也很有用。

    • Ice Candidate Pair:這些指標用於了解在對等和時間相關測量之間交換的位元組/封包數量。

  • 媒體和資料:

    • 遠端傳入 RTP:這些指標代表寄件者傳送之資料串流的端點觀點。

    • 傳出 RTP:這些指標提供傳出 RTP 串流的相關資訊。在分析冗長的串流或串流停止時,它們也非常有用。

    • 傳入 RTP:這些指標提供傳入媒體的相關資訊。

    • 資料管道指標:這些指標可協助您分析透過資料管道傳送和接收的訊息和位元組數。您可以使用頻道 ID 提取指標。

您可以使用 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 中找到。RtcStats 的定義可在 Include.h 中找到。

您可以在 WebRTC C SDK 儲存庫的範例目錄中,以及 Kinesis Video Streams 示範儲存庫中找到 APIs 的範例用量和不同的指標。

使用 W3CC 標準指標。 WebRTC

聯網

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* 的一部分,包含在傳出統計資料中。每次呼叫 writeFrame() 時都會遞增。
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()呼中產生。