2015-01-21 3 views
0

내 스토리 보드에 UIView이 있습니다. 간단한 제약 조건 4 개를 설정하면 전체 화면을 채울 수 있습니다. 내 응용 프로그램은 가로 모드 전용입니다. 이 UIViewAVCaptureVideoPreviewLayer을 사용하여 카메라의 실시간 미리보기를 표시합니다.AVCaptureVideoPreviewLayer : Storyboard 및 Autolayout과 함께 사용

나는 StackOverflow 및 더 넓은 인터넷에서 발견 된 코드 예제를 사용하여 AVCaptureSessionAVCaptureVideoPreviewLayer을 시작하려고 시도했다. 그러나 아무도 성공적으로 기능하지 못했습니다. 스토리 보드에있는 UIView은 항상 화면에 표시되지 않습니다. (보기로드시 흰색 화면)

AVCaptureVideoPreviewLayer의 기능을 사용하면서 제약 조건을 사용하여 앱의 전체 인터페이스를 인터페이스 작성기로 만들고 싶습니다. 가능한 해결 방법이 있다면 누군가 나를 도와주기 위해 전체 코드 예제를 제공 할 수 있습니까?

+0

왜 아래로 투표합니까? 내가 더 잘 설명 할 수있는 건 없니? – iPwnTech

답변

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 

그런 다음 당신은 당신의 컨트롤러 기능을

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

시작, 실행 세션을 AVCameraCaptureData init을 할 수 있습니다

[self.captureData.captureSession startRunning]; 

AVCaptureVideoPreviewLayer를 view.layer에 추가하십시오 :

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

'AVCameraUtil'으로 대체 할 대상은 무엇입니까? – iPwnTech

+0

또한 'AVCameraCaptureData' 파일을 가져온 후에도'Property 'captureData'가 'ViewController'유형의 객체에서 발견되지 않습니다. – iPwnTech

+0

"captureData"가 ViewController의 @property입니다. – guafei