WebRTC C SDK 的用戶端度量 - Kinesis Video Streams

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

WebRTC C SDK 的用戶端度量

使用具有 WebRTC 的 Amazon Kinesis Video Streams 建置的應用程式由各種移動零件組成,包括聯網、信號、候選人交換、對等連線和資料交換。使用 C 語言 WebRTC 的 Kinesis Video Streams 支援各種用戶端指標,可讓您監控並追蹤這些元件在應用程式中的效能和使用情況。支援的指標分為兩大類:專為 Kinesis Video Streams 實作信號和網路而定義的自訂量度,以及衍生自 W3C 標準的媒體和資料相關通訊協定特定度量。請注意,目前只有 W3C 標準量度的子集支援含 WebRTC 的 Kinesis Video Streams (C)。

訊號指標

信號指標可用於了解應用程序運行時信令客戶端的行為。您可以使用 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));

的定義signalingClientStats可以在 Stats. h 中找到。

目前支援下列訊號指標:

指標 描述
cpApiCall延遲 計算控制平面 API 呼叫的延遲。使用指數移動平均線 (EMA) 進行計算。相關的呼叫包括:描述頻道、CreaTech 通道和代理通道。 getChannelEndpoint
dpApiCall延遲 計算資料平面 API 呼叫的延遲。使用指數移動平均線 (EMA) 進行計算。相關聯的呼叫包括: getIceConfig。
signalingClientUptime 這表示客戶端對象存在的時間。每次調用此指標時,都會發出最新的正常運行時間值。
連線持續時間 如果已建立連線,則會發出連線存在的持續時間。否則,0 的值被發射。這與信令客戶端正常運行時間不同,因為連接來來去去,但 signalingClientUptime 表示客戶端對象本身。
numberOfMessages已傳送 當對等傳送選件、答案或 ICE 候選項時,會更新此值。
numberOfMessages已收到 與 Send 不同,此量度 numberOfMessages會針對任何類型的信號訊息進行更新。中SIGNALING_MESSAGE_TYPE提供信令訊息的類型。
iceRefreshCount 這在調用時 getIceConfig 遞增。呼叫此速率是以接收之 ICE 組態的一部分 TTL 為基礎。每次接收到一組新的 ICE 設定時,計時器就會設定為下次重新整理,考慮到組態中認證的有效性減去一些寬限期。
numberOfErrors 計數器用於跟踪信令客戶端中生成的錯誤的數量。追蹤取得 ICE 組態、取得訊號狀態、追蹤訊號指標、傳送訊號訊息,以及將信號用戶端連接至 Web 通訊端以傳送/接收訊息時產生的錯誤。
numberOfRuntime錯誤 此測量結果包括信令從屬端核心執行時所發生的錯誤。這裡會追蹤重新連線失敗、訊息接收失敗和 ICE 組態重新整理錯誤等案例。
numberOfReconnects 每次重新連線時,量度都會遞增。這是了解設置中網絡連接穩定性的有用指標。

支援的 WebRTC 3C 標準度量

目前,使用 WebRTC C SDK 構建的應用程序支持 W3C 標準度量的子集。這些分為以下幾類:

  • 網路:

    • Ice Queate: 這些量度提供有關所選本機和遠端候選人的資訊,以便在對等之間進行資料交換。這包括候選人的伺服器來源、IP 位址、為通訊選取的候選人類型,以及候選優先順序。這些量度可做為快照報表。

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

    • 冰候選對:這些指標用於了解對等之間正在交換的字節/數據包的數量以及與時間有關的測量。

  • 媒體和數據:

    • 遠端輸入 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);

在上面的例子中,如果第二個參數 to rtcPeerConnection GetMetrics () 是 NULL,則返回列表中第一個收發器的數據。

的定義 rtcStatsObject 可以在 Stats.h 中找到,而的定義 RtcStats 可以在包含 .h 中找到。

您可以在 WebRTC C SDK 存放庫的範例目錄和 Kinesis 影片串流存放庫中找到 API 的範例使用情況和不同指標的範例使用方式。

目前,使用 WebRTC C SDK 構建的應用程序支持以下 W3C 標準指標。

聯網

ICE 伺服器度量:

指標 描述
URL 正在追蹤的 STUN/Turn 伺服器的網址
連接埠 用戶端使用的連接埠號碼
通訊協定 從 ICE 伺服器 URI 擷取的傳輸通訊協定。如果該值是 UDP,ICE 嘗試翻轉 UDP,否則 ICE 嘗試翻轉 TCP/TLS。如果 URI 不包含傳輸,ICE 會嘗試翻轉 UDP 和 TCP/TLS。在 STUN 伺服器的情況下,此欄位是空的。
傳送的要求總數 該值被更新為每個 srflx 候選請求,同時從回合候選發送綁定請求。
收到的回覆總數 每次收到 STUN 繫結回應時,都會更新該值。
總往返時間 每次收到請求的等效回應時,都會更新該值。請求數據包在哈希映射中跟踪,並將校驗和作為密鑰。

ICE 候選人統計:僅包括有關所選候選人(本地和遠程)的信息。

指標 描述
address 這表示本地和遠程候選人的 IP 地址。
port 候選人的連接埠號碼
protocol 用於獲取候選人的協議。有效值是 UDP/TCP。
候選人類型 選擇的候選人類型-主機,srflx 或繼電器。
priority 所選本機和遠端候選人的優先順序。
網址 所選當地候選人的來源。這表示選擇的候選人是否從 STUN 服務器或 TURN 服務器接收到。
中繼協議 如果使用 TURN 伺服器取得選取的本機候選項目,此欄位會指出使用何種通訊協定來取得它。有效值為 TCP/UDP。

ICE 候選對統計數據:僅包括有關所選候選對的信息。

指標 描述
localCandidateId 配對中所選本地候選人的 ID。
remoteCandidateId 配對中所選遠端候選項的 ID。
state 正在檢查的候選人對的狀態。
提名 設置為 TRUE,因為統計數據被提取選定的候選對。
數据包已發送 傳送的封包數目。這是在呼叫中的.writeFrame叫中計算的。此信息也可以從傳出的 RTP 統計數據中提取,但是由於 Ice 候選對包含時間 lastPacketSent 戳,因此計算兩個時間點之間發送的數據包數可能很有用。
已接收封包 每次調用 incomingDataHandler 時都會更新此選項。
字節發送 這是在writeFrame()呼叫iceAgentSendPacket()中計算的。這在計算比特率時非常有用。目前,這還包括標題和填充,因為 ICE 層對 RTP 數據包格式沒有影響。
字節接收 每次調用 incomingDataHandler 時都會更新此選項。目前,這還包括標題和填充,因為 ICE 層對 RTP 數據包格式沒有影響。
lastPacketSent時間戳 每次傳送封包時都會更新此項目。這可以與 PackketsSend 和應用程序中記錄的開始時間結合使用到當前數據包的傳輸速率。
lastPacketReceived時間戳 這會在中接收資料時更新incomingDataHandler()。這可以與 PackketsReceiver 一起使用,以推導出當前的數據包接收速率。開始時間必須記錄在transceiverOnFrame()回調中的應用程序層。
firstRequestTimestamp iceAgentSendStunPacket()成功傳送第一個 STUN 繫結要求時記錄。這可以與 lastRequestTimestamp 和請求一起使用,以查找 STUN 綁定請求之間的平均時間。
lastRequestTimestamp 每次成功傳送 STUN 繫結要求時都會記錄。iceAgentSendStunPacket()
lastResponseTimestamp 每次收到 STUN 綁定響應時都會記錄。
totalRoundTrip時間 收到請求的綁定響應時更新。請求和響應被映射到基於校驗和哈希表。
currentRoundTrip時間 最近的往返時間在收到候選人對的請求的綁定響應時更新。
已收到的要求 針對每個收到的 STUN 繫結要求進行更新的計數器。
要求已傳送 每個傳送的 STUN 繫結要求都會更新的計數器。iceAgentSendStunPacket()
回應 針對中的繫結要求而傳送的每個 STUN 繫結回應上更新的計數器。handleStunPacket()
收到的回應 handleStunPacket()中收到的每個 STUN 綁定響應上更新的計數器。
packetsDiscardedOn發送 封包傳送失敗時更新。換句話說,這會在iceUtilsSendData()失敗時更新。這可以確定在特定持續時間內丟棄的數據包百分比。
bytesDiscardedOn發送 封包傳送失敗時更新。換句話說,這會在iceUtilsSendData()失敗時更新。這在判斷特定持續時間內丟棄的封包百分比時非常有用。請注意,計數器也包含封包的標頭。

媒體

出埠 RTP 統計資料

指標 描述
voiceActivityFlag 這是目前在包含 .h 中RtcEncoderStats定義的一部分。如果最後一個音訊封包含語音,則旗標會設定為 TRUE。範例中目前未設定旗標。
數据包已發送 這表示為所選 SSRC 送出的 RTP 封包總數。這是 https://www.w3.org/TR/webrtc-stats/#sentrtpstats-dict 的一部分 *,並作為出站統計信息的一部分包含在內。每次調用 WriteFrame () 時,這都會遞增。
字節發送 傳送的位元組總數 (不包括 RTP 標頭和填充)。這在每個寫幀調用上都會更新。
編碼器實作 這是由應用層作為 RtcEncoderStats 對象的一部分更新。
packetsDiscardedOn發送 如果 ICE 代理程式因為iceAgentSendPacket呼叫中的任何原因而無法傳送加密的 RTP 封包,則會更新此欄位。
bytesDiscardedOn發送 如果 ICE 代理程式因為iceAgentSendPacket呼叫中的任何原因無法傳送加密的 RTP 封包,也會更新此欄位。
框架 只有當媒體流粘性類型為媒體流追踪 _ 視頻時,這才會遞增。
hugeFramesSent 此計數器會針對影格平均大小 2.5 倍的影格進行更新。幀的大小是通過計算 fps(基於最後一個已知的幀計數時間和以時間間隔編碼的幀數)並使用應用程序 RtcEncoderStats 設置的 targetBtBitt 獲得。
框架編碼 此計數器僅在幀的編碼成功後更新視頻軌道。它在每個寫幀調用更新。
keyFramesEncoded 成功編碼關鍵影格後,此計數器僅針對視訊軌道進行更新。它在每個寫幀調用更新。
framesDiscardedOn發送 當幀發送由於iceAgentSendPacket調用失敗而失敗時,這將更新。一個框架由一組數據包組成,當前, framesDiscardedOn如果發送因為錯誤而丟棄任何數據包,則發送失敗。
框架寬度 理想情況下,這代表了最後一個編碼幀的幀寬度。目前,這是由應用程序設置為一個值作為 RtcEncoderStats * 的一部分,並沒有太大的意義。
框架高度 這理想地代表了最後一個編碼幀的幀的高度。目前,這是由應用程序設置為一個值的一部分, RtcEncoderStats 並沒有太大的意義。
frameBitDepth 這代表了最後一個編碼幀的每像素寬度的位深度。目前,這是由應用程序設置的一部分, RtcEncoderStats 並轉換為出站統計信息。
納克伯爵 每次在 RTP 封包上收到 NACK 並重新嘗試傳送封包時,都會更新此值。堆棧支持在接收 NACK 時重新傳輸數據包。
第一次計數 接收 FIR 封包onRtcpPacket時會更新該值 (-> 安裝封包)。它指示流落後的頻率,並且必須跳過幀才能 catch。FIR 封包目前尚未解碼來擷取欄位,因此,即使已設定計數,也不會採取任何動作。
普利康 接收 PLI 封包時會更新該值 (onRtcpPacket-> 安裝封包)。它表示一個或多個幀丟失了一定數量的編碼視頻數據。
切片計算機 此值會在接收 SLI 封包時更新 (onRtcpPacket-> 連結封包)。它指出封包遺失影響單一幀的頻率。
qualityLimitationResolution變更 目前,堆棧支持此指標,但是,不會監視每個編碼幀的幀寬度和高度。
lastPacketSent時間戳 最後一個封包傳送時的時間戳記。它在每個寫幀調用更新。
headerBytesSent 針對此 SSRC 傳送的 RTP 標頭和填補位元組總數 (不包括實際的 RTP 裝載)。
bytesDiscardedOn發送 當訊框傳送因 iceAgentSend封包呼叫失敗而失敗時,會更新此選項。一個幀由一組數據包組成,這反過來又由字節組成,當前,如果任何數據包被丟棄,而發 bytesDiscardedOn送失敗,而發送,因為錯誤。
retransmittedPacketsSent 接收 PLI/SLI/NACK 時重新傳輸的封包數目。目前,堆疊僅計算 NACK 重新傳送的封包,因為不支援以 PLI 和 SLI 為基礎的重新傳輸。
retransmittedBytesSent 接收 PLI/SLI/NACK 時重新傳輸的位元組數。目前,堆棧僅計算 NACK 重新發送的字節,因為不支持基於 PLI 和 SLI 的重傳。
目標位元速率 這是在應用程序級別中設置的。
totalEncodedBytes目標 每次編碼幀時,這會增加目標幀大小(以字節為單位)。這是使用框架結構中的大小參數進行更新。
framesPerSecond 這是根據上次已知編碼影格所記錄的時間,以及在一秒內傳送的影格數目來計算。
totalEncodeTime 這會在應用程式中設定為任意值,並在內部轉換為輸出統計資料。
totalPacketSend延遲 由於數據包立即發送 iceAgentSend數據包,因此當前設置為 0。

遠端入埠 RTP 統計資料:

指標 描述
roundTripTime 該值是在接收 RTCP 數據包類型 201(接收器報告)時從 RTCP 接收器報告中提取的。該報告包括上次發件人報告和自上次發送人報告以來計算往返時間的延遲。寄件者報告大約每 200 毫秒會產生一次,其中包含資訊,例如傳送的封包數目和從輸出統計資料擷取的傳送位元組。
totalRoundTrip時間 計算的往返時間總和
分數丟失 代表自上一個傳送者/接收器 Report Lost 傳送以來,SSRC 遺失的 RTP 封包比例。
報告收到 每次收到接收者報告類型封包時更新。
roundTripTime測量 指出 SSRC 收到的報告總數,其中包含有效的往返時間。但是,目前,無論如何,此值都會增加,因此它的含義與 ReportsReceived 相同。

入站 RTP 統計資料:

指標 描述
已接收封包 當收到特定 SSRC 的封包時,計數器會更新。
抖動 此測量結果表示針對特定 SSRC 測量的封包抖動 (以秒為單位)。
jitterBufferDelay 此測量結果代表抖動緩衝區中每個封包使用的時間總和。
jitterBufferEmitted伯爵 從抖動緩衝區中傳出的音訊樣本或視訊影格總數。
丟棄的包 當抖動緩衝區已滿且封包無法推入其中時,計數器會更新。這可用來計算固定持續時間內捨棄的封包百分比。
框架掉落 呼叫時會更新此值。onFrameDroppedFunc()
lastPacketReceived時間戳 代表接收此 SSRC 最後一個封包的時間戳記。
headerBytesReceived 計數器會在接收 RTP 封包時更新。
字節接收 接收的位元組數。這不包括標頭字節。此指標可用於計算傳入的位元速率。
packetsFailedDecryption 當 SRTP 封包解密失敗時,這會遞增。

資料通道

資料通道量度

指標 描述
標籤 標籤是被檢查的數據通道的名稱。
protocol 由於我們的堆棧使用 SCTP,該協議被設置為常量 SCTP。
dataChannelIdentifier 用於唯一識別資料通道的偶數或奇數識別碼。如果 SDK 是提供者,則此值會更新為奇數值,如果 SDK 是回答者,則會更新為偶數值。
state 查詢統計資料時的資料通道狀態。目前,支持的兩種狀態是 RTC _ 數據 _ 通道 _ 狀態 _ 連接(當創建通道時)和 RTC_DATA_ 通道 _ 狀態 _ 打開(在 onOpen()事件中設置)。
訊息發送 SDK 透過資料通道傳送訊息時,計數器會更新。
字節發送 計數器會更新為傳送出的訊息中的位元組。這可以用來了解由於失敗而未發送多少字節,即了解發送的字節的百分比。
訊息已收到 測量結果會在onMessage()回呼中遞增。
字節接收 測量結果會在onMessage()回呼中產生。