当前位置: 首页 > news >正文

AWS WebRTC:根据viewer端拉流日志推算视频帧率和音频帧率

viewer端拉流日志是这样的:

 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
2025-06-12 07:19:26.378 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140092278368896, Size: 314, Flags 3210729368
2025-06-12 07:19:26.383 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.403 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.418 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140092278368896, Size: 825, Flags 3210729368
2025-06-12 07:19:26.423 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.443 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.458 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140092278368896, Size: 1066, Flags 3210729368
2025-06-12 07:19:26.463 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.484 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 140092278368896, Size: 160, Flags 3210729368
2025-06-12 07:19:26.498 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 140092278368896, Size: 1029, Flags 3210729368
2025-06-12

如何从这样的拉流日志中推算出视频帧率和音频帧率呢?

首先要获取足够的样本

比如获取300条视频帧日志:

grep -i 'Video Frame received' viewer_channel_index_20250612_071920_039.log | head -n 300
  • 先用 grep 过滤出所有匹配行
  • 再用 head -n 300 只显示前300条结果

之后在上面命令得到的结果基础上,过滤出每行日志前面的日期和时间,例如,2025-06-12 07:19:42.138

grep -i 'Video Frame received' viewer_channel_index_20250612_071920_039.log | head -n 300 | awk '{print $1, $2}'
  • awk ‘{print $1, $2}’ 打印每行的第1和第2列,也就是日期和时间(空格分隔)

得到的结果是:

2025-06-12 07:19:38.738
2025-06-12 07:19:38.778
...
2025-06-12 07:19:50.698

计算步骤

第一帧时间:07:19:38.738
最后一帧时间:07:19:50.698

先把时间转换成秒:
07:19:38.738 → 73600 + 1960 + 38.738 = 26378.738秒
07:19:50.698 → 73600 + 1960 + 50.698 = 26390.698秒

时间差 = 26390.698 - 26378.738 = 11.96秒

我取了 300 条时间戳,所以,帧数 = 300

帧率 = 帧数 / 时间差 = 300 / 11.96 ≈ 25.08 fps

据此推算视频流的平均帧率大约是 25 fps。

如果视频帧率是 25 fps(frames per second),那么每一帧之间的理论时间间隔为:

1 秒 / 25= 0.04= 40 毫秒

帧率为 25fps → 理想帧间隔是 40ms

允许波动 ±20%:

40ms * 0.8 = 32ms(下限)

40ms * 1.2 = 48ms(上限)

所以,

lower=32
upper=48

是一个 合理、宽容但不松散 的时间间隔判断范围,可以用来判断是否稳定达到了 25fps。

音频帧的日志取样为:

07:19:38.699
07:19:38.719
07:19:38.740
07:19:38.760
07:19:38.780
07:19:38.800
...

音频帧之间的间隔大多为 20ms 左右,所以:

1 秒 / 0.02 秒(20ms) = 50 帧每秒

音频帧率 ≈ 50 fps

允许波动 ±20%:

20ms * 0.8 = 16ms(下限)

20ms * 1.2 = 24ms(上限)

所以,

lower=16
upper=24
http://www.dtcms.com/a/264775.html

相关文章:

  • uniapp实现图片预览,懒加载
  • 数据分类分级系统的建设思路
  • Rust 安装使用教程
  • 【已解决】执行conda init提示No action taken.
  • 客服机器人知识库怎么搭?智能客服机器人3种方案深度对比(含零售落地案例)
  • 部署KVM 虚拟化平台
  • AI驱动,治理升级!数造科技亮相中博会,打造一站式数据开发治理新范式
  • OFA-PT:统一多模态预训练模型的Prompt微调
  • 暴力破解漏洞与命令执行漏洞
  • PHP 命令行工具的常用选项详解
  • 图像二值化方法及 Python OpenCV 实现
  • 深度剖析NumPy核心函数reshape()
  • 香港券商交易系统开发与解决方案全景报告:云原生、跨境协同与高性能架构的创新实践
  • qt-- 学习笔记11(mingw编译,windeployqt生成执行文件exe,同一exe文件不同文件夹结果不同)
  • 分布式定时任务:Elastic-Job-Lite
  • P3842 [TJOI2007] 线段(动态规划)
  • RAC (ReactiveCocoa) 的实现机制与消息传递策略
  • XILINX Kintex 7系列FPGA的架构
  • ubentu服务器版本安装Dify
  • 【leetcode算法300】:哈希板块
  • 多项式带余除法——线性代数题目为例
  • 【.NET Framework 窗体应用程序项目结构介绍】
  • WHAT - React Native 中 Light and Dark mode 深色模式(黑暗模式)机制
  • 如何在Excel中每隔几行取一行
  • 【PMP】项目管理入门:从基础到环境的体系化拆解
  • 分布式定时任务:xxl-job
  • 苍穹外卖day12--Apache POI导出Excel报表
  • [MIA 2025]CLIP in medical imaging: A survey
  • 多云密钥统一管理实战:CKMS对接阿里云/华为云密钥服务
  • .npmrc和.yarnrc配置文件介绍:分别用于 Node.js 中的 npm(Node Package Manager)和 Yarn 包管理工具