捕获IOS 7.0及以上版本的视频帧示例代码

捕获IOS 7.0及以上版本的视频帧示例代码,ios,Ios,我正在尝试为这个苹果问答代码设计IOS 7代码,关于如何捕获视频帧: 到目前为止,我认为我已经用is代码正确地替换了不推荐的minFrameDuration: // If you wish to cap the frame rate to a known value, such as 2 fps, set minFrameDuration. //output.minFrameDuration = CMTimeMake(1, 2); //deprecated [device setActiveVi

我正在尝试为这个苹果问答代码设计IOS 7代码,关于如何捕获视频帧:

到目前为止,我认为我已经用is代码正确地替换了不推荐的minFrameDuration:

// If you wish to cap the frame rate to a known value, such as 2 fps, set minFrameDuration.
//output.minFrameDuration = CMTimeMake(1, 2); //deprecated
[device setActiveVideoMinFrameDuration:CMTimeMake(1, 2)];  //new in IOS7
[device setActiveVideoMaxFrameDuration:CMTimeMake(1, 2)];
但是,我无法运行代码,因为我在这一行的setSession中遇到“无接口错误”:

// Assign session to an ivar.
[self setSession:session];
[output setSampleBufferDelegate:self queue:queue];
此外,我在这一行得到一个不兼容的类型警告:

// Assign session to an ivar.
[self setSession:session];
[output setSampleBufferDelegate:self queue:queue];
我相信对于这个错误和警告有简单的答案,但经过大量的搜索,我被难住了。 有人能帮我找出为什么我直接从苹果的示例代码中得到这个错误和警告吗?谢谢你,卡门

[EDIT1]我认为我的不推荐的minFrameDuration修复程序不太合适,可能是setSession方法不是必需的。我正在尝试拼凑剪切粘贴代码,用于以指定的帧速率为IOS7应用程序从视频中捕获图像,该应用程序不需要在低于7.0的版本上运行。我暂时将捕获的图像放在我的故事板上的UIImageView中

不应该这么难

这是我到目前为止的全部代码部分,但在我从viewDidLoad调用setupCaptureSession之后,它仍然没有触发captureOutput方法,并且上面提到的不兼容类型警告仍然存在,有人能看到哪里出了问题吗(我还是个新手,所以请注意:)

//创建和配置捕获会话并启动它运行
-(无效)设置捕获会话
{
n错误*错误=nil;
//创建会话
AVCaptureSession*会话=[[AVCaptureSession alloc]init];
//配置会话以生成视频帧的分辨率
session.sessionPreset=AVCaptureSessionPresetHigh;
//找到合适的AVCaptureDevice
AVCaptureDevice*device=[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
//使用设备创建设备输入并将其添加到会话。
AVCaptureDeviceInput*输入=[AVCaptureDeviceInputDeviceInputWithDevice:device
错误:&错误];
如果(!输入){
//正确处理错误。
}
[会话附加输入:输入];
//创建VideoDataOutput并将其添加到会话中
AVCaptureVideoDataOutput*输出=[[AVCaptureVideoDataOutput alloc]init];
[会话添加输出:输出];
//配置输出。
dispatch_queue_t queue=dispatch_queue_create(“myQueue”,NULL);
[output setSampleBufferDelegate:自队列:队列];
//指定像素格式
输出视频设置=
[NSDictionary Dictionary WithObject:
[NSNumber Number Withint:kCVPixelFormatType_32BGRA]
forKey:(id)kCVPixelBufferPixelFormatTypeKey];
//如果希望将帧速率限制为已知值,例如2 fps,请设置
//minFrameDuration。
//output.minFrameDuration=CMTimeMake(1,2);//已弃用
//AVCaptureConnection*conn=[输出连接与媒体类型:AVMediaTypeVideo];
//if(conn.supportsVideoMinFrameDuration)//这些在IOS7中不推荐使用
//conn.videoMinFrameDuration=CMTimeMake(1,2);
//if(conn.supportsVideoMaxFrameDuration)
//conn.videoMaxFrameDuration=CMTimeMake(1,2);
n错误*错误2;
[设备锁定配置:&错误2];
如果(error2==nil){
if(device.activeFormat.videoSupportedFrameRateRanges){
[device setActiveVideoMinFrameDuration:CMTimeMake(1,2)];
[设备设置ActiveVideoMaxFrameDuration:CMTimeMake(1,2)];
}否则{
//处理条件
}
}否则{
//处理错误2
}
[设备卸载配置];
//启动正在运行的会话以启动数据流
[会议开始和结束];
//将会话分配给ivar。
//[self-setSession:session];//不确定为什么需要它,找不到适用于它的代码
}
-(无效)captureOutput:(AVCaptureOutput*)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection*)连接
{
NSLog(@“captureOutput:didOutputSampleBufferFromConnection”);
//从样本缓冲区数据创建UIImage
UIImage*image=[self-imageFromSampleBuffer:sampleBuffer];
dispatch\u async(dispatch\u get\u main\u queue()^{
//<在此处添加使用图像的代码>
[self.imageView setImage:image];
[self.view setNeedsDisplay];}
);
}
//从样本缓冲区数据创建UIImage
-(UIImage*)imageFromSampleBuffer:(CMSampleBufferRef)sampleBuffer
{
//获取CMSampleBuffer的核心视频图像缓冲区,以获取媒体数据
CVImageBufferRef imageBuffer=CMSampleBufferGetImageBuffer(sampleBuffer);
//锁定像素缓冲区的基址
CVPixelBufferLockBaseAddress(imageBuffer,0);
//获取像素缓冲区的每行字节数
void*baseAddress=CVPixelBufferGetBaseAddress(imageBuffer);
//获取像素缓冲区的每行字节数
size_t bytesPerRow=CVPixelBufferGetBytesPerRow(图像缓冲区);
//获取像素缓冲区的宽度和高度
size\u t width=CVPixelBufferGetWidth(imageBuffer);
大小\u t高度=CVPixelBufferGetHeight(imageBuffer);
//创建设备相关的RGB颜色空间
CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();
//使用示例缓冲区数据创建位图图形上下文
CGContextRef context=CGBitmapContextCreate(基地址、宽度、高度、8、,
bytesPerRow,colorSpace,kCGBitmapByteOrder32Little | KCGimageAlphaPremultipledFirst);
//从位图图形上下文中的像素数据创建石英图像
CGImageRef quartzImage=CGBitmapContextCreateImage(上下文);
//解锁像素缓冲区
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
//释放上下文和颜色空间
CGContextRelease(上下文);
CGCOLORSPACTERELEASE(色彩空间);
//从中创建图像对象