美文网首页
音视频操作-视频录制

音视频操作-视频录制

作者: 口子窖 | 来源:发表于2018-09-06 10:41 被阅读20次

录制视频流程

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];
}

相关文章

网友评论

      本文标题:音视频操作-视频录制

      本文链接:https://www.haomeiwen.com/subject/djlzwftx.html