将传入的NSStream转换为视图

问题描述:

我正在成功发送一个NSData流。下面的委托方法获取该流并附加到NSMutableData self.data。我如何获取这些数据并将其制作成UIView/AVCaptureVideoPreviewLayer(应该显示视频)?我觉得我错过了另一个转换,AVCaptureSession> NSStream> MCSession> NSStream>?将传入的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 
} 

我这个送流:

-(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); 
} 
+0

您可能想看看您是否可以使用Open GL。把你的数据,转换成GL纹理,然后用GL来显示它。这可能是一个更高级别的API。数据不是以任何标准格式? – nielsbot

+0

什么是视频格式?一个'UIView'?什么是视频的链接? – Larme

+0

视频格式为AVCaptureSession – Eric

您可以作出这样的YOUT处理事件的一个的UIImageView:

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

您也可以ALLOC只有一次,只是调用init。

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

对不起,我的英语,我不知道如果我理解你

+0

这似乎不起作用。 – Eric

我想你需要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]; 
    }); 
} 

管理代表

- (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 
{ 

} 

我希望它有帮助。

+0

CaptureManager的委托方法都不能处理视频。我错过了什么吗? – Eric

+0

@Eric如果有帮助,请参阅https://developer.apple.com/library/ios/samplecode/AVCam/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010112-Intro-DontLinkElementID_2。 – iphonic