天天看点

iOS 15 H264硬编码码率变小,图像模糊

IOS 15发布以后,突然发现线上的APP,视频变模糊了,非常模糊,肉眼可明显看出来。

先上图:

拉流端画面:

iOS 15 H264硬编码码率变小,图像模糊

推流端上行网速:

iOS 15 H264硬编码码率变小,图像模糊

检查基本情况:

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.

最终在接口说明里面看到一个关键信息,时间戳。

iOS 15 H264硬编码码率变小,图像模糊
iOS 15 H264硬编码码率变小,图像模糊

TVCompressionSessionEncodeFrame的参数presentationTimeStamp

iOS 15 H264硬编码码率变小,图像模糊

 意思是说每一帧的时间错,需要比前一帧的时间错要大,但是这里大多少没有说明。

原先我也是参考网上大多数的代码:

    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,因为是字节为单位。

iOS 15 H264硬编码码率变小,图像模糊

最终的结果修改的地方:

1. 码率和上限设置:

iOS 15 H264硬编码码率变小,图像模糊

2. 时间戳的单位:

iOS 15 H264硬编码码率变小,图像模糊

最终效果图:

推流上行码率:

iOS 15 H264硬编码码率变小,图像模糊

拉流端:

iOS 15 H264硬编码码率变小,图像模糊