5

Мне нужно отобразить наложение изображения (кадра) поверх 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

My frame appears under the video output view

ответ

-5

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

+0

вы против обмена код для ответа? –

3

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

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

0

В настоящее время с помощью прошивки 8.4 и Xcode 6.4

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

View 
    previewView 
    overlayView 

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

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

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

5

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

enter image description here

Смежные вопросы