2013-05-13 44 views
9

Tôi đã cố gắng để đầu vào máy ảnh hiển thị trên chế độ xem lớp xem trước.Xem trước máy ảnh tới AVCaptureVideoPreviewLayer

self.cameraPreviewView được gắn với một UIView trong IB

Đây là mã hiện tại của tôi mà tôi đặt lại với nhau từ Programming Guide AV Foundation. Nhưng xem trước không bao giờ thấy

AVCaptureSession *session = [[AVCaptureSession alloc] init]; 
    session.sessionPreset = AVCaptureSessionPresetHigh; 

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 

    NSError *error = nil; 
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; 

    if (!input) { 
     NSLog(@"Couldn't create video capture device"); 
    } 
    [session addInput:input]; 


     // Create video preview layer and add it to the UI 
     AVCaptureVideoPreviewLayer *newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 
     UIView *view = self.cameraPreviewView; 
     CALayer *viewLayer = [view layer]; 

     newCaptureVideoPreviewLayer.frame = view.bounds; 

     [viewLayer addSublayer:newCaptureVideoPreviewLayer]; 

     self.cameraPreviewLayer = newCaptureVideoPreviewLayer; 



     [session startRunning]; 
+0

bạn có thể thử bên dưới mã ... newCaptureVideoPreviewLayer.frame = self.cameraPreviewView.bounds; [self.cameraPreviewView.layer addSublayer: newCaptureVideoPreviewLayer]; [session startRunning]; – BhushanVU

+0

@bhuXan - Chỉ cần thử và vẫn nhìn đen. –

Trả lời

19

Vì vậy, sau một số thử và sai và nhìn vào táo của AVCam Mẫu Mã

tôi quấn mã PreviewLayer và phiên startRunning thành một khối văn trung ương lớn như vậy và nó bắt đầu làm việc.

dispatch_async(dispatch_get_main_queue(), ^{ 
    AVCaptureVideoPreviewLayer *newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 
    UIView *view = self.cameraPreviewView; 
    CALayer *viewLayer = [view layer]; 

    newCaptureVideoPreviewLayer.frame = view.bounds; 

    [viewLayer addSublayer:newCaptureVideoPreviewLayer]; 

    self.cameraPreviewLayer = newCaptureVideoPreviewLayer; 

    [session startRunning]; 
}); 
+6

Hàng khó khăn nhất ở đây là ** [session startRunning]; ** vì nó không được trình bày trong phần hướng dẫn nhất, không may. –

+0

Xin lỗi tôi đã không hiểu chính xác 'self.cameraPreviewLayer' là gì? Confused cuz nó rõ ràng cho chúng ta một lỗi nếu nó là một uiview –

17

đây là mã của tôi, nó hoạt động hoàn hảo đối với tôi, bạn có thể tham khảo nó

- (void)initCapture 
{ 
    AVCaptureDevice *inputDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
    AVCaptureDeviceInput *captureInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:nil]; 
    if (!captureInput) { 
     return; 
    } 
    AVCaptureVideoDataOutput *captureOutput = [[AVCaptureVideoDataOutput alloc] init]; 
    /* captureOutput:didOutputSampleBuffer:fromConnection delegate method !*/ 
    [captureOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; 
    NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey; 
    NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]; 
    NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key]; 
    [captureOutput setVideoSettings:videoSettings]; 
    self.captureSession = [[AVCaptureSession alloc] init]; 
    NSString* preset = 0; 
    if (!preset) { 
     preset = AVCaptureSessionPresetMedium; 
    } 
    self.captureSession.sessionPreset = preset; 
    if ([self.captureSession canAddInput:captureInput]) { 
     [self.captureSession addInput:captureInput]; 
    } 
    if ([self.captureSession canAddOutput:captureOutput]) { 
     [self.captureSession addOutput:captureOutput]; 
    } 

    //handle prevLayer 
    if (!self.captureVideoPreviewLayer) { 
     self.captureVideoPreviewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession]; 
    } 

    //if you want to adjust the previewlayer frame, here! 
    self.captureVideoPreviewLayer.frame = self.view.bounds; 
    self.captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
    [self.view.layer addSublayer: self.captureVideoPreviewLayer]; 
    [self.captureSession startRunning]; 
} 
+1

tất nhiên, bạn cũng có thể quấn nó với dispatch_async khối. – jianpx

+0

Cảm ơn bạn đã làm việc như say mê :-) –

+0

Điều này có thực sự ghi lại không? – user717452

Các vấn đề liên quan