同Wi-Fi下获取硬件实时视频流(OC篇) 一、前景介绍 二、OC对接数据

一、前景介绍


  • 任务前提:上面这个硬件打开开关后开启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);
    }

当下网络请求的情况是,一次请求完多次返回值,但没有结束点,所以上面的代理方法,只是用到了前两种。这里也有点坑,结束的方法不会进,我怎么知道这张图片什么时候才是一张完整的图片呢,然后就换了种思路,在每次开始接收数据的时候,不正是上张图接收完整的时候吗。


最终实现的效果:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章