IOS 15发布以后,突然发现线上的APP,视频变模糊了,非常模糊,肉眼可明显看出来。
先上图:
拉流端画面:
推流端上行网速:
检查基本情况:
1. 代码没变,近期没上新APP
2. 网络环境良好,不存在网速差的情况
3. 部分机型有这种情况,公司的iPhone 6s没更新系统,能正常工作,iPhone 11 更新到IOS 15系统,存在这种情况.
问题确认:经过多台机器验证,得出结论,IOS 15 以上的系统存在码率兼容问题,现象就是编码之后的视频很模糊。
问题解决:
进过代码排查,发现码率码率设置的接口在新系统上不适用了,可能是以前的代码也没有正确使用。
1. 设置平均码率:
status = VTSessionSetProperty(compressionSession, kVTCompressionPropertyKey_AverageBitRate, (__bridge CFTypeRef)@(_configuration.videoBitRate));
2. 设置码率上限:
status = VTSessionSetProperty(compressionSession, kVTCompressionPropertyKey_DataRateLimits, (__bridge CFArrayRef)limit);
经过反复设置,多次增加码率,最终增加到码率为30M bps才正常,但这种方法肯定是不可控的,没理由无限增大码率
3. 不断查阅资料和查看API的说明,官网说明其实也很模糊,特别是kVTCompressionPropertyKey_DataRateLimits.
最终在接口说明里面看到一个关键信息,时间戳。
TVCompressionSessionEncodeFrame的参数presentationTimeStamp
意思是说每一帧的时间错,需要比前一帧的时间错要大,但是这里大多少没有说明。
原先我也是参考网上大多数的代码:
frameCount ++;
CMTime presentationTimeStamp = CMTimeMake(frameCount, self->timescale);
这里的self->timescale = 1000
这样的结果就是前面1000帧都是正常的码率,frameCount差不多接近1000的时候,码率会掉下来,大概80 B/s.
我试着增大 self->timescale = 10000,不行
然后我减少 self->timescale = 100
这时候码率稳定了,跟我设置的预期差不多。
另外还把kVTCompressionPropertyKey_DataRateLimits 这个参数设置为码率的5倍除以8,因为是字节为单位。
最终的结果修改的地方:
1. 码率和上限设置:
2. 时间戳的单位:
最终效果图:
推流上行码率:
拉流端: