|
@@ -16,6 +16,15 @@
|
|
|
@interface webRtcPlayerViewController ()<MediaStreamClientEventsDelegate>
|
|
|
{
|
|
|
BOOL outputVolumeKVO;/*标记声音监听通知*/
|
|
|
+
|
|
|
+ double lastTimestamp;/*最后一帧时间戳*/
|
|
|
+ NSNumber *lastBytesReceived;/*最后一帧数据量*/
|
|
|
+ UILabel* netWorkInfoLabel;//网络延时等信息 正式环境屏蔽
|
|
|
+
|
|
|
+ //记录上次 线性增长接收包数
|
|
|
+ long lasPacketsReceived;
|
|
|
+ //记录上次 总丢包数据
|
|
|
+ long lastAlllostData;
|
|
|
}
|
|
|
@property (nonatomic, copy) NSTimer *playerSecondTimer; // 定时器-控制按钮
|
|
|
@property (nonatomic, assign) RTCIceConnectionState linkState;
|
|
@@ -155,6 +164,8 @@
|
|
|
token:@"vclusters"];
|
|
|
|
|
|
HLog(@"result:%ld",result)
|
|
|
+
|
|
|
+ [_mediaStream setShouldGetStats:YES];
|
|
|
}
|
|
|
|
|
|
#pragma mark 重连
|
|
@@ -189,6 +200,22 @@
|
|
|
#pragma mark 初始化其他UI
|
|
|
- (void)initBaseUIFun
|
|
|
{
|
|
|
+ if(netWorkInfoLabel){
|
|
|
+ [netWorkInfoLabel removeFromSuperview];
|
|
|
+ netWorkInfoLabel = nil;
|
|
|
+ }
|
|
|
+ netWorkInfoLabel = [[UILabel alloc] init];
|
|
|
+ [netWorkInfoLabel setTextColor:[UIColor greenColor]];
|
|
|
+ [netWorkInfoLabel setBackgroundColor:HW000000Color60];
|
|
|
+ [netWorkInfoLabel setFont:[UIFont systemFontOfSize:17]];
|
|
|
+ [netWorkInfoLabel setNumberOfLines:0];
|
|
|
+ [self.view addSubview:netWorkInfoLabel];
|
|
|
+
|
|
|
+ [netWorkInfoLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
|
+ make.top.mas_equalTo(80);
|
|
|
+ make.left.mas_equalTo(20);
|
|
|
+ }];
|
|
|
+
|
|
|
if(_bottomContrView){
|
|
|
[_bottomContrView removeFromSuperview];
|
|
|
_bottomContrView = nil;
|
|
@@ -861,7 +888,219 @@
|
|
|
}
|
|
|
|
|
|
-(void)didGetStats:(NSString*)peerName stats:(RTC_OBJC_TYPE(RTCStatisticsReport) *)stats {
|
|
|
- HLog(@"推拉流 stats:%@",stats);
|
|
|
+ NSString *selectedCandidatePairId = nil;
|
|
|
+ NSString *localCandidateId = nil;
|
|
|
+ NSString *remoteCandidateId = nil;
|
|
|
+ /*延时数据*/
|
|
|
+ NSNumber *currentRoundTripTime = nil;
|
|
|
+
|
|
|
+ //线性增长接收包数
|
|
|
+ long packetsReceived = 0;
|
|
|
+
|
|
|
+ //视频丢包数据
|
|
|
+ long videolostData = 0;
|
|
|
+ //音频丢包数据
|
|
|
+ long audiolostData = 0;
|
|
|
+ //总丢包数据
|
|
|
+ long alllostData = 0;
|
|
|
+
|
|
|
+ //每秒帧数 ----界面展示的帧率
|
|
|
+ NSInteger framesPerSecond = 0;
|
|
|
+
|
|
|
+ //计算传输速度
|
|
|
+ long preReceive = 0;
|
|
|
+
|
|
|
+ KWeakSelf
|
|
|
+ for (NSString *key in [stats.statistics allKeys]) {
|
|
|
+ RTCStatistics *rtcStatistics = [stats.statistics objectForKey:key];
|
|
|
+ //HLog(@"hxd11111---->%@",rtcStatistics.type);
|
|
|
+
|
|
|
+ if ([rtcStatistics.type isEqualToString:@"transport"]) {
|
|
|
+ //HLog(@"传输数据---->%@",rtcStatistics.values);
|
|
|
+ double timestamp = rtcStatistics.timestamp_us;
|
|
|
+ NSNumber *bytesReceived = [rtcStatistics.values objectForKey:@"bytesReceived"];
|
|
|
+
|
|
|
+ NSNumber *packetsReceivedNumber = [rtcStatistics.values objectForKey:@"packetsReceived"];
|
|
|
+ packetsReceived = [packetsReceivedNumber longValue];
|
|
|
+
|
|
|
+ if (lastTimestamp > 0) {
|
|
|
+ long diffReceive = [bytesReceived longValue] - [lastBytesReceived longValue];
|
|
|
+ double diffTime = timestamp - lastTimestamp;
|
|
|
+
|
|
|
+ preReceive = (diffReceive / diffTime) * 1000000;
|
|
|
+
|
|
|
+ HLog(@"传输数据速度---->%ld",preReceive);
|
|
|
+
|
|
|
+// mainBlock((^{
|
|
|
+// if (self->mPlayerView.upControlView.hidden == NO){
|
|
|
+// NSString *str = [NSString stringWithFormat:@"清晰度 %ldk/s",preReceive/1024];
|
|
|
+// NSMutableAttributedString *underAttr = [[NSMutableAttributedString alloc] initWithString:str attributes:@{NSForegroundColorAttributeName:[UIColor hwColor:@"#FFFFFF"]}];
|
|
|
+// [underAttr addAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12]} range:NSMakeRange(0, str.length - 2)];
|
|
|
+// [underAttr addAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:10]} range:NSMakeRange(str.length - 2,2)];
|
|
|
+// [self->mPlayerView.upControlView.articulationBtn setAttributedTitle:underAttr forState:(UIControlStateNormal)];
|
|
|
+// }else{
|
|
|
+// NSString *str = [NSString stringWithFormat:@"%ldk/s",preReceive/1024];
|
|
|
+// NSMutableAttributedString *underAttr = [[NSMutableAttributedString alloc] initWithString:str attributes:@{NSForegroundColorAttributeName:[UIColor hwColor:@"#FFFFFF"]}];
|
|
|
+// [underAttr addAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12]} range:NSMakeRange(0, str.length - 2)];
|
|
|
+// [underAttr addAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:10]} range:NSMakeRange(str.length - 2,2)];
|
|
|
+// [self->mPlayerView.controlBtn setAttributedTitle:underAttr forState:(UIControlStateNormal)];
|
|
|
+// }
|
|
|
+// }));
|
|
|
+ }else{
|
|
|
+ lastTimestamp = timestamp;
|
|
|
+ lastBytesReceived = bytesReceived;
|
|
|
+ }
|
|
|
+
|
|
|
+ selectedCandidatePairId = [rtcStatistics.values objectForKey:@"selectedCandidatePairId"];
|
|
|
+ //HLog(@"三网数据--selectedCandidatePairId-->%@",selectedCandidatePairId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /*丢包数据*/
|
|
|
+ if ([rtcStatistics.type isEqualToString:@"inbound-rtp"]) {
|
|
|
+ NSString *kind = [rtcStatistics.values objectForKey:@"kind"];
|
|
|
+
|
|
|
+ if([kind isEqualToString:@"video"]){
|
|
|
+ NSNumber*videolostDataNumber = [rtcStatistics.values objectForKey:@"packetsLost"];
|
|
|
+ videolostData = [videolostDataNumber longValue];
|
|
|
+
|
|
|
+ NSNumber*framesPerSecondNumber = [rtcStatistics.values objectForKey:@"framesPerSecond"];
|
|
|
+ framesPerSecond = [framesPerSecondNumber integerValue];
|
|
|
+ }
|
|
|
+ else if([kind isEqualToString:@"audio"]){
|
|
|
+ NSNumber*audiolostDataNumber = [rtcStatistics.values objectForKey:@"packetsLost"];
|
|
|
+ audiolostData = [audiolostDataNumber longValue];
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ for (NSString *keyin in [rtcStatistics.values allKeys]) {
|
|
|
+ if ([keyin isEqualToString:@"currentRoundTripTime"]){
|
|
|
+ /*延时数据*/
|
|
|
+ currentRoundTripTime = [rtcStatistics.values objectForKey:@"currentRoundTripTime"];
|
|
|
+
|
|
|
+ //[self updateAutoRateAndNetWorkStatesWithDelatyMS:(NSInteger)currentRoundTripTime.floatValue*1000];
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //netWorkInfoLabel 网络信息 测试用
|
|
|
+
|
|
|
+ if (selectedCandidatePairId) {
|
|
|
+ for (NSString *key in [stats.statistics allKeys]) {
|
|
|
+ RTCStatistics *rtcStatistics = [stats.statistics objectForKey:key];
|
|
|
+ if ([rtcStatistics.type isEqualToString:@"candidate-pair"]){
|
|
|
+ NSString *tempselectedCandidatePairId = rtcStatistics.id;
|
|
|
+ if ([tempselectedCandidatePairId isEqualToString:selectedCandidatePairId]) {
|
|
|
+ localCandidateId = [rtcStatistics.values objectForKey:@"localCandidateId"];
|
|
|
+ remoteCandidateId = [rtcStatistics.values objectForKey:@"remoteCandidateId"];
|
|
|
+
|
|
|
+ HLog(@"三网数据--localCandidateId-->%@",localCandidateId);
|
|
|
+ HLog(@"三网数据--remoteCandidateId-->%@",remoteCandidateId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ NSString *remoteCandidateStr = nil;
|
|
|
+ NSString *localCandidateStr = nil;
|
|
|
+ if (localCandidateId && remoteCandidateId) {
|
|
|
+ for (NSString *key in [stats.statistics allKeys]) {
|
|
|
+ RTCStatistics *rtcStatistics = [stats.statistics objectForKey:key];
|
|
|
+ if ([rtcStatistics.type isEqualToString:@"local-candidate"]){
|
|
|
+ NSString *templocalCandidateId = rtcStatistics.id;
|
|
|
+ if ([templocalCandidateId isEqualToString:localCandidateId]) {
|
|
|
+ HLog(@"三网数据--localCandidateIdInfo-->%@",rtcStatistics.values);
|
|
|
+ localCandidateStr = @"本地\n";
|
|
|
+ NSString *candidateType = [rtcStatistics.values objectForKey:@"candidateType"];
|
|
|
+ if (candidateType) {
|
|
|
+ localCandidateStr = [localCandidateStr stringByAppendingString:[NSString stringWithFormat:@"candidateType:%@",candidateType]];
|
|
|
+ localCandidateStr = [localCandidateStr stringByAppendingString:@"\n"];
|
|
|
+ }
|
|
|
+ NSString *address = [rtcStatistics.values objectForKey:@"address"];
|
|
|
+ if (address) {
|
|
|
+ localCandidateStr = [localCandidateStr stringByAppendingString:[NSString stringWithFormat:@"address:%@",address]];
|
|
|
+ localCandidateStr = [localCandidateStr stringByAppendingString:@"\n"];
|
|
|
+ }
|
|
|
+ NSString *ip = [rtcStatistics.values objectForKey:@"ip"];
|
|
|
+ if (ip) {
|
|
|
+ localCandidateStr = [localCandidateStr stringByAppendingString:[NSString stringWithFormat:@"ip:%@",ip]];
|
|
|
+ localCandidateStr = [localCandidateStr stringByAppendingString:@"\n"];
|
|
|
+ }
|
|
|
+ NSString *relatedAddress = [rtcStatistics.values objectForKey:@"relatedAddress"];
|
|
|
+ if (relatedAddress) {
|
|
|
+ localCandidateStr = [localCandidateStr stringByAppendingString:[NSString stringWithFormat:@"relatedAddress:%@",relatedAddress]];
|
|
|
+ localCandidateStr = [localCandidateStr stringByAppendingString:@"\n"];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else if ([rtcStatistics.type isEqualToString:@"remote-candidate"]){
|
|
|
+ NSString *tempRemoteCandidateId = rtcStatistics.id;
|
|
|
+ if ([tempRemoteCandidateId isEqualToString:remoteCandidateId]) {
|
|
|
+ HLog(@"三网数据--remoteCandidateIdInfo-->%@",rtcStatistics.values);
|
|
|
+ remoteCandidateStr = @"远端\n";
|
|
|
+ NSString *candidateType = [rtcStatistics.values objectForKey:@"candidateType"];
|
|
|
+ if (candidateType) {
|
|
|
+ remoteCandidateStr = [remoteCandidateStr stringByAppendingString:[NSString stringWithFormat:@"candidateType:%@",candidateType]];
|
|
|
+ remoteCandidateStr = [remoteCandidateStr stringByAppendingString:@"\n"];
|
|
|
+ }
|
|
|
+ NSString *address = [rtcStatistics.values objectForKey:@"address"];
|
|
|
+ if (address) {
|
|
|
+ remoteCandidateStr = [remoteCandidateStr stringByAppendingString:[NSString stringWithFormat:@"address:%@",address]];
|
|
|
+ remoteCandidateStr = [remoteCandidateStr stringByAppendingString:@"\n"];
|
|
|
+ }
|
|
|
+ NSString *ip = [rtcStatistics.values objectForKey:@"ip"];
|
|
|
+ if (ip) {
|
|
|
+ remoteCandidateStr = [remoteCandidateStr stringByAppendingString:[NSString stringWithFormat:@"ip:%@",ip]];
|
|
|
+ remoteCandidateStr = [remoteCandidateStr stringByAppendingString:@"\n"];
|
|
|
+ }
|
|
|
+ NSString *relatedAddress = [rtcStatistics.values objectForKey:@"relatedAddress"];
|
|
|
+ if (relatedAddress) {
|
|
|
+ remoteCandidateStr = [remoteCandidateStr stringByAppendingString:[NSString stringWithFormat:@"relatedAddress:%@",relatedAddress]];
|
|
|
+ remoteCandidateStr = [remoteCandidateStr stringByAppendingString:@"\n"];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ NSString *showStr = @"";
|
|
|
+ if (localCandidateStr) {
|
|
|
+ showStr = [showStr stringByAppendingString:localCandidateStr];
|
|
|
+ }
|
|
|
+ if (remoteCandidateStr) {
|
|
|
+ showStr = [showStr stringByAppendingString:remoteCandidateStr];
|
|
|
+ }
|
|
|
+
|
|
|
+ //网络延迟, 丢包率,FPS,网速 分辨率 流量
|
|
|
+ //延时数据
|
|
|
+ NSString*currentRoundTripTimeStr = [[NSString alloc] initWithFormat:@"延时:%ldms\n",(NSInteger)(currentRoundTripTime.floatValue*1000)];
|
|
|
+ showStr = [showStr stringByAppendingString:currentRoundTripTimeStr];
|
|
|
+
|
|
|
+ //计算上次报道到这一次的丢包率---------界面展示百分比丢包率
|
|
|
+ long allPacketsReceived = packetsReceived - lasPacketsReceived;
|
|
|
+ alllostData = audiolostData + videolostData;
|
|
|
+
|
|
|
+ NSInteger lostRate = ((alllostData - lastAlllostData) *1.0 / (allPacketsReceived + (alllostData - lastAlllostData))) *100;
|
|
|
+ //记录上一次丢包数
|
|
|
+ lastAlllostData = alllostData;
|
|
|
+ //记录上一次接收包数
|
|
|
+ lasPacketsReceived = packetsReceived;
|
|
|
+
|
|
|
+ NSString*lostDataStr = [[NSString alloc] initWithFormat:@"丢包率:(%ld/%ld) %ld%%\n",alllostData - lastAlllostData,allPacketsReceived + alllostData - lastAlllostData,lostRate];
|
|
|
+ showStr = [showStr stringByAppendingString:lostDataStr];
|
|
|
+
|
|
|
+ //FPS
|
|
|
+ NSString*FPSStr = [[NSString alloc] initWithFormat:@"FPS:%ld\n",framesPerSecond];
|
|
|
+ showStr = [showStr stringByAppendingString:FPSStr];
|
|
|
+
|
|
|
+ //网速 传输数据速度
|
|
|
+ NSString *netDataSpeedStr = [NSString stringWithFormat:@"传输数据速度:%ldk/s\n",preReceive/1024];
|
|
|
+ showStr = [showStr stringByAppendingString:netDataSpeedStr];
|
|
|
+
|
|
|
+ mainBlock(^{
|
|
|
+ [self->netWorkInfoLabel setText:showStr];
|
|
|
+ });
|
|
|
+
|
|
|
}
|
|
|
|
|
|
#pragma mark 收到的webrtc消息处理
|