相信在iOS應用里面很常用的功能之一就是視頻錄制了,但是往往系統的錄制界面不是我們想要的,所以這時候就得自定義視頻錄制界面了.當然對很多人來講的,AVFoundation這個庫不是很熟.下面就一步步來實現一個自定義界面把!
創建UI以及相機采集工作
NSError *error = nil;
self.session = [[AVCaptureSession alloc] init];
//可以根據自己的需求來決定預覽層的畫質
_session.sessionPreset = AVCaptureSessionPresetLow;
AVCaptureDevice *frontCamera = nil;
AVCaptureDevice *backCamera = nil;
NSArray *cameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *camera in cameras) {
if (camera.position == AVCaptureDevicePositionFront) {
frontCamera = camera;
} else {
backCamera = camera;
}
}
if (!backCamera) {
self.isCameraSupported = NO;
return;
} else {
self.isCameraSupported = YES;
if ([backCamera hasTorch]) {
self.isTorchSupported = YES;
} else {
self.isTorchSupported = NO;
}
}
if (!frontCamera) {
self.isFrontCameraSupported = NO;
} else {
self.isFrontCameraSupported = YES;
}
[backCamera lockForConfiguration:nil];
if ([backCamera isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure]) {
[backCamera setExposureMode:AVCaptureExposureModeContinuousAutoExposure];
}
[backCamera unlockForConfiguration];
// 用device對象創建一個設備對象input,并將其添加到session
self.videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:backCamera error:&error];
if (!_videoDeviceInput) {
return;
}
[_session addInput:_videoDeviceInput];
AVCaptureDeviceInput *audioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio] error:nil];
if (!audioDeviceInput) {
}
_output = [[AVCaptureVideoDataOutput alloc] init];
[_session addOutput:_output];
dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);
[_output setSampleBufferDelegate:self queue:queue];
//這里作者我需要的是480*480的視頻 所有先取640x480,后期通過裁剪來獲取到480*480的 畫質越高處理的速度相對較慢,所以根據自己的需求來定義
_session.sessionPreset = AVCaptureSessionPreset640x480;
dispatch_async(dispatch_get_main_queue(), ^{
self.preViewLayer = [AVCaptureVideoPreviewLayer layerWithSession:_session];
_preViewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[_session commitConfiguration];
// 啟動session
[_session startRunning];
self.preViewLayer.frame = CGRectMake(0, 0, MYSCREENWIDTH, MYSCREENWIDTH*4/4);
//preview是一個UIView,用來加載相機的預覽層
[preview.layer addSublayer:self.preViewLayer];
});
獲取視頻流
#pragma mark 獲取視頻流
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
//在這里你可以獲取到視頻采集到的視頻幀音頻幀,具體要做什么操作 旋轉啊 裁剪啊 之類的 就可以根據項目需求來決定
}