2015-01-21 26 views
0

我的故事板上有一個UIView,有四個簡單約束設置填充整個屏幕 - 我的應用程序僅用於橫向使用。這UIView是顯示相機的實時預覽,利用AVCaptureVideoPreviewLayerAVCaptureVideoPreviewLayer:與故事板和Autolayout一起使用

我試過使用StackOverflow和更廣泛的互聯網上找到的一些代碼示例,啓動AVCaptureSessionAVCaptureVideoPreviewLayer;但是,沒有一個能夠成功運行。在故事板的UIView最終總是無法顯示在屏幕上(當白色屏幕視圖負載)

我想創建我的應用程序的整個界面使用約束界面生成器,但收穫的AVCaptureVideoPreviewLayer功能。有人可以提供完整的代碼示例來幫助我,如果他們有可能的解決方案嗎?

+0

爲什麼要投票?任何我能解釋得更好的? – iPwnTech 2015-01-21 10:49:17

回答

0

這是我的代碼,它適用於我。頭文件AVCameraCaptureData.h:

@interface AVCameraCaptureData : NSObject 

@property (nonatomic, strong) AVCaptureSession *captureSession; 
@property (nonatomic, strong) AVCaptureConnection *captureConnection; 
@property (nonatomic, strong) AVCaptureDeviceInput *deviceInput; 
@property (nonatomic, strong) AVCaptureStillImageOutput *captureOutput; 
@property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer; 

@end 

#if defined(__cplusplus) 
extern "C" 
{ 
#endif /* defined(__cplusplus) */ 

AVCaptureDevice* getCaptureDeviceByPosition(AVCaptureDevicePosition position); 
AVCaptureStillImageOutput* getCaptureOutput(); 
AVCaptureConnection* ConnectionWithMediaType (NSString* mediaType, NSArray* fromConnections); 
AVCaptureVideoPreviewLayer* getCapturePreviewLayer(AVCaptureSession* captureSession); 
AVCameraCaptureData* CreateCaptureData (AVCaptureDevicePosition position, CGRect presentLayerFrame, NSString* sessionPreset); 
#if defined(__cplusplus) 
} 
#endif /* defined(__cplusplus) */ 

AVCameraCaptureData.m文件:

#import "AVCameraCaptureData.h" 
#import "AVCameraUtil.h" 

@implementation AVCameraCaptureData 

AVCaptureDevice* getCaptureDeviceByPosition(AVCaptureDevicePosition position) 
{ 
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; 
for (AVCaptureDevice *device in devices) 
{ 
    if ([device position] == position) 
     return device; 
} 

return nil; 
} 

AVCaptureStillImageOutput* getCaptureOutput() 
{ 
AVCaptureStillImageOutput* captureOutput = [[AVCaptureStillImageOutput alloc] init]; 

NSDictionary* outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG, AVVideoCodecKey, nil]; 
[captureOutput setOutputSettings:outputSettings]; 

return captureOutput; 
} 

AVCaptureConnection* ConnectionWithMediaType (NSString* mediaType, NSArray* fromConnections) 
{ 
for (AVCaptureConnection* connection in fromConnections) 
{ 
    for (AVCaptureInputPort* port in [connection inputPorts]) 
    { 
     if ([[port mediaType] isEqual:mediaType]) 
      return connection; 
    } 
} 
return nil; 
} 

AVCaptureVideoPreviewLayer* getCapturePreviewLayer(AVCaptureSession* captureSession) 
{ 
AVCaptureVideoPreviewLayer* previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:captureSession]; 
//please set frame for yourself 
[previewLayer setFrame:[AVCameraUtil screenBoundsFixedToPortraitOrientation]]; 
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 

return previewLayer; 
} 

AVCameraCaptureData* CreateCaptureData (AVCaptureDevicePosition position, CGRect presentLayerFrame, NSString* sessionPreset) 
{ 
AVCaptureSession* captureSession = [[AVCaptureSession alloc] init]; 

if (sessionPreset == nil) 
    [captureSession setSessionPreset:AVCaptureSessionPresetPhoto]; 
else 
    [captureSession setSessionPreset:sessionPreset]; 

AVCaptureDevice *device = getCaptureDeviceByPosition (position); 
AVCaptureDeviceInput *videoDeviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:device error:nil]; 

if ([captureSession canAddInput:videoDeviceInput]) 
    [captureSession addInput:videoDeviceInput]; 

AVCaptureStillImageOutput* captureOutput = getCaptureOutput(); 

if ([captureSession canAddOutput:captureOutput]) 
    [captureSession addOutput:captureOutput]; 

AVCameraCaptureData *data = [[AVCameraCaptureData alloc] init]; 
data.captureSession = captureSession; 
data.deviceInput = videoDeviceInput; 
data.captureOutput = captureOutput; 
data.captureConnection = ConnectionWithMediaType(AVMediaTypeVideo, [captureOutput connections]); 
data.previewLayer = getCapturePreviewLayer(captureSession); 

return data; 
} 

@end 

然後,你可以使用函數在控制器中初始化AVCameraCaptureData

CreateCaptureData(AVCaptureDevicePositionBack, self.view.frame,nil); 

開始運行會話:

[self.captureData.captureSession startRunning]; 

將AVCaptureVideoPreviewLayer添加到view.layer中:

[self.view.layer addSublayer:self.captureData.previewLayer]; 
+0

我應該用什麼來替換AVCameraUtil? – iPwnTech 2015-01-22 09:32:09

+0

此外,即使在導入了「AVCameraCaptureData」文件後,出現了在'ViewController'類型的對象上未找到的錯誤'Property'captureData' – iPwnTech 2015-01-22 09:39:51

+0

「captureData」是您的ViewController的@property。 – guafei 2015-01-23 02:45:24