NSURLSession:流式传输延迟峰值

时间:2019-04-18 12:36:31

标签: ios nsurlsession live-streaming nsurlsessionuploadtask

我们有流媒体应用程序,该应用程序实际上是在非常紧凑的时间表中将数据(视频块)上传到服务器上。我们使用http流式传输(通过NSURLSession uploadTaskWithStreamedRequest)而不是websockets /直接连接。 区块大小约为100Kb-300Kb。而且我们有一个上传问题,很难追根溯源……欢迎您提出任何建议。

问题:某些文件的上传延迟有时会激增。像15到20中的1个文件一样,上载速度是其他文件的两倍。这偶尔会发生,并且没有任何可见的atter啪声。即使在非常好的连接上也会发生这种情况。 而且,在网络条件允许稳定上传的情况下,我们必须摆脱这种尖峰-因为我们进行视频流传输,即使15-20个“后期”文件中的1个也会给我们的用户“暂停”实时播放。

我们能够在理想条件下在本地网络中详细再现这种情况。 1)客户端(上载器):带有IOS12的iPhone XR。 2)客户端通过Wi-Fi通过本地网络上传大小为300Kb的单个文件。成功上传完客户端后,便开始再次上传它,因此我们可以测量顺序上传统计信息 3)服务器:Node.js无所作为-仅接收数据和日志计时。 4)上传代码:

***
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
configuration.allowsCellularAccess = YES;
configuration.HTTPShouldUsePipelining = YES;
configuration.networkServiceType = NSURLNetworkServiceTypeVoice;
***
NSInputStream* inputStream = [[NSInputStream alloc] initWithFileAtPath: pathTo300KbFile ];
[httpManager setTaskNeedNewBodyStreamBlock:^NSInputStream * _Nonnull(NSURLSession * _Nonnull session, NSURLSessionTask * _Nonnull task) {
    return inputStream;
}];
***
NSMutableURLRequest *fileRequest = [NSMutableURLRequest requestWithURL:URL
                                                       cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                                   timeoutInterval:100];
[fileRequest setHTTPMethod:@"POST"];
***
NSURLSessionUploadTask* uploadTask = [httpManager uploadTaskWithStreamedRequest:fileRequest progress:... completionHandler:...];
[uploadTask resume];
***

这段代码只是在uploadTask返回成功(通过回调)之后从头开始重新上传

5)“正常”测试结果。这种情况通常发生在大多数时间,您可以看到本地网络上300Kb文件的平均上传时间非常短且稳定-大约为0.5秒

2019-04-18 15:07:44.793512+0300 DVGCore_Example[2016:1384429] VidLib: #191:300kb-s1-7. Success: +0.54
2019-04-18 15:07:46.019874+0300 DVGCore_Example[2016:1384370] VidLib: #192:300kb-s1-8. Success: +0.67
2019-04-18 15:07:46.828315+0300 DVGCore_Example[2016:1383910] VidLib: #193:300kb-s1-9. Success: +0.37
2019-04-18 15:07:48.383446+0300 DVGCore_Example[2016:1383909] VidLib: #194:300kb-s1-10. Success: +0.83
2019-04-18 15:07:48.948218+0300 DVGCore_Example[2016:1384429] VidLib: #195:300kb-s1-1. Success: +0.29
2019-04-18 15:07:50.116136+0300 DVGCore_Example[2016:1383910] VidLib: #196:300kb-s1-2. Success: +0.37
2019-04-18 15:07:51.168454+0300 DVGCore_Example[2016:1384428] VidLib: #197:300kb-s1-3. Success: +0.33
2019-04-18 15:07:52.244631+0300 DVGCore_Example[2016:1384370] VidLib: #198:300kb-s1-4. Success: +0.33

有关平均值(带有接收时间),正常上传的服务器日志示例:https://gist.github.com/IPv6/27dc7a8e4a53b5219e39cce73691c0be

6)但是对于某些上传,有时会出现上传时间的高峰。长2-3倍

2019-04-18 15:16:50.492425+0300 DVGCore_Example[2022:1385864] VidLib: #124:300kb-s1-8. Success: +1.87
2019-04-18 15:22:06.395094+0300 DVGCore_Example[2027:1387221] VidLib: #200:300kb-s1-6. Success: +2.11
2019-04-18 15:23:28.329843+0300 DVGCore_Example[2027:1387610] VidLib: #281:300kb-s1-9. Success: +2.84

此上传的服务器日志示例:https://gist.github.com/IPv6/8d92b3899682c4cf697dbfb64a1b752c

底部:没有任何原因(没有网络问题等),并且似乎IOS应该能够进行流媒体传输而不会延迟数小时。但这不会发生。

我们在理想的本地环境中看到了这种情况,在“现实世界”中,相同的峰值更加频繁。

问题是-如何摆脱它们?有什么想法吗?

1 个答案:

答案 0 :(得分:0)

不错的文章,有助于追溯原因 https://forums.developer.apple.com/thread/45210

在我们的案例中,用于测试的wifi路由器在接收流量时遇到问题