录制视频流程
1.创建捕捉会话
2.设置音视频输入
3.输出源设置
4.添加视频预览层
5.点击开始录制,开始写入数据。
1.创建捕捉会话
@property (nonatomic , strong) AVCaptureSession *session;
- (void)initSession
{
AVCaptureSession *session = [[AVCaptureSession alloc] init];
self.session = session;
}
2.设置音视频输入
@property (nonatomic , strong) AVCaptureDevice *videoDevice;
@property (nonatomic , strong) AVCaptureDeviceInput * deviceInput;
- (void)setupCaptureSession
{
self.videoDevice = [self cameraDeviceWithPosition:AVCaptureDevicePositionFront];
NSError *error = nil;
AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:self.videoDevice error:&error];
self.deviceInput = deviceInput;
}
- (AVCaptureDevice *)cameraDeviceWithPosition:(AVCaptureDevicePosition)position
{
AVCaptureDevice *deviceRet = nil;
if (position != AVCaptureDevicePositionUnspecified) {
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in devices) {
if ([device position] == position) {
deviceRet = device;
}
}
}
return deviceRet;
}
3.输出源设置
@property (nonatomic , strong) AVCaptureVideoDataOutput * dataOutput;
@property (nonatomic , strong) AVCaptureStillImageOutput *stillImageOutput;
- (void)initOutPut
{
AVCaptureVideoDataOutput *dataOutput = [[AVCaptureVideoDataOutput alloc] init];
self.dataOutput = dataOutput;
[dataOutput setAlwaysDiscardsLateVideoFrames:YES];
[dataOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey]];
_bOutputYUV = YES;
[dataOutput setSampleBufferDelegate:self queue:self.bufferQueue];
AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
[session beginConfiguration];
if ([self.session canSetSessionPreset:AVCaptureSessionPreset1280x720]) {
[self.session setSessionPreset:AVCaptureSessionPreset1280x720];
_sessionPreset = AVCaptureSessionPreset1280x720;
}
if ( [self.session canAddOutput:stillImageOutput] ) {
[self.session addOutput:stillImageOutput];
self.stillImageOutput = stillImageOutput;
self.stillImageOutput.outputSettings = @{ AVVideoCodecKey : AVVideoCodecJPEG };
if ([self.stillImageOutput respondsToSelector:@selector(setHighResolutionStillImageOutputEnabled:)]) {
self.stillImageOutput.highResolutionStillImageOutputEnabled = YES;
}
}else {
}
if ([session canAddOutput:dataOutput]) {
[session addOutput:dataOutput];
}else{
}
if ([session canAddInput:deviceInput]) {
[session addInput:deviceInput];
}else{
}
}
4.添加视频预览层
session此时已经开始采集数据,需要将采集到的画面显示在手机屏幕上,就需要添加视频预览层
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
eaglLayer.opaque = YES;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
_glContext = context;
if (!_glContext) {
return nil;
}
if ([EAGLContext currentContext] != _glContext) {
if (![EAGLContext setCurrentContext:_glContext]) {
return nil;
}
}
5.点击开始录制,开始写入数据。
创建视屏录制管理类
- (void)initWrite
{
NSError *error = nil;
[[NSFileManager defaultManager] removeItemAtURL:_URL error:NULL];
_assetWriter = [[AVAssetWriter alloc] initWithURL:_URL fileType:AVFileTypeQuickTimeMovie error:&error];
[_assetWriter startWriting];
}
buffer写入文件
-(void)writeDataTofile:(CMSampleBufferRef)sampleBuffer
{
[_assetWriter startSessionAtSourceTime:CMSampleBufferGetPresentationTimeStamp(sampleBuffer)];
AVAssetWriterInput *input = [[AVAssetWriterInput alloc] initWithMediaType:AVMediaTypeVideo outputSettings:videoSettings sourceFormatHint:videoFormatDescription];
if ([_assetWriter canAddInput: input]) {
[_assetWriter addInput: input];
}
[input appendSampleBuffer:sampleBuffer];
}
网友评论