AVCaptureSession获取摄像头视频及buffer(可用来自定义相机)

本文主要是介绍AVCaptureSession获取摄像头视频及buffer(可用来自定义相机),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

发现自己真的很懒,很久都不想写文章(主要是不知道写什么,太难的不会,太简单的又感觉没必要😔)

这篇文章的初衷是为了获取涉嫌头取到的视频buffer以和本地视频的buffer通过OpenGL混合叠加,跟上一篇是姊妹篇:AVPlayer实现播放视频和AVFoundation获取视频的buffer
还是先上效果图:

 

效果图.gif

 

1、创建session

// 1 创建session
_captureSession = [[AVCaptureSession alloc]init];
// 设置视频质量,这里根据自己需要设置;
_captureSession.sessionPreset = AVCaptureSessionPreset640x480;

2、拿到设备的摄像头

 

// 2 device_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];_device =  [self getCameraDeviceWithPosition:AVCaptureDevicePositionBack];
/**取得摄像头的方向@param position 摄像头方向@return 摄像头*/
-(AVCaptureDevice *)getCameraDeviceWithPosition:(AVCaptureDevicePosition )position{NSArray *cameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];for (AVCaptureDevice *camera in cameras) {if ([camera position]==position) {return camera;}}return nil;}

3、创建并添加input

 

// 3 inputNSError *deviceError = nil;AVCaptureDeviceInput *input = [[AVCaptureDeviceInput alloc]initWithDevice:_device error:&deviceError];// 4 add inputif ([_captureSession canAddInput:input]) {[_captureSession addInput:input];}else{NSLog(@"创建失败了,%@",deviceError);return;}

4、添加Video Out

 

    // 5 video outdispatch_queue_t queue =  dispatch_queue_create("cameraQueue", NULL);AVCaptureVideoDataOutput *videoOut = [[AVCaptureVideoDataOutput alloc]init];[videoOut setSampleBufferDelegate:self queue:queue];videoOut.alwaysDiscardsLateVideoFrames = NO;

5、设置视频格式

可以根据自己的需要设置,视频设置是一个字典形式的设置

 

    // 6 视频格式设置
//    [videoOut setVideoSettings:@{(id)kCVPixelBufferPixelFormatTypeKey:@(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange)}];[videoOut connectionWithMediaType:AVMediaTypeVideo];

6、添加输出 并显示预览

这里将_prevLayer设置成属性是为了后续调节Frame,我是在viewDidLoad中加载的摄像头,所以View的frame可能还不准确,frame我在

 

    // 7 添加输出if ([_captureSession canAddOutput:videoOut]) {[_captureSession addOutput:videoOut];}
//    self.mGLView.isFullYUVRange = YES;AVCaptureConnection *connection = [videoOut connectionWithMediaType:AVMediaTypeVideo];[connection setVideoOrientation:AVCaptureVideoOrientationPortraitUpsideDown];[_captureSession startRunning];// 8 预览的layer_prevLayer = [AVCaptureVideoPreviewLayer layerWithSession: _captureSession];//    _prevLayer.frame = self.view.bounds;_prevLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;[self.view.layer addSublayer: _prevLayer];
// 不要忘了在viewDidLayoutSubviews中给prevLayer的frame赋值
-(void)viewDidLayoutSubviews{_prevLayer.frame = self.view.bounds;
}

实现AVCaptureVideoDataOutputSampleBufferDelegate的代理方法拿到buffer做进一步处理

 

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);//     int width1 = (int)CVPixelBufferGetWidth(pixelBuffer);
//     
//     int height1 = (int)CVPixelBufferGetHeight(pixelBuffer);
//     
//     NSLog(@"video width: %d  height: %d", width1, height1);
// 拿到某一帧可以转换为图片保存起来,跟直接照相功能相似,也可以拿到某段时间内的视频帧,保存成视频
//    或者做一些其他美颜之类的处理等待;
//    NSLog(@"在这里获得video sampleBuffer,做进一步处理(编码H.264)");//     [self.mGLView displayPixelBuffer:pixelBuffer];//    [pool drain];}


 

这篇关于AVCaptureSession获取摄像头视频及buffer(可用来自定义相机)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958210

相关文章

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优