Как отобразить наложение поверх 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
пока он еще работал и показывал превью.