将传入的NSStream转换为视图

我正在成功发送一个NSData的stream。 下面的委托方法是获取该stream并附加到NSMutableData self.data。 如何获取这些数据,并将其制作成一个UIView / AVCaptureVideoPreviewLayer(应该显示video)? 我觉得我错过了另一个转换,AVCaptureSession> NSStream> MCSession> NSStream>?

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { switch(eventCode) { case NSStreamEventHasBytesAvailable: { if(!self.data) { self.data = [NSMutableData data]; } uint8_t buf[1024]; unsigned int len = 0; len = [(NSInputStream *)stream read:buf maxLength:1024]; if(len) { [self.data appendBytes:(const void *)buf length:len]; } else { NSLog(@"no buffer!"); } // Code here to take self.data and convert the NSData to UIView/Video } 

我发送这个stream:

 -(void) captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection*)connection { CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); CVPixelBufferLockBaseAddress(imageBuffer,0); size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); // size_t width = CVPixelBufferGetWidth(imageBuffer); size_t height = CVPixelBufferGetHeight(imageBuffer); void *src_buff = CVPixelBufferGetBaseAddress(imageBuffer); NSData *data = [NSData dataWithBytes:src_buff length:bytesPerRow * height]; CVPixelBufferUnlockBaseAddress(imageBuffer, 0); NSError *error; self.oStream = [self.mySession startStreamWithName:@"videoOut" toPeer:[[self.mySession connectedPeers]objectAtIndex:0] error:&error]; self.oStream.delegate = self; [self.oStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; [self.oStream open]; [self.oStream write:[data bytes] maxLength:[data length]]; // CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer( sampleBuffer ); CGSize imageSize = CVImageBufferGetEncodedSize( imageBuffer ); // also in the 'mediaSpecific' dict of the sampleBuffer NSLog( @"frame captured at %.fx%.f", imageSize.width, imageSize.height ); } 

我想你需要AVCaptureManager ,看下面的代码是否适合你

 AVCamCaptureManager *manager = [[AVCamCaptureManager alloc] init]; [self setCaptureManager:manager]; [[self captureManager] setDelegate:self]; if ([[self captureManager] setupSession]) { // Create video preview layer and add it to the UI AVCaptureVideoPreviewLayer *newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:[[self captureManager] session]]; UIView *view = self.videoPreviewView;//Add a view in XIB where you want to show video CALayer *viewLayer = [view layer]; [viewLayer setMasksToBounds:YES]; CGRect bounds = [view bounds]; [newCaptureVideoPreviewLayer setFrame:bounds]; [newCaptureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; [viewLayer insertSublayer:newCaptureVideoPreviewLayer below:[[viewLayer sublayers] objectAtIndex:0]]; [self setCaptureVideoPreviewLayer:newCaptureVideoPreviewLayer]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [[[self captureManager] session] startRunning]; }); } 

pipe理代表

 - (void)captureManager:(AVCamCaptureManager *)captureManager didFailWithError:(NSError *)error { } - (void)captureManagerRecordingBegan:(AVCamCaptureManager *)captureManager { } - (void)captureManagerRecordingFinished:(AVCamCaptureManager *)captureManager outputURL:(NSURL *)url { } - (void)captureManagerStillImageCaptured:(AVCamCaptureManager *)captureManager { } - (void)captureManagerDeviceConfigurationChanged:(AVCamCaptureManager *)captureManager { } 

我希望它有帮助。

你可以使用UIImageView来处理这样的事件:

UIImageView * iv = [[UIImageView alloc] initWithImage: [UIImage imageWithData: self.data];

你也可以只分配一次,只需调用init。

每当你从套接字接收到,你初始化UIImageView,你可以显示它添加到UIView的UIImageView。

对不起,我的英文,我不知道我是否理解你