webrtc-internals调试工具

embedded/2024/12/29 13:26:15/

Google 的 Chrome(87 或更高版本)WebRTC 内部工具是一套内置于 Chrome 浏览器中的调试工具;
webrtc-internals 能够查看有关视频和音频轨道、使用的编解码器以及流的一般质量的详细信息。这些知识对于解决音频和视频质量差的问题非常有帮助。
webrtc-internals 还提供有关 WebRTC 调用中使用的网络配置的详细信息,例如 STUN/ TURN服务器和 ICE 候选者。

getUserMedia/getDisplayMedia

  • 调用地址
  • 调用时间
  • 媒体约束
    在这里插入图片描述

RTCPeerConnection 监控信息

在这里插入图片描述

Event

创建一个本地描述
createOffer => createOfferOnSuccess
存入本地描述
setLocalDescription => setLocalDescriptionOnSuccess
存入远端描述
setRemoteDescription => setRemoteDescriptionOnSuccess
添加轨道
transceiverAdded
多个ICE候选通过信令传传输给远程端,以便远程端可以选择最佳的路径来建立点对点(P2P)连接
icecandidate
主要用于在NAT(网络地址转换)和防火墙后面建立端到端的连接

{
// 表示这个候选与哪个媒体流(audio或video)
sdpMid: 0, 
// 表示这个候选在SDP的m-line中的索引位置
sdpMLineIndex: 0
// 候选字符串,包含了候选的类型、优先级、IP地址、端口号等信息
candidate: candidate:3111111111 1 udp 41111111 11.11.11.11 64434 typ relay raddr 0.0.0.0 rport 0 generation 0 ufrag xdAn network-id 3
url: turn:111.111.11.11:1111?transport=udp, relayProtocol: udp
}

iceconnectionstatechange
ICE的连接状态发生变化
MDN_iceconnectionstatechange
MDN_iceConnectionState

  • new: ICE 代理正在收集地址或等待通过调用,或两者)获得远程候选地址
  • checking:ICE 代理已获得一个或多个远程候选,并正在检查本地和远程候选对以尝试找到兼容的匹配,但尚未找到允许建立对等连接的对。候选的收集可能仍在进行中
  • connected:已为连接的所有组件找到可用的本地和远程候选配对,并且已建立连接。收集可能仍在进行中,ICE 代理也可能仍在相互检查候选以寻找更好的连接。
  • completed:ICE 代理已完成候选者的收集,已检查所有对,并已找到所有组件的连接
  • failed:ICE 候选已检查所有候选对,但未能为连接的所有组件找到兼容的匹配项。但是,ICE 代理可能确实为某些组件找到了兼容的连接。
  • disconnected: 检查以确保组件仍处于连接状态 至少一个组件失败RTCPeerConnection。此测试比 和 的测试要求低failed,可能会间歇性触发,并在可靠性较低的网络上或临时断开连接时自动解决。当问题解决后,连接可能会恢复到 状态connected。
  • closed: 该 ICE 代理RTCPeerConnection已关闭并且不再处理请求。

connectionstatechange
PeerConnection的连接状态发生变化
MDN_connectionstatechange
connectionState

  • new: 该连接的ICE传输(RTCIceTransport或对象)中至少RTCDtlsTransport有一个处于该new状态,并且它们都不处于以下状态之一:connecting、checking、failed、disconnected,或者该连接的所有传输都处于该closed状态
  • connecting: 一个或多个ICE传输当前正在建立连接;也就是说,它们iceConnectionState是checking或connected,并且没有传输处于 该failed状态
  • connected: 连接使用的每个ICEconnected传输要么处于正在使用状态(状态或completed),要么处于关闭状态(状态closed);此外,至少一个传输是connected或completed
  • disconnected: 连接的ICE传输中至少有一个处于该disconnected状态,且其他传输均不处于以下状态:failed、connecting或checking
  • failed: 连接上的一个或多个ICEfailed传输处于该状态
  • closed: RTCPeerConnection已关闭

tabls

outbound-rtp(kind=audio)
// 编码器
[codec]	opus (111, minptime=10;useinbandfec=1)
// 发送总数据包
packetsSent	1009767
// 每秒发送数据包数量
[packetsSent/s]   50.41123456789
// 发送总字节数量
bytesSent     749670966
// 每秒发送字节数量比特数
[bytesSent_in_bits/s]  28291.412345789
// 每秒头部字节总数
headerBytesSent   28386787
// 每秒发送头部字节比特数
[headerBytesSent_in_bits/s]   11206.52334411
// 比特率为32,000 bps(比特每秒),即32 kbps
targetBitrate 32000
outbound-rtp(kind=video)
// 表示使用的编码器是H.264
[codec]	H264 (102, level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f)
// 发送的总数据包数量为616,516个
packetsSent	616516	
// 每秒发送的数据包数量,约为30.66个
[packetsSent/s]	30.664317713909526
// 发送的总字节数为179,434,429字节
bytesSent	179434429	
// 每秒发送的字节数转换为比特数,约为71,568.30 kbps
[bytesSent_in_bits/s]	71568.30001423245
// 发送的头部字节总数为14,852,818字节
headerBytesSent	14852818	
// 每秒发送的头部字节数转换为比特数,约为5,726.59 kbps。
[headerBytesSent_in_bits/s]	5726.59106771328
// 目标比特率为354,830 bps,即354.83 kbps
targetBitrate	354830	
// 编码的总帧数为617,019帧
framesEncoded	617019	
// 每秒编码的帧数,约为28.19帧
[framesEncoded/s]	28.191334587700172
// 编码的关键帧(I帧)数量为215帧	
keyFramesEncoded	215	
// 总编码时间为4781.073秒
totalEncodeTime	4781.073	
// 每帧编码所需的平均时间,约为11.46毫秒。
[totalEncodeTime/framesEncoded_in_ms]	11.464285714282596
// 帧的宽度为1280像素
frameWidth	1280	
// 帧的高度为720像素
frameHeight	720
// 帧率为每秒29帧	
framesPerSecond	29	
// 发送的总帧数为617,405帧
framesSent	617405	
// 每秒发送的帧数,约为29.97帧
[framesSent/s]	29.96823367234663
// 发送的大帧数为32帧	
hugeFramesSent	32
// 总的数据包发送延迟为67.48513秒
totalPacketSendDelay	67.48513
// 质量限制持续时间,包括由于带宽限制、CPU限制、无限制和其他原因导致的持续时间
qualityLimitationDurations	{"bandwidth":26.155,"cpu":0,"none":20703.08,"other":0}
// 编码器的实现是OpenH264
encoderImplementation	OpenH264
// 编码质量
qpSum		7521625
inbound-rtp(kind=audio)下行音频
// 接收到的总数据包数量为1,096,329个
packetsReceived	1096329	
// 每秒接收的数据包数量,约为50.28个
[packetsReceived/s]	50.27808810525396
// 接收的总字节数为81,050,273字节
bytesReceived	81050273
// 每秒接收的字节数转换为比特数,约为32,726.79 kbps	
[bytesReceived_in_bits/s]	32726.78658970012	
// 接收的头部字节总数为26,331,120字节
headerBytesReceived	26331120	
// 每秒接收的头部字节数转换为比特数,约为9,696.83 kbps
[headerBytesReceived_in_bits/s]	9696.825656207442
// 最后一个数据包接收的时间戳	
lastPacketReceivedTimestamp	1735197274039.8062
// 最后一个数据包接收的日期和时间	
[lastPacketReceivedTimestamp]	2024/12/26 15:14:34
// 抖动缓冲区的延迟总和	
jitterBufferDelay	56962627.2
// 抖动缓冲区的延迟平均值(以毫秒为单位)	
[jitterBufferDelay/jitterBufferEmittedCount_in_ms]	77.05882352950306
// 目标抖动缓冲区延迟	
jitterBufferTargetDelay	48588288
// 抖动缓冲区延迟与发出计数的比例(以毫秒为单位)
[jitterBufferDelay/jitterBufferEmittedCount_in_ms]	78.4000000000621	
// 另一个目标抖动缓冲区延迟值
jitterBufferTargetDelay	48628550.4	
// 抖动缓冲区的最小延迟
[jitterBufferTargetDelay/jitterBufferEmittedCount_in_ms]	60	
// 从抖动缓冲区发出的总样本数
jitterBufferMinimumDelay	48628550.4	
// 接收到的总样本数
[jitterBufferMinimumDelay/jitterBufferEmittedCount_in_ms]	60	
// 每秒接收的样本数
jitterBufferEmittedCount	1053912000
// 隐藏的样本数,通常是指由于丢包等原因导致的数据不连续,需要通过算法进行填补	
totalSamplesReceived	1055685600	
// 音频级别
[totalSamplesReceived/s]	48042.709969289725
// 总音频能量	
concealedSamples	1854928
// 音频级别的均方根值
audioLevel	0.1988891262550737	
// 样本的总持续时间
totalAudioEnergy	300.06916838604377	
// 总处理延迟
[Audio_Level_in_RMS]	0.14892546098156428	
// 处理延迟与发出计数的比例(以毫秒为单位)
totalSamplesDuration	22018.689999409253	
// 抖动缓冲区的冲洗次数
totalProcessingDelay	52478673.56832	
// 延迟的数据包中断样本数
[totalProcessingDelay/jitterBufferEmittedCount_in_ms]	70.40555102031576
// 相对数据包到达延迟	
jitterBufferFlushes	1	
// 延迟的数据包中断样本数
delayedPacketOutageSamples	152219	
// 相对数据包到达延迟
relativePacketArrivalDelay	8356.16	
// 中断次数
interruptionCount	0	
// 总中断持续时间
totalInterruptionDuration	0
inbound-rtp(kind=video)下行视频
// 使用的编码器是H.264
[codec]	H264 (102, level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f)	
// 网络抖动,表示接收数据包的时间变化,单位通常是秒
jitter	0.008	
// 丢失的数据包数量为6,294个
packetsLost	6294	
// 接收到的总数据包数量为3,361,657个
packetsReceived	3361657	
// 每秒接收的数据包数量,约为160.88个
[packetsReceived/s]	160.87532063312926	
// 接收的总字节数为3,590,296,459字节
bytesReceived	3590296459	
// 每秒接收的字节数转换为比特数,约为1,387,428.49 kbps。
[bytesReceived_in_bits/s]	1387428.4874414976
// 接收的头部字节总数为94,131,424字节	
headerBytesReceived	94131424
// 每秒接收的头部字节数转换为比特数,约为36,036.07 kbps	
[headerBytesReceived_in_bits/s]	36036.07182182096
// 接收到的重传数据包数量为29,195个	
retransmittedPacketsReceived	29195	
// 每秒接收的重传数据包数量,约为4.97个
[retransmittedPacketsReceived/s]	4.965287673862014
// 接收到的重传字节总数为31,110,354字节	
retransmittedBytesReceived	31110354
// 每秒接收的重传字节数转换为比特数,约为43,615.09 kbps	
[retransmittedBytesReceived_in_bits/s]	43615.086927203934
// 重传流的同步源标识符	
rtxSsrc	2171748361	
// 最后一个数据包接收的时间戳
lastPacketReceivedTimestamp	1735197797031.065
// 最后一个数据包接收的日期和时间
[lastPacketReceivedTimestamp]	2024/12/26 15:23:17	
// 抖动缓冲区的延迟
jitterBufferDelay	11971.191576	
// 抖动缓冲区的延迟平均值
[jitterBufferDelay/jitterBufferEmittedCount_in_ms]	24.631333333309158
// 目标抖动缓冲区延迟	
jitterBufferTargetDelay	15834.935496	
[jitterBufferTargetDelay/jitterBufferEmittedCount_in_ms]	29.960066666717466	
// 目标抖动缓冲区延迟
jitterBufferMinimumDelay	15834.935496
// 每秒接收的帧数,约为29.79帧
[jitterBufferMinimumDelay/jitterBufferEmittedCount_in_ms]	29.960066666717466
// 从抖动缓冲区发出的总样本数
jitterBufferEmittedCount	668493	
// 接收到的总帧数为668,469帧
framesReceived	668469	
// 每秒接收的帧数,约为29.79帧
[framesReceived/s]	29.791726043172087	
// 接收帧数减去解码帧数再减去丢弃帧数的差值为-24
[framesReceived-framesDecoded-framesDropped]	-24
// 帧的宽度为1280像素	
frameWidth	1280	
// 帧的高度为720像素
frameHeight	720	
// 帧率为每秒30帧
framesPerSecond	30
// 解码的总帧数为668,469帧	
framesDecoded	668469	
// 每秒解码的帧数,约为29.79帧
[framesDecoded/s]	29.791726043172087
// 解码的关键帧(I帧)数量为229帧	
keyFramesDecoded	229	
[keyFramesDecoded/s]	0
// 丢弃的帧数为24帧	
framesDropped	24	
// 总解码时间为870.105921秒
totalDecodeTime	870.105921
// 每帧解码所需的平均时间,约为2.41毫秒	
[totalDecodeTime/framesDecoded_in_ms]	2.412299999999353
// 总处理延迟	
totalProcessingDelay	12952.590836	
// 总组装时间为821.873153秒
[totalProcessingDelay/jitterBufferEmittedCount_in_ms]	27.191133333326434
// 这表示总组装时间,单位是秒	
totalAssemblyTime 	821.873153
// 每帧在组装过程中平均花费的时间	
[totalAssemblyTime/framesAssembledFromMultiplePackets_in_ms] 	1.539100000002236
// 从多个数据包中组装的帧数为668,004帧	
framesAssembledFromMultiplePackets	668004	
// 总帧间延迟
totalInterFrameDelay	22503.407	
[totalInterFrameDelay/framesDecoded_in_ms]	33.36666666667345
// 总平方帧间延迟	
totalSquaredInterFrameDelay	848.3095429981339
// 帧间延迟的标准差(以毫秒为单位)	
[interFrameDelayStDev_in_ms]	9.046116416493547
// 暂停次数为0	
pauseCount	0	
// 总暂停持续时间为0秒
totalPausesDuration	0	
// 冻结次数为126次
freezeCount	126	
// 总冻结持续时间为34.267秒
totalFreezesDuration	34.267	
// 用的解码器实现是外部解码器(D3D11VideoDecoder)
decoderImplementation	ExternalDecoder (D3D11VideoDecoder)	
// 全帧引用请求(Full Intra Request)的次数为0
firCount	0	
// 画面质量指示(Picture Loss Indication)的次数为2
pliCount	2	
// 负确认(Negative Acknowledgement)的次数为3,782
nackCount	3782
// 启用了能效解码器
powerEfficientDecoder	true	
// 最小播放延迟为0秒
minPlayoutDelay	0
拉流黑屏可以结合发送端和接收端去看

Stats graphs for outbound-rtp (kind=video)是否发送了数据
在这里插入图片描述

Stats graphs for inbound-rtp (kind=video)图看是否接受到数据
在这里插入图片描述

拉流没声音

Stats graphs for inbound-rtp (kind=audio)是否接受到数据
在这里插入图片描述
说话时audioLevel在0.01以上关闭麦克的话再0.001一下到接近于0
在这里插入图片描述


http://www.ppmy.cn/embedded/149375.html

相关文章

基于Oauth2的SSO单点登录---后端

【springbootvue项目(十三)】 Springboot整合Spring SecurityJWT 【springbootvue项目(十四)】基于Oauth2的SSO单点登录(一)整体流程介绍 【springbootvue项目(十五)】基于Oauth2的…

安卓APP-HTTPS抓包Frida Hook教程

文章目录 安卓APP-HTTPS抓包Frida Hook教程本机环境环境搭建bluestacks 环境搭建frida环境搭建抓包流程抓包及https解密方法流量分析查看包名安卓APP-HTTPS抓包Frida Hook教程 本机环境 windows 11bluestacks 5.11.56.1003 p64adb 31.0.2Root Checker 6.5.3wireshark 4.0.5fri…

使用gdb调试C程序

1.程序样例 test.c: #include <stdio.h>int main () { unsigned long long int n, sum; n 1; sum 0; while (n < 100) { sum sum n; n n 1; } return 0; }2.编译程序 gcc -g test.c -o test3.运行调试 gdb test --silent 4.调…

基于GEE云计算、多源遥感、高光谱遥感技术蓝碳储量估算;红树林植被指数计算及提取

海洋是地球上最大的“碳库”,“蓝碳”即海洋活动以及海洋生物&#xff08;特别是红树林、盐沼和海草&#xff09;能够吸收大气中的二氧化碳&#xff0c;并将其固定、储存在海洋中的过程、活动和机制。而维持与提升我国海岸带蓝碳潜力是缓解气候变化的低成本、高效益的方案&…

Spring API 接口加密/解密

API 接口加密/解密 为了安全性需要对接口的数据进行加密处理&#xff0c;不能明文暴露数据。为此应该对接口进行加密/解密处理&#xff0c;对于接口的行为&#xff0c;分别有&#xff1a; 入参&#xff0c;对传过来的加密参数解密。接口处理客户端提交的参数时候&#xff0c;…

插入排序解析:时间复杂度、空间复杂度与优化策略

引言 在众多经典排序算法中&#xff0c;插入排序以其简单易懂、实现简洁而受到广泛应用。尽管它在大规模数据排序中的效率较低&#xff0c;但在小数据集或数据几乎有序的情况下&#xff0c;插入排序的表现却往往超出预期。因此&#xff0c;了解插入排序的工作原理和适用场景&a…

Odoo 免费开源 ERP:通过 JavaScript 创建对话框窗口的技术实践分享

作者 | 老杨 出品 | 上海开源智造软件有限公司&#xff08;OSCG&#xff09; 概述 在本文中&#xff0c;我们将深入研讨如何于 Odoo 18 中构建 JavaScript&#xff08;JS&#xff09;对话框或弹出窗口。对话框乃是展现重要讯息、确认用户操作以及警示用户留意警告或错误的行…

GraphQL 全景攻略:从基础概念到生产落地的技术指南

一、概念与背景 1. 传统 REST 与 GraphQL 的差异 在讨论 GraphQL 之前&#xff0c;有必要先回顾一下在业界被广泛采用的 REST&#xff08;Representational State Transfer&#xff09; 模式。REST 通常通过“资源”概念将后端服务抽象成 GET/POST/PUT/DELETE 等接口。然而&a…