一、前景介绍
- 任务前提:上面这个硬件打开开关后开启Wi-Fi,电脑连接上这个Wi-Fi,在网页中输入设备给定的IP地址就能看到设备摄像头里面的实时画面
- 任务目标:要求手机连接上Wi-Fi后,app能够获取到硬件实时视频,并且可以对视频内容朝向进行操作!
设备发出视频流的原理和使用 multipart/x-mixed-replace 实现 http 实时视频流类似,就是硬件摄像头通过取帧的方式,间隔一段时间从摄像头读取当前图像,连续多张图就构成了一个视频(这个设备是每秒30帧)。通过 stream 形式,将图片通过 http 协议输出到客户端,要客户端支持 multipart/x-mixed-replace 头,就可以从响应中读取视频帧。
二、OC对接数据
一开始也没想明白怎么去对接这种数据,我们平时写app的时候基本上都是将AFN封装一下就使用了,没有像这种连接一次可以多次获取到数据的方式。实在没招就想到了iOS自有的NSURLSession网络请求方式去尝试了,一开始走了很多的弯路,也不多说了,我们直接进主题。
选择创建session对象的方式:
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(id <NSURLSessionDelegate>)delegate delegateQueue:(NSOperationQueue *)queue;
这里就是普通的session请求任务,只不过请求的结果不是一次性接收就完了,而是一次请求后能够多次接收值,所以采用NSURLSessionDataTask里面的dataTaskWithURL方法:
-(NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url;
数据请求的完整代码:
//获取图片流
- (void )loadInputStream{
NSURL *url = [NSURL URLWithString:@"http:/***"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];
session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
dataTask = [session dataTaskWithRequest:request];
[dataTask resume];
}
代理方法有四个:
//1.接收到服务器响应的时候调用
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler{
NSLog(@"接收响应");
//必须告诉系统是否接收服务器返回的数据
//默认是completionHandler(NSURLSessionResponseAllow)
//可以再这边通过响应的statusCode来判断否接收服务器返回的数据
completionHandler(NSURLSessionResponseAllow);
}
//2.接受到服务器返回数据的时候调用,可能被调用多次
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
NSLog(@"接收到数据");
}
//3.请求完成或者是失败的时候调用
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(nullable NSError *)error{
NSLog(@"请求完成或者是失败");
//在这边进行完整数据的解析,回调
}
//4.将要缓存响应的时候调用(必须是默认会话模式,GET请求才可以)
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
willCacheResponse:(NSCachedURLResponse *)proposedResponse
completionHandler:(void (^)(NSCachedURLResponse * _Nullable cachedResponse))completionHandler{
//可以在这边更改是否缓存,默认的话是completionHandler(proposedResponse)
//不想缓存的话可以设置completionHandler(nil)
completionHandler(proposedResponse);
}
当下网络请求的情况是,一次请求完多次返回值,但没有结束点,所以上面的代理方法,只是用到了前两种。这里也有点坑,结束的方法不会进,我怎么知道这张图片什么时候才是一张完整的图片呢,然后就换了种思路,在每次开始接收数据的时候,不正是上张图接收完整的时候吗。