AWS WebRTC:通過shell分析viewer端日志文件

在并發過程中,每個viewer會產生一個對應的日志文件,日志文件名為:

viewer_channel_index_20250626_030943_145.log

viewer端日志比master端日志文件數量多,比例大概是5:1,有1個master就會有5個viewer,每個viewer對應一個日志文件。
我要統計的是從啟動viewer到出第一幀視頻和第一幀音頻過程中各節點的時間,大概包括:

  1. viewer端啟動時間點;
  2. 獲取ICE配置時間;
  3. 連接信令服務時間;
  4. tls握手時間;
  5. 從offer發送到收到answer時間;
  6. dtls初始化完成時間;
  7. P2P打洞時間;
  8. 計算收到第一幀音頻用時;
  9. 計算收到第一幀視頻用時。

代碼實現

#!/bin/bashlog_dir="./log/viewer"
output_csv="viewer_log_analysis.csv"# 內網IP
# ip_addr=$(hostname -I | awk '{print $1}')# 獲取公網IP
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" -s)
PUBLIC_IP=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-ipv4)# 輸出 CSV 表頭
echo "host,channel,index,start_time,get_ice_config_signaling_call,connect_signaling_client,tls_handshake_time,offer_sent_to_answer_received_time,dtls_initialization_completion,ice_hole_punching_time,first_audio_time,audio_latency_ms,first_video_time,video_latency_ms,pull_success,stable_audio,stable_video" > "$output_csv"# 判斷幀時間是否穩定(±20%)
is_stable() {local expected_ms=$1shiftlocal -a times=("$@")local lower=$((expected_ms * 8 / 10))local upper=$((expected_ms * 12 / 10))for ((i = 1; i < ${#times[@]}; i++)); dolocal diff=$((times[i] - times[i-1]))if (( diff < lower || diff > upper )); thenreturn 1fidonereturn 0
}# 主分析流程
for log_file in "$log_dir"/viewer_*.log; dofilename=$(basename "$log_file")channel=$(echo "$filename" | cut -d'_' -f2)index=$(echo "$filename" | cut -d'_' -f3)# 用 awk 處理大文件只讀一次,提取時間戳mapfile -t results < <(awk 'function to_millis(t) {# 時間格式 2025-06-12 07:19:20.039split(t, a, /[- :\.]/);# mktime參數格式:YYYY MM DD HH MM SSsec = mktime(a[1] " " a[2] " " a[3] " " a[4] " " a[5] " " a[6]);ms = a[7];return sec * 1000 + ms;}BEGIN {audio_count = 0; video_count = 0;}# 記錄起始時間和首幀時間(這里存原始時間字符串)/Initializing WebRTC library/ && !start {start = $1 " " $2;start_ms = to_millis(start);}/Get ICE config signaling call/ && !ice_config {match($0, /Time taken: ([0-9]+)/, m);if (m[1]) ice_config = m[1];}/Connect signaling client/ && !signaling_connect {match($0, /Time taken: ([0-9]+)/, m);if (m[1]) signaling_connect = m[1];}/TLS handshake time/ && !tls_handshake {match($0, /Time taken: ([0-9]+)/, m);if (m[1]) tls_handshake = m[1];}/Offer Sent to Answer Received time/ && !sdp_answer_delay {match($0, /Time taken: ([0-9]+)/, m);if (m[1]) sdp_answer_delay = m[1];}/DTLS initialization completion/ && !dtls_init {match($0, /Time taken: ([0-9]+)/, m);if (m[1]) dtls_init = m[1];}/ICE Hole Punching Time/ && !ice_punching {match($0, /Time taken: ([0-9]+)/, m);if (m[1]) ice_punching = m[1];}/Audio Frame received/ && $0 !~ /Size: 0/ {if (!audio_first) {audio_first = $1 " " $2;audio_first_ms = to_millis(audio_first);}if (audio_count < 30) {audio_ms[audio_count++] = to_millis($1 " " $2);}}/Video Frame received/ && $0 !~ /Size: 0/ {if (!video_first) {video_first = $1 " " $2;video_first_ms = to_millis(video_first);}if (video_count < 30) {video_ms[video_count++] = to_millis($1 " " $2);}}END {print start;print ice_config + 0;print signaling_connect + 0;print tls_handshake + 0;print sdp_answer_delay + 0;print dtls_init + 0;print ice_punching + 0;print audio_first;print video_first;print start_ms;print audio_first_ms;print video_first_ms;for (i = 0; i < audio_count; i++) print "A " audio_ms[i];for (i = 0; i < video_count; i++) print "V " video_ms[i];}' 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87820.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87820.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87820.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

時間轉換——借助時間模塊time

兩種時間戳類型 例如s11704879917000 1、13位的時間戳&#xff1a;單位&#xff08;毫秒&#xff09; &#xff08;1&#xff09;毫秒變成秒&#xff0c;1s1000ms&#xff0c;s1/1000&#xff08;秒&#xff09; &#xff08;2&#xff09;加載時間 times time.localtime(…

LabVIEW MathScript薄板熱流模擬

熱流模擬是熱設計關鍵環節&#xff0c;傳統工具精準但開發周期長&#xff0c;本 VI 利用 LabVIEW 優勢&#xff0c;面向工程師快速驗證需求&#xff0c;在初步方案迭代、教學演示等場景更具效率&#xff0c;為熱分析提供輕量化替代路徑&#xff0c;后續可結合專業工具&#xff…

為什么大語言模型訓練和推理中越來越多地使用 bfloat16?

隨著大語言模型&#xff08;LLM&#xff09;的參數規模從幾十億&#xff08;B&#xff09;飆升到千億&#xff08;T&#xff09;級別&#xff0c;模型的訓練與推理效率變得尤為關鍵。為了在保證精度的同時節省顯存、加快運算&#xff0c;混合精度訓練&#xff08;Mixed Precisi…

暴力破解漏洞與命令執行漏洞

在當今的互聯網世界中&#xff0c;網絡安全威脅無處不在。對于Java后端開發者而言&#xff0c;了解常見的Web漏洞及其防護措施至關重要。本文將探討兩種常見的安全漏洞&#xff1a;暴力破解漏洞&#xff08;Brute Force&#xff09;和命令執行漏洞&#xff08;Command Injectio…

HDFS Java API 開發指南:從基礎操作到高級應用

HDFS (Hadoop Distributed File System) 作為大數據生態的核心存儲系統&#xff0c;提供了分布式、高容錯、高吞吐量的數據存儲能力。通過 Java API 操作 HDFS 是開發大數據應用的基礎技能。本文將基于你的筆記&#xff0c;詳細解析 HDFS Java API 的使用方法&#xff0c;并提供…

區塊鏈技術核心組件及應用架構的全面解析

區塊鏈技術是一套融合密碼學、分布式系統與經濟激勵的復合型技術體系&#xff0c;以下是其核心組件及應用架構的全面解析&#xff1a;一、區塊鏈核心技術棧 1. 分布式賬本技術&#xff08;DLT&#xff09; 核心原理&#xff1a;多節點共同維護不可篡改的數據鏈數據結構&#xf…

golang 協程 如何中斷和恢復

Go語言通知協程退出(取消)的幾種方式 - 知乎 GoLang之goroutine底層系列二(goroutine的創建、讓出、恢復)_golang goroutine-CSDN博客 在 Go 語言中&#xff0c;協程&#xff08;也稱為 goroutine&#xff09;是通過 go 關鍵字啟動的輕量級線程。由于 goroutine 的調度是由 Go…

ARMv8 創建3級頁表示例

最近在研究arm v8頁表創建過程&#xff0c;順帶做了一個如下形式的頁表&#xff0c; // level 1 table, 4 entries: // 0000 0000 - 3FFF FFFF, 1GB block, DDR // 4000 0000 - 7FFF FFFF, 1GB block, DDR // 8000 0000 - BFFF FFFF, 1GB block, DDR // C000 0000 - FFFF FFFF…

遷港戰平 精神可勝國足

遷港戰平可勝國足 江蘇省城市足球聯賽第6輪&#xff0c;宿遷隊主場迎戰連云港隊。比賽中&#xff0c;宿遷隊由張棟和高馳各入一球&#xff0c;連云港隊則憑借穆家鑫與李團杰的進球連扳兩城。最終雙方以2比2握手言和。 第38分鐘&#xff0c;張棟角球進攻中無人盯防推射破門&…

408第三季part2 - 計算機網絡 - ip分布首部格式與分片

理解 好好看一下這個圖 每行是4B&#xff0c;首部也不一定是20B&#xff0c;還有可選字段&#xff0c;可以變的更大 然后我們先看一下概念 然后這個生存時間每路過一個路由器就會扣1滴血 比如一開始是13&#xff0c;經過r1r2r3到B會變成10 但如果是2&#xff0c;經過第二個路…

詳解String類不可變的底層原理

String類 String的基本特性 不可變性: String 對象一旦創建就不能被修改&#xff0c;所有看似修改的操作實際上都是創建新的 String 對象final類: String 類被聲明為 final&#xff0c;不能被繼承基于字符數組: 內部使用final char value[]存儲字符數據(Java9以后改為byte[] …

GIT: 一個用于視覺與語言的生成式圖像到文本轉換 Transformer

摘要 在本文中&#xff0c;我們設計并訓練了一個生成式圖像到文本轉換 Transformer——GIT&#xff0c;以統一視覺-語言任務&#xff0c;如圖像/視頻字幕生成和問答。雖然生成式模型在預訓練和微調之間提供了一致的網絡架構&#xff0c;但現有工作通常包含復雜的結構&#xff…

20250706-9-Docker快速入門(下)-Docker在線答疑_筆記

一、Kubernetes核心概念與集群搭建 1. 在線答疑 &#xfeff; 1&#xff09;答疑Docker需要掌握到什么程度 學習目標&#xff1a;達到入門水平即可&#xff0c;重點掌握第一章Docker入門視頻內容學習建議&#xff1a;預習時間約3-4小時&#xff0c;建議吸收視頻內容的80%學…

Node.js-http模塊

HTTP 協議 概念 HTTP&#xff08;hypertext transport protocol&#xff09;協議&#xff1b;中文叫超文本傳輸協議,是一種基于TCP/IP的應用層通信協議這個協議詳細規定了 瀏覽器 和萬維網 服務器 之間互相通信的規則。協議中主要規定了兩個方面的內容 客戶端&#xff1a;用來…

Java JDBC的初步了解

文章目錄 基本流程注冊驅動的兩種方法DriverManagerDriverManager 的核心作用核心原理自動注冊驅動的機制關鍵方法 示例代碼: 連接Mysql數據庫StatementPreparedStatement JDBC全稱Java DataBase Connectivity。 定義: JDBC 是 Java 語言中用于連接和執行 SQL 操作的標準接口。…

[netty5: ChunkedInput ChunkedWriteHandler]-源碼分析

ChunkedInput ChunkedInput<B> 是 Netty 中用于按塊讀取不定長數據流的接口&#xff0c;常配合 ChunkedWriteHandler 實現流式寫入&#xff0c;支持如文件、流、HTTP 和 WebSocket 等多種數據源。 實現類簡要說明ChunkedFile用于將常規文件按塊傳輸&#xff08;使用傳統…

QT 第十二講 --- 控件篇 LineEdit,TextEdit與ComboBox

前言&#xff1a;歡迎進入 QT 控件世界的第十二講&#xff01;在上一講《QT 第十一講 --- 控件篇 LCDnumber&#xff0c;ProgressBar與CalenderWidget》中&#xff0c;我們探索了用于信息展示和狀態反饋的控件&#xff1a;精準的數字顯示器 LCD Number、直觀的進度指示器 Progr…

VSCode遇到的一些小毛病(自動保存、運行后光標不再處于編輯區)

1. 右鍵點擊Run Code沒有觸發自動保存 1. 打開 VS Code 設置&#xff08;Ctrl ,&#xff09; 2. 搜索&#xff1a;code runner save 3. 勾選你需要的 2. 運行后光標仍然處于編輯區&#xff08;容易誤輸入&#xff09; 1. 打開 VS Code 設置&#xff08;Ctrl ,&#xff09; 2.…

Maixcam的使用2

1.單文件和項目&#xff08;多個 py 文件項目/模塊化&#xff09;# 在編寫代碼時&#xff0c;一般兩種模式&#xff0c;執行單個文件&#xff0c;或者執行一個完成項目&#xff08;包含多個 py 文件或者其它資源文件&#xff09;。 單文件模式&#xff1a;MaixVision 創建或者…

征信系統架構思想:打造商業信任基石_東方仙盟—仙盟創夢IDE

一、建設必要性在復雜的商業環境中&#xff0c;企業面臨多元交易對象與業務場景&#xff0c;準確評估合作方信用狀況及潛在價值的難度顯著增加。傳統經驗判斷和簡單背景調查存在局限性&#xff0c;難以滿足現代商業決策需求&#xff0c;因此構建科學的征信體系具有現實必要性。…