2016-03-08 154 views
1

我正在寫一個應用程序,需要看原始視頻(自定義邊緣檢測等)使用元數據條形碼閱讀器。我需要同時使用AVCaptureVideoDataOutput和AVCaptureMetadataOutput

即使AVCaptureSession有一個addOutput:方法而不是setOutput:方法,這正是它在做什麼 - 第一個在勝利。

如果我添加AVCaptureVideoDataOutput作爲輸出第一 - 它的委託被調用。 如果我首先添加AVCaptureMetadataOutput作爲輸出 - 它的代表被調用。

有沒有人想過解決這個問題? 每隔一幀就移除另一個?

回答

0

我可以同時添加AVCaptureVideoDataOutputAVCaptureMetadataOutput

NSError *error = nil; 

self.captureSession = [[AVCaptureSession alloc] init]; 
[self.captureSession setSessionPreset:AVCaptureSessionPresetHigh]; 

// Select a video device, make an input 
AVCaptureDevice *captureDevice; 
AVCaptureDevicePosition desiredPosition = AVCaptureDevicePositionFront; 
// Find the front facing camera 
for (AVCaptureDevice *device in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) { 
    if ([device position] == desiredPosition) { 
     captureDevice = device; 
     break; 
    } 
} 

AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error]; 

if (!error) { 

    [self.captureSession beginConfiguration]; 

    // add the input to the session 
    if ([self.captureSession canAddInput:deviceInput]) { 
     [self.captureSession addInput:deviceInput]; 
    } 

    AVCaptureMetadataOutput *metadataOutput = [AVCaptureMetadataOutput new]; 
    if ([self.captureSession canAddOutput:metadataOutput]) { 
     [self.captureSession addOutput:metadataOutput]; 

     self.metaDataOutputQueue = dispatch_queue_create("MetaDataOutputQueue", DISPATCH_QUEUE_SERIAL); 
     [metadataOutput setMetadataObjectsDelegate:self queue:self.metaDataOutputQueue]; 
     [metadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]]; 
    } 

    self.videoDataOutput = [AVCaptureVideoDataOutput new]; 
    if ([self.captureSession canAddOutput:self.videoDataOutput]) { 
     [self.captureSession addOutput:self.videoDataOutput]; 

     NSDictionary *rgbOutputSettings = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCMPixelFormat_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]; 
     [self.videoDataOutput setVideoSettings:rgbOutputSettings]; 
     [self.videoDataOutput setAlwaysDiscardsLateVideoFrames:YES]; 

     self.videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue", DISPATCH_QUEUE_SERIAL); 
     [self.videoDataOutput setSampleBufferDelegate:self queue:self.videoDataOutputQueue]; 

     [[self.videoDataOutput connectionWithMediaType:AVMediaTypeVideo] setEnabled:YES]; 
    } 

    [self.captureSession commitConfiguration]; 
    [self.captureSession startRunning]; 
} 
相關問題