webrtc-internals调试工具

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(网络地址转换)和防火墙后面建立端到端的连接

json 复制代码
{
// 表示这个候选与哪个媒体流(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

相关推荐
换个昵称都难1 天前
webrtc源码解析概要介绍
webrtc
换个昵称都难1 天前
WebRTC 完整调用流程(前端纯 JS 实现,最简可运行)
webrtc
换个昵称都难2 天前
webrtc 拥塞控制GCC 和PCC
webrtc
Cxiaomu2 天前
React接入WebRTC实时视频实践
react.js·音视频·webrtc
AndyHuang19762 天前
WebRTC 强制 Relay 模式下 TCP 重连失败深度排查与优化实战
webrtc
换个昵称都难2 天前
webrtc pacing 平滑发包模块
webrtc
换个昵称都难2 天前
webrtc 音频混音介绍
音视频·webrtc
换个昵称都难3 天前
webrtc QOS-RemoteBitrateEstimator接收端带宽估计(1)
webrtc
换个昵称都难3 天前
webrtc QOS-RemoteBitrateEstimator接收端带宽估计-四个实例(2)
webrtc
都在酒里3 天前
【极致低延时】香橙派部署 MediaMTX 实现 WebRTC 推流,延时仅 500-800ms,比局域网 ffmpeg 拉流快近 10 倍!(附踩坑全记录)
linux·arm开发·ffmpeg·webrtc·orangepi·嵌入式软件