[英]Video Camera native extension for IOS
I'm building a native extension for iOS, where I want to implement a Barcode Scanner. 我正在为iOS构建本机扩展,我想在其中实现条形码扫描仪。
I've followed the AVCam example and I've tried it in a native application (full xcode) and it works ok. 我遵循了AVCam的示例,并在本机应用程序(完整的xcode)中进行了尝试,并且工作正常。
Now, I want to use this code since a Flex mobile project. 现在,我想从Flex移动项目开始使用此代码。 I've been able to create the ANE and put it on a Flex Mobile project, and I can call the functions of the ANE.
我已经能够创建ANE并将其放在Flex Mobile项目中,并且可以调用ANE的功能。
It seems to work ok, but my problem is that I can't see what you're seeing through the camera. 看来还可以,但是我的问题是我无法通过相机看到您看到的内容。 I mean, I have a method where I call to start the camera and init the capture.
我的意思是,我有一个方法可以调用以启动相机并初始化捕获。 I've also implemented the captureOutput delegate, and the most strange thing is that when I run my app, I can see the logs inside the initcapture and captureOutput like the application is capturing the data, but in the iPad I don't see the camera.
我还实现了captureOutput委托,最奇怪的是,当我运行应用程序时,我可以看到initcapture和captureOutput内部的日志,就像应用程序正在捕获数据一样,但是在iPad中,我看不到相机。
This is part of the code I use: 这是我使用的代码的一部分:
- (void)initCapture
{
NSLog(@"camera view capture init");
/*We setup the input*/
self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *captureInput = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];
/*We setupt the output*/
captureOutput = [[AVCaptureVideoDataOutput alloc] init];
// If the queue is blocked when new frames are captured, those frames will be automatically dropped
captureOutput.alwaysDiscardsLateVideoFrames = YES;
//captureOutput.minFrameDuration = CMTimeMake(1, 10); Uncomment it to specify a minimum duration for each video frame
[captureOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
// Set the video output to store frame in BGRA (It is supposed to be faster)
NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;
// Set the video output to store frame in 422YpCbCr8(It is supposed to be faster)
//************************Note this line
NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange];
NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key];
[captureOutput setVideoSettings:videoSettings];
//And we create a capture session
self.captureSession = [[AVCaptureSession alloc] init];
//We add input and output
[self.captureSession addInput:captureInput];
[self.captureSession addOutput:captureOutput];
if ([self.captureSession canSetSessionPreset:AVCaptureSessionPreset1280x720])
{
NSLog(@"camera view Set preview port to 1280X720");
self.captureSession.sessionPreset = AVCaptureSessionPreset1280x720;
} else
//set to 640x480 if 1280x720 not supported on device
if ([self.captureSession canSetSessionPreset:AVCaptureSessionPreset640x480])
{
NSLog(@"camera view Set preview port to 640X480");
self.captureSession.sessionPreset = AVCaptureSessionPreset640x480;
}
/*We add the preview layer*/
self.prevLayer = [AVCaptureVideoPreviewLayer layerWithSession: self.captureSession];
if ([self.prevLayer respondsToSelector:@selector(connection)])
self.prevLayer.connection.videoOrientation = AVCaptureVideoOrientationLandscapeLeft;
else
self.prevLayer.orientation = AVCaptureVideoOrientationLandscapeLeft;
self.prevLayer.frame = CGRectMake(150, 0, 700, 700);
self.prevLayer.videoGravity = AVLayerVideoGravityResizeAspect;
[self.view.layer addSublayer: self.prevLayer];
}
- (void) startScanning {
NSLog(@"camera view start scanning");
self.state = LAUNCHING_CAMERA;
[self.captureSession startRunning];
self.prevLayer.hidden = NO;
self.state = CAMERA;
}
#pragma mark AVCaptureSession delegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
NSLog(@"camera view Capture output");
}
How should I solve this? 我该如何解决?
Thank you very much. 非常感谢你。
I think I've solve it. 我想我已经解决了。
Instead of: 代替:
[self.view.layer addSublayer: self.prevLayer];
I put: 我放:
UIViewController *mainController = [UIApplication sharedApplication].keyWindow.rootViewController;
[mainController.view.layer addSublayer: self.prevLayer];
Now, I can see the camera on my flex application. 现在,我可以在我的flex应用程序上看到相机了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.