在 iOS 的 UIView 中显示摄像头画面
Display camera feed in UIView in iOS
我有一个 iOS 应用程序,在视图控制器中放置了一个简单的 UIView
。我正在尝试在 UIView
中显示前置摄像头的摄像头画面。我不是要拍照或录制视频,我只是想在 UIView
.
中显示实时提要
我已经尝试实施 AVCaptureVideoPreviewLayer
,但是我得到的提要是空白的。似乎什么都没有发生。这是我的代码:
AVCaptureSession *session = [[AVCaptureSession alloc] init];
[session setSessionPreset:AVCaptureSessionPresetPhoto];
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil;
AVCaptureDeviceInput *input;
@try {
input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
} @catch (NSException *exception) {
NSLog(@"Error; %@", error);
} @finally {
if (error == nil) {
if ([session canAddInput:input]) {
[session addInput:input];
AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
[stillImageOutput setOutputSettings:@{AVVideoCodecKey : AVVideoCodecJPEG}];
if ([session canAddOutput:stillImageOutput]) {
[session setSessionPreset:AVCaptureSessionPresetHigh];
[session addOutput:stillImageOutput];
AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
[previewLayer setVideoGravity:AVLayerVideoGravityResizeAspect];
[previewLayer.connection setVideoOrientation:AVCaptureVideoOrientationPortrait];
[backgroundStreamView.layer addSublayer:previewLayer];
[session startRunning];
NSLog(@"session running");
} else {
NSLog(@"cannot add output");
}
} else {
NSLog(@"cannot add inout");
}
} else {
NSLog(@"general error: %@", error);
}
}
会话运行得很好,但是没有显示视频源。我做错了什么?
自己设法修复了它,结果证明这是一个相当简单的问题 - 我没有指定 AVCapturePreviewLayer
的帧大小,因此它没有出现(大概是因为它默认为帧大小为零)。
为了解决这个问题,我将框架设置为与我的自定义框架相匹配 UIView
:
[previewLayer setFrame:backgroundStreamView.bounds];
弃用代码修复
AVCaptureStillImageOutput
也已弃用,因此为了解决这个问题,我将其替换为 AVCapturePhotoOutput
class。因此代码更改为:
AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
[stillImageOutput setOutputSettings:@{AVVideoCodecKey : AVVideoCodecJPEG}]
以下内容:
AVCapturePhotoOutput *stillImageOutput = [[AVCapturePhotoOutput alloc] init];
我有一个 iOS 应用程序,在视图控制器中放置了一个简单的 UIView
。我正在尝试在 UIView
中显示前置摄像头的摄像头画面。我不是要拍照或录制视频,我只是想在 UIView
.
我已经尝试实施 AVCaptureVideoPreviewLayer
,但是我得到的提要是空白的。似乎什么都没有发生。这是我的代码:
AVCaptureSession *session = [[AVCaptureSession alloc] init];
[session setSessionPreset:AVCaptureSessionPresetPhoto];
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil;
AVCaptureDeviceInput *input;
@try {
input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
} @catch (NSException *exception) {
NSLog(@"Error; %@", error);
} @finally {
if (error == nil) {
if ([session canAddInput:input]) {
[session addInput:input];
AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
[stillImageOutput setOutputSettings:@{AVVideoCodecKey : AVVideoCodecJPEG}];
if ([session canAddOutput:stillImageOutput]) {
[session setSessionPreset:AVCaptureSessionPresetHigh];
[session addOutput:stillImageOutput];
AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
[previewLayer setVideoGravity:AVLayerVideoGravityResizeAspect];
[previewLayer.connection setVideoOrientation:AVCaptureVideoOrientationPortrait];
[backgroundStreamView.layer addSublayer:previewLayer];
[session startRunning];
NSLog(@"session running");
} else {
NSLog(@"cannot add output");
}
} else {
NSLog(@"cannot add inout");
}
} else {
NSLog(@"general error: %@", error);
}
}
会话运行得很好,但是没有显示视频源。我做错了什么?
自己设法修复了它,结果证明这是一个相当简单的问题 - 我没有指定 AVCapturePreviewLayer
的帧大小,因此它没有出现(大概是因为它默认为帧大小为零)。
为了解决这个问题,我将框架设置为与我的自定义框架相匹配 UIView
:
[previewLayer setFrame:backgroundStreamView.bounds];
弃用代码修复
AVCaptureStillImageOutput
也已弃用,因此为了解决这个问题,我将其替换为 AVCapturePhotoOutput
class。因此代码更改为:
AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
[stillImageOutput setOutputSettings:@{AVVideoCodecKey : AVVideoCodecJPEG}]
以下内容:
AVCapturePhotoOutput *stillImageOutput = [[AVCapturePhotoOutput alloc] init];