音视频

iOS-视屏编码

2018-07-30  本文已影响0人  三月望龙

编码方式

硬编码

编码流程:采集视屏信息--> 获取到视频帧--> 对视频帧进行编码 --> 获取到视频帧信息 --> 将编码后的数据以NALU方式写入到文件

软编码

安装 FFmpeg

编译FFmpeg-iOS

如果/usr/local没有权限Operation not permitted
按如下操作:

1、关闭 Rootless

  • 重启MAC电脑
  • 开机时(听到开机启动声音),按下Command+RCommand+Option+R, 进入恢复模式
  • 在上面的菜单实用工具中找到并打开Terminal终端, 输入如下命令$ csrutil disable
  • 重启电脑.

2、给/usr/local增加读写权限

  • 进入终端输入$ sudo chown -R $(whoami) /usr/local

3、开启 Rootless

  • 为了系统安全,重新开启Rootless
  • 重复步骤1,开启Rootless: $ csrutil enable

编译X264

集成FFmpeg

- (void)startCapture:(UIView *)preview
{
    // 1.获取沙盒路径
    NSString *file = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"video.h264"];
    
    // 2.开始编码
    [self.encoder setFileSavedPath:file];
    // 特别注意: 宽度&高度
    [self.encoder setX264ResourceWithVideoWidth:480 height:640 bitrate:1500000];
    
    // 1.创建捕捉会话
    AVCaptureSession *session = [[AVCaptureSession alloc] init];
    session.sessionPreset = AVCaptureSessionPreset640x480;
    self.captureSession = session;
    
    // 2.设置输入设备
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    NSError *error = nil;
    AVCaptureDeviceInput *input = [[AVCaptureDeviceInput alloc] initWithDevice:device error:&error];
    [session addInput:input];
    
    
    // 3.添加预览图层
    AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
    previewLayer.frame = preview.bounds;
    [preview.layer insertSublayer:previewLayer atIndex:0];
    self.previewLayer = previewLayer;
    
    // 4.添加输出设备
    AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
    self.captureQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    [output setSampleBufferDelegate:self queue:self.captureQueue];
    NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
                              [NSNumber numberWithUnsignedInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange],
                              kCVPixelBufferPixelFormatTypeKey,
                              nil];
    
    output.videoSettings = settings;
    output.alwaysDiscardsLateVideoFrames = YES;
    [session addOutput:output];
    
    // 5.设置录制视频的方向
    AVCaptureConnection *connection = [output connectionWithMediaType:AVMediaTypeVideo];
    [connection setVideoOrientation:previewLayer.connection.videoOrientation];
    
    // 6.开始捕捉
    [self.captureSession startRunning];
}
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
    [self.encoder encoderToH264:sampleBuffer];
}
上一篇 下一篇

猜你喜欢

热点阅读