iphone - 如何初始化 AVCaptureMetadataOutput 对象?

标签 iphone ios avfoundation avcapturesession

我正在尝试Apple的新功能AVMetadataFaceObject在我的 ios 6 应用程序中,您可以识别面孔。基本上,他们想要实现的是创建 AVCaptureMetadataOutput 对象并将其设置为现有的 AVAVCaptureSession 作为输出。 所以,我从这个 link 得到了 squarecam Apple 的示例代码

我尝试创建这样的对象:

    CaptureObject = [[AVCaptureMetadataOutput alloc]init];
objectQueue =       dispatch_queue_create("VideoDataOutputQueue", NULL);//dispatch_queue_create("newQueue", NULL);
[CaptureObject setMetadataObjectsDelegate:self queue:objectQueue];

我将在此处添加输入到 session :

- (void)setupAVCapture

{ NSError *错误 = nil;

AVCaptureSession *session = [AVCaptureSession new];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
    [session setSessionPreset:AVCaptureSessionPreset640x480];
else
    [session setSessionPreset:AVCaptureSessionPresetPhoto];

// Select a video device, make an input
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
require( error == nil, bail );

isUsingFrontFacingCamera = NO;
if ( [session canAddInput:deviceInput] )
    [session addInput:deviceInput];

// Make a still image output
stillImageOutput = [AVCaptureStillImageOutput new];
[stillImageOutput addObserver:self forKeyPath:@"capturingStillImage" options:NSKeyValueObservingOptionNew context:AVCaptureStillImageIsCapturingStillImageContext];
if ( [session canAddOutput:stillImageOutput] )
    [session addOutput:stillImageOutput ];
    **[session addOutput:CaptureObject];//////HERE///////**

     // Make a video data output
videoDataOutput = [AVCaptureVideoDataOutput new];

// we want BGRA, both CoreGraphics and OpenGL work well with 'BGRA'
NSDictionary *rgbOutputSettings = [NSDictionary dictionaryWithObject:
                                   [NSNumber numberWithInt:kCMPixelFormat_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey];
[videoDataOutput setVideoSettings:rgbOutputSettings];
[videoDataOutput setAlwaysDiscardsLateVideoFrames:YES]; // discard if the data output queue is blocked (as we process the still image)

// create a serial dispatch queue used for the sample buffer delegate as well as when a still image is captured
// a serial dispatch queue must be used to guarantee that video frames will be delivered in order
// see the header doc for setSampleBufferDelegate:queue: for more information
videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue", DISPATCH_QUEUE_SERIAL);
[videoDataOutput setSampleBufferDelegate:self queue:videoDataOutputQueue];

if ( [session canAddOutput:videoDataOutput] )
    [session addOutput:videoDataOutput];
[[videoDataOutput connectionWithMediaType:AVMediaTypeVideo] setEnabled:NO];

effectiveScale = 1.0;
previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
[previewLayer setBackgroundColor:[[UIColor blackColor] CGColor]];
[previewLayer setVideoGravity:AVLayerVideoGravityResizeAspect];
CALayer *rootLayer = [previewView layer];
[rootLayer setMasksToBounds:YES];
[previewLayer setFrame:[rootLayer bounds]];
[rootLayer addSublayer:previewLayer];
[session startRunning];

}}

所以基本上委托(delegate)应该调用这个方法:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{

}

但没有发生。

有什么想法吗?

最佳答案

建议您使用主队列来存储元数据。这是我唯一能看到的可能是错误的。

AVCaptureMetadataOutput *metadataOutput;
metadataOutput = [AVCaptureMetadataOutput new];
[metadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[session addOutput:metadataOutput];

关于iphone - 如何初始化 AVCaptureMetadataOutput 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13067117/

相关文章:

iphone - UIViewController View -> loadView 与 viewWillAppear

iphone - 我可以允许用户在 GPUImage Framework 中放大和缩小吗

ios - 更改以编程方式创建的自定义 inputAccessoryView 的高度? swift 4

ios - 实时更改 AVSpeechUtterance 速率

iphone - 服务器未提出质询时的 NSURL 身份验证

iphone - MPMoviePlayerController 应该只在横向模式下

ios - 在 forwardPlaybackEndTime 后恢复 AVPlayer

iphone - 裁剪 AVCaptureSession 捕获的图像

ios - 在 IOS 中无法从 Google Drive 获取文件

ios - 是否可以将 Svelte/Sapper 应用程序转换为 Cordova