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