AWS WebRTC: 判斷viewer端拉流是否穩定的算法

在使用sdk-c viewer端進行拉流的過程中,viewer端拉取的是視頻幀和音頻幀,不會在播放器中播放,所以要根據收到的流來判斷拉流過程是否穩定流暢。

我這邊采用的算法是:依據相鄰幀之間的時間間隔是否落在期望值的 ±20% 范圍內。

音頻幀、視頻幀的日志打印如下:

 07:19:26.263 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.283 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.298 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140092278368896, Size: 4458, Flags 3210729368
2025-06-12 07:19:26.303 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.323 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.338 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140092278368896, Size: 263, Flags 3210729368
2025-06-12 07:19:26.343 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.363 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368

假設期望幀間隔是 20ms,那接收的幀間隔必須在lower和upper之間:

  • lower = 16ms (-20%)
  • upper = 24ms (+20%)

之后遍歷相鄰的時間戳,計算差值即時間間隔:

  • 如果任何一個間隔超出 [16, 24]ms 范圍,就返回 1(表示不穩定)
  • 如果所有間隔都在范圍內,最后返回 0(表示穩定)

這里有一點需要注意,如果時間間隔大于最大值很好理解,肯定是卡頓了,那么小于最小值為什么也被認定為不穩定呢,時間差越短不是越流暢嗎?這里解釋一下:

比如視頻幀率是 25fps,對應每幀間隔約 40ms。如果某幾幀突然變成 20ms,就不是“按幀率穩定輸出”的表現。幀率不穩,會導致:

  • 音視頻不同步
  • 抖動(jitter)
  • 丟幀或重復幀等問題

流媒體播放是“節奏感”不是“越快越好”
一個穩定的視頻流(比如 25fps)應該每 40ms 一幀。如果突然來一幀只間隔了 10ms,會導致播放器不知道該怎么同步音視頻,甚至可能觸發跳幀。過快或過慢,都是對穩定性的破壞。

時間間隔短,可能是網絡包聚合延遲之后一次性發送多幀的情況。

舉個例子
假設有個節拍器本來每 1 秒“噠”一下,現在突然 0.1 秒“噠噠噠”3 次,那么它可能出故障了!

代碼實現

# 判斷幀時間是否穩定(±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
}

第一個參數 $1:是期望的幀間隔(單位是毫秒),比如:

  • 音頻幀:20 毫秒
  • 視頻幀:40 毫秒

后續參數:是一系列時間戳(以毫秒為單位),代表每幀的接收時間。這些時間戳是在分析viewer端日志的過程中,獲取到的n幀視頻幀時間戳和n幀音頻幀時間戳。

后續參數跟這行代碼相關:

local -a times=("$@")

這行代碼是將函數傳入的參數中除了第一個參數外的所有參數,作為一個數組存入 times 變量中。因為前面 shift 過一次了,所以 $@ 就是“剩余的所有時間戳列表”。

例如:

is_stable 20 1000 1020 980 1010

進入函數后:

$1 = 20(期望間隔)

shift 移除 $1 后

$@ 就變成了:1000 1020 980 1010

times=(“$@”) 等價于:times=(1000 1020 980 1010)

如果去掉 -a,也不會出錯,但那樣會變成普通字符串變量,只存第一個參數值:

local times=("$@")  # 結果是 times=1000

-a 是告訴 Bash:“我要定義一個數組變量”。

總結就是

部分含義
local聲明這是一個函數內的局部變量,不影響外部環境
-a表示這個變量是一個數組類型
times數組變量的名字
=(“$@”)把函數剩余的所有參數(即 $@)作為數組元素賦值給 times

前一篇:https://blog.csdn.net/zhang_jiamin/article/details/149053832?spm=1011.2415.3001.5331

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

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

相關文章

【Python】文件讀取:逐行讀取應用實例——從一個JSONL文件中逐行讀取文件

從一個JSONL文件中逐行讀取文件&#xff0c;并將這些問題保存到一個新的JSONL文件中 import json import argparse import os # 導入os模塊用于檢查文件是否存在def read_questions_from_jsonl(file_path, limit):"""從JSONL文件中讀取指定數量的question部分…

百寶箱生成智能體

點擊新建應用 工作流如下&#xff1a; 點擊發布 點擊Web服務&#xff0c;上架

嵌入式 數據結構學習(五) 棧與隊列的實現與應用

一、棧(Stack)詳解 1. 棧的基本概念 棧的定義與特性 后進先出(LIFO)&#xff1a;最后入棧的元素最先出棧 操作限制&#xff1a;只能在棧頂進行插入(push)和刪除(pop)操作 存儲位置&#xff1a;我們實現的鏈棧位于堆區(malloc分配)&#xff0c;系統棧區存儲函數調用信息 棧…

匯編與接口技術:8259中斷實驗

一、實驗目的 該實驗使學生掌握8259向量中斷方式的硬件連接和軟件編程的方法&#xff0c;同時使同學掌握中斷和其它接口芯片配合來完成某一特定任務的方法。 二、實驗內容 1、手動產生單脈沖作為中斷請求信號連接到MIRQ3上和SIRT10上。每按一次開關產生一次中斷&#xff0c;…

Ajax的初步學習

一、什么是 Ajax&#xff1f; Ajax (Asynchronous JavaScript and XML) 是一種無需重新加載整個網頁的情況下&#xff0c;能夠更新部分網頁的技術。通過在后臺與服務器進行少量數據交換&#xff0c;Ajax 可以使網頁實現異步更新。 主要特性&#xff1a; 異步性 (Asynchronous…

OOM電商系統訂單緩存泄漏,這是泄漏還是溢出

電商系統訂單緩存泄漏的本質分析一、明確概念區別內存泄漏&#xff08;Memory Leak&#xff09;定義&#xff1a;對象已經不再被使用&#xff0c;但由于被錯誤引用而無法被垃圾回收特點&#xff1a;內存使用量隨時間持續增長&#xff0c;最終可能導致OOM類比&#xff1a;像浴缸…

二進制安全-匯編語言-02-寄存器

二、寄存器 水滴石穿 一個典型的CPU由運算器、控制器、寄存器等器件構成&#xff0c;這些器件靠內部總線相連 內部總線實現CPU內部各個器件之間的聯系&#xff0c;外部總線實現CPU和主板上其他器件的聯系 簡單說&#xff0c;在CPU中&#xff1a; 運算器進行信息處理寄存器進…

Java——初始guava(1)

基于 Google Guava 官方教程的解答 ?? Guava 提供了哪些 JDK 不具備的 API? Guava 擴展了 JDK 的集合框架,提供了多種 JDK 沒有的實用 API: 不可變集合(Immutable Collections) ImmutableList、ImmutableSet、ImmutableMap 等特性:創建后不可修改,線程安全,性能優于…

day53

import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset import numpy as np from sklearn.preprocessing import MinMaxScaler from sklearn.datasets import load_iris import warnings # 忽略不必要的警…

c++ python 共享內存

一、目的 是為了c來讀取并解碼傳遞給python&#xff0c;Python做測試非常方便&#xff0c;c 和 python之間必須定好協議&#xff0c;整體使用c 來解碼&#xff0c;共享內存傳遞給python 二、主類 主類&#xff0c;串聯decoder&#xff0c;注意decoder并沒有直接在顯存里面穿…

react函數組件的props,ref,state。

react開發我們會把頁面分為一個個組件&#xff0c;組件是獨立而且可復用的重復代碼片段。具體來說組件可以是一個按鈕&#xff0c;一個輸入框。react組件有兩種定義方法&#xff0c;一種是函數組件&#xff0c;一種是類組件。我們這里說一下函數組件之間父子之間如何傳遞props參…

基于ARM+FPGA實現的BISS-C協議解決方案,適用于高精度光柵位移傳感器等

模塊簡介 本資源提供了專為FPGA設計的BISS-C接口協議發送模塊源碼。BISS-C模式作為一種高速、同步的串行通信協議&#xff0c;廣泛應用于高精度光柵位移傳感器的數據傳輸中&#xff0c;特別適用于需要精確位置信息的應用場景。此模式遵循主從架構&#xff0c;其中FPGA作為主控制…

spring中@Transactional注解和事務的實戰理解附代碼

文章目錄 前言一、事務是什么&#xff1f;二、事務的特性2.1隔離性2.2事務的隔離級別 三、Transactional注解Transactional注解簡介基本用法常用屬性配置事務傳播行為事務隔離級別異常處理與回滾性能優化建議 四、 事務不生效的可能原因方法訪問權限非public自調用問題異常被捕…

替代進口SCA7606【智芯微】國產高精度電流傳感器 工業新能源電網專用

SCA7606&#xff08;智芯微&#xff09;產品解析與推廣文案一、產品概述SCA7606 是 智芯微電子&#xff08;ZXMICRO&#xff09; 推出的一款 高精度數字隔離式電流傳感器芯片&#xff0c;采用 霍爾效應數字輸出 技術&#xff0c;專為 工業控制、新能源、智能電網 等領域的電流檢…

Java 與 Vue 全棧開發:“一課一得“ 學習筆記系統實戰

一、項目背景與核心價值 "一課一得" 是一個面向學習者的筆記管理平臺&#xff0c;旨在幫助用戶系統化記錄、整理和回顧學習內容。項目采用前后端分離架構&#xff1a;前端基于 Vue.js 構建交互式界面&#xff0c;后端使用 Java Spring Boot 實現業務邏輯&#xff0c…

百度文心大模型 4.5 開源深度測評:技術架構、部署實戰與生態協同全解析

聲明&#xff1a;本文只做實際測評&#xff0c;并非廣告 1.前言 2025 年 6 月 30 日&#xff0c;百度做出一項重大舉措&#xff0c;將文心大模型 4.5 系列正式開源&#xff0c;并選擇國內領先的開源平臺 GitCode 作為首發平臺。該模型也是百度在2025年3月16日發布的自研的新一…

力扣_鏈表_python版本

一、206. 反轉鏈表代碼&#xff1a; class Solution:def reverseList(self, head):dummy ListNode()cur headwhile cur:last cur.nextcur.next dummy.nextdummy.next curcur lastreturn dummy.next二、92. 反轉鏈表 IIclass Solution:def reverseBetween(self, head: Opt…

[netty5: WebSocketProtocolHandler]-源碼分析

在閱讀這篇文章前&#xff0c;推薦先閱讀&#xff1a;[netty5: MessageToMessageCodec & MessageToMessageEncoder & MessageToMessageDecoder]-源碼分析 WebSocketProtocolHandler WebSocketProtocolHandler 是 WebSocket 處理的基礎抽象類&#xff0c;負責管理 Web…

[2025CVPR]一種新穎的視覺與記憶雙適配器(Visual and Memory Dual Adapter, VMDA)

引言 多模態目標跟蹤&#xff08;Multi-modal Object Tracking&#xff09;旨在通過結合RGB模態與其他輔助模態&#xff08;如熱紅外、深度、事件數據&#xff09;來增強可見光傳感器的感知能力&#xff0c;尤其在復雜場景下顯著提升跟蹤魯棒性。然而&#xff0c;現有方法在頻…

理想汽車6月交付36279輛 第二季度共交付111074輛

理想汽車-W(02015)發布公告&#xff0c;2025年6月&#xff0c;理想汽車交付新車36279輛&#xff0c;第二季度共交付111074輛。截至2025年6月30日&#xff0c;理想汽車歷史累計交付量為133.78萬輛。 在成立十周年之際&#xff0c;理想汽車已連續兩年成為人民幣20萬元以上中高端市…