Как отобразить наложение поверх AVCaptureVideoPreviewLayer

Мне нужно отобразить наложение изображения (кадра) поверх AVCaptureVideoPreviewLayer. Как я могу это сделать?

-(void) viewDidAppear:(BOOL)animated
{
    AVCaptureSession *session = [[AVCaptureSession alloc] init];
    session.sessionPreset = AVCaptureSessionPresetPhoto;
    [session commitConfiguration];

    CALayer *viewLayer = self.vImagePreview.layer;
    NSLog(@"viewLayer = %@", viewLayer);

    AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];

    captureVideoPreviewLayer.frame = self.vImagePreview.bounds;
    [self.vImagePreview.layer addSublayer:captureVideoPreviewLayer];

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    NSError *error = nil;
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
    if (!input) {
        // Handle the error appropriately.
        NSLog(@"ERROR: trying to open camera: %@", error);
    }
    [session addInput:input];

    _stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
    NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil];
    [_stillImageOutput setOutputSettings:outputSettings];

    [session addOutput:_stillImageOutput];

    [session startRunning];

}

Добавление нового вида поверх слоя вывода видео не работает. Слой предварительного просмотра отображается поверх всех видов.

Моя иерархия представлений:

  • MainView
    • OverlayView
    • VideoOutputView

Мой кадр появляется под видом видео выхода

4 ответа

Решение

Решается путем создания всех представлений программно (без раскадровки)

Хотя этот вопрос был задан N лет назад, я хотел бы поделиться своим точным ответом. Через несколько минут я смог понять, что сказал Гуджамин. Действительно, решение может быть сделано это программно. Но если вы работаете в XIB или раскадровке, проверьте эту иерархию. Не помещайте какие-либо подпредставления в ваш CameraPreviewView (вид, в котором его слой будет камерой).

введите описание изображения здесь

Я понял. Хитрость заключалась в том, чтобы иметь представление просмотра видео как его собственное представление без чего-либо внутри (без подпредставлений), а затем добавить наложения как родственные представления (а не как дочерние представления).

Это решение работает в Интерфейсном Разработчике, не прибегая к программному созданию представлений.

В настоящее время используется iOS 8.4 и Xcode 6.4

Мне удалось добавить два подслоя в self.viewоба добавлены в раскадровку. В наброске документа у меня теперь есть: (порядок важен - к сожалению, нижние представления нарисованы НА ВЕРХЕ взглядов над ними - совсем не смущают. Убедитесь, что overlayView не непрозрачный)

View
    previewView
    overlayView

Я сохранил розетки для обоих подпредставлений в своем коде, чтобы я мог добавить AVCaptureVideoPreviewLayer непосредственно как подслой previewView и установить datasource из моего overlayView

За overlayView Я сделал собственный подкласс UIView чтобы я мог реализовать drawRect:

В drawRect: Я смог нарисовать прямоугольники вокруг захваченных штрих-кодов, идентифицированных в моем AVCaptureSession пока он еще работал и показывал превью.

Другие вопросы по тегам