3

カメラまたはプレビュー インターフェイスをロードせずに、カメラからバックグラウンドで画像をキャプチャしようとしています。

私のアプリでは、写真はプレビュー画面なしでバックグラウンドで撮影され、通常のアプリ画面だけで、後でユーザーに表示されます。

誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

2

AVCaptureSession と AVCaptureDeviceInput を使用する必要があります。

これはコードの一部です。

@interface MyViewController : UIViewController
{
    AVCaptureStillImageOutput *_output;
    AVCaptureConnection *_videoConnection;
    bool _isCaptureSessionStarted;
}

@property (retain, nonatomic) AVCaptureDevice *frontalCamera;

- (void)takePhoto;

実装:

@interface MyViewController ()

@end

@implementation MyViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        _isCaptureSessionStarted = false;
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Finding frontal camera
    NSArray *cameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];

    for (int i = 0; i < cameras.count; i++) {
        AVCaptureDevice *camera = [cameras objectAtIndex:i];

        if (camera.position == AVCaptureDevicePositionFront) {
            self.frontalCamera = camera;

            [self.frontalCamera addObserver:self forKeyPath:@"adjustingExposure" options:NSKeyValueObservingOptionNew context:nil];
            [self.frontalCamera addObserver:self forKeyPath:@"adjustingWhiteBalance" options:NSKeyValueObservingOptionNew context:nil];
        }
    }
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if (!self.frontalCamera.adjustingExposure && !self.frontalCamera.adjustingWhiteBalance) {
        if (_isCaptureSessionStarted) {
            [self captureStillImage];
        }
    }
}

- (void)takePhoto
{
    if (self.frontalCamera != nil) {
        // Add camera to session
        AVCaptureSession *session = [[AVCaptureSession alloc] init];

        NSError *error;
        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:self.frontalCamera error:&error];

        if (!error && [session canAddInput:input]) {
            [session addInput:input];

            // Capture still image
            _output = [[AVCaptureStillImageOutput alloc] init];

            // Captured image settings
            [_output setOutputSettings:[[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG, AVVideoCodecKey, nil]];

            if ([session canAddOutput:_output]) {
                [session addOutput:_output];

                _videoConnection = nil;

                for (AVCaptureConnection *connection in _output.connections) {
                    for (AVCaptureInputPort *port in [connection inputPorts]) {
                        if ([[port mediaType] isEqual:AVMediaTypeVideo]) {
                            _videoConnection = connection;
                            break;
                        }
                    }
                    if (_videoConnection) {
                        break;
                    }
                }

                if (_videoConnection) {
                    [session startRunning];
                    NSLock *lock = [[[NSLock alloc] init] autorelease];
                    [lock lock];
                    _isCaptureSessionStarted = true;
                    [lock unlock];
                }
            }
        } else {
            NSLog(@"%@",[error localizedDescription]);
        }
    }
}

- (void) captureStillImage
{
    [_output captureStillImageAsynchronouslyFromConnection:_videoConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {

        NSLock *lock = [[[NSLock alloc] init] autorelease];
        [lock lock];
        _isCaptureSessionStarted = false;
        [lock unlock];

        if (imageDataSampleBuffer != NULL) {
            NSData *bitmap = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];

//            You can get image here via [[UIImage alloc] initWithData:bitmap]
        }
    }];
}
于 2013-09-11T08:49:13.267 に答える