Cor*_*rey 9 video xcode objective-c avfoundation ios
我有一个来自Apple(SquareCam)的示例应用程序,我正在使用它作为参考来为相机创建自定义界面.我正在使用AVFoundation框架.如果我从Apple构建并运行该项目,该应用程序将按预期运行.但是,如果我从该项目中获取相同的代码并将其放在Xcode中的新项目中,则不会显示视频预览.
我已将代码简化为运行视频预览图层的基本组件.同样,这个代码在Apple(SquareCam)项目中运行良好,但不会显示在我的新项目中.
- (void)setupAVCapture {
NSError *error = nil;
AVCaptureSession *session = [AVCaptureSession new];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
[session setSessionPreset:AVCaptureSessionPreset640x480];
else
[session setSessionPreset:AVCaptureSessionPresetPhoto];
// Select a video device, make an input
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if ([session canAddInput:deviceInput])
[session addInput:deviceInput];
previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
[previewLayer setBackgroundColor:[[UIColor blackColor] CGColor]];
[previewLayer setVideoGravity:AVLayerVideoGravityResizeAspect];
CALayer *rootLayer = [previewView layer];
[rootLayer setMasksToBounds:YES];
[previewLayer setFrame:[rootLayer bounds]];
[rootLayer addSublayer:previewLayer];
[session startRunning];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self setupAVCapture];
}
Run Code Online (Sandbox Code Playgroud)
我已正确设置所有插座.我在构建阶段拥有所有框架库.这两个项目都在使用故事板.奇怪的是,我能够从相机捕捉图像,甚至可以从前到后切换光源.但预览不会显示.Apple项目未设置ARC.所以,我更新了项目以使用ARC.同样,在Apple项目中运行良好,但在新项目中运行不佳.
关于问题可能是什么的任何想法?是否有可能导致此问题的项目设置?
Bre*_*den 23
有同样的问题和关键是将AVCaptureVideoPreviewLayer框架设置为UIView的边界:
// Setup camera preview image
AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:_captureSession];
previewLayer.frame = _cameraPreview.bounds;
[_cameraPreview.layer addSublayer:previewLayer];
Run Code Online (Sandbox Code Playgroud)
我在我的项目中遇到了类似的问题。从您的代码摘录中,很难判断谁在调用 setupAVCapture 方法。就我而言,我必须确保在主线程上创建 AVCaptureVideoPreviewLayer。
有几个选项。您可以通过将调用包装在以下块中来在主应用程序线程上调用 setupAVCapture:
dispatch_async(dispatch_get_main_queue(), ^{
// call setupAVCapture() method in here
});
Run Code Online (Sandbox Code Playgroud)
如果这不是一个选项,您只能在代码的以下部分执行此操作:
dispatch_async(dispatch_get_main_queue(), ^{
previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
[previewLayer setBackgroundColor:[[UIColor blackColor] CGColor]];
[previewLayer setVideoGravity:AVLayerVideoGravityResizeAspect];
CALayer *rootLayer = [previewView layer];
[rootLayer setMasksToBounds:YES];
[previewLayer setFrame:[rootLayer bounds]];
[rootLayer addSublayer:previewLayer];
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9026 次 |
| 最近记录: |