我正在开发一个应用程序,需要尽可能多的fps捕获帧缓冲区.我已经弄清楚如何强制
iphone以60 fps捕获
- - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
方法被称为只有15次,这意味着iPhone降级捕获输出到15 fps.
有没有人面临这样的问题?是否有可能增加捕获帧速率?
更新我的代码:
- camera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
- if([camera isTorchModeSupported:AVCaptureTorchModeOn]) {
- [camera lockForConfiguration:nil];
- camera.torchMode=AVCaptureTorchModeOn;
- [camera unlockForConfiguration];
- }
- [self configureCameraForHighestFrameRate:camera];
- // Create a AVCaptureInput with the camera device
- NSError *error=nil;
- AVCaptureInput* cameraInput = [[AVCaptureDeviceInput alloc] initWithDevice:camera error:&error];
- if (cameraInput == nil) {
- NSLog(@"Error to create camera capture:%@",error);
- }
- // Set the output
- AVCaptureVideoDataOutput* videoOutput = [[AVCaptureVideoDataOutput alloc] init];
- // create a queue to run the capture on
- dispatch_queue_t captureQueue=dispatch_queue_create("captureQueue",NULL);
- // setup our delegate
- [videoOutput setSampleBufferDelegate:self queue:captureQueue];
- // configure the pixel format
- videoOutput.videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA],(id)kCVPixelBufferPixelFormatTypeKey,nil];
- // Add the input and output
- [captureSession addInput:cameraInput];
- [captureSession addOutput:videoOutput];
我在这里采用了configureCameraForHighestFrameRate方法https://developer.apple.com/library/mac/documentation/AVFoundation/Reference/AVCaptureDevice_Class/Reference/Reference.html
解决方法
我在iPhone 5上获得了60 fps的采样率,在iPhone 5上采用了120 fps,无论是在捕获输出中进行实时运动检测还是使用AVAssetWriter将帧保存到视频中.
您必须将AVCaptureSession设置为支持60 fps的格式:
- AVsession = [[AVCaptureSession alloc] init];
- AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
- AVCaptureDeviceInput *capInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
- if (capInput) [AVsession addInput:capInput];
- for(AVCaptureDeviceFormat *vFormat in [videoDevice formats] )
- {
- CMFormatDescriptionRef description= vFormat.formatDescription;
- float maxrate=((AVFrameRateRange*)[vFormat.videoSupportedFrameRateRanges objectAtIndex:0]).maxFrameRate;
- if(maxrate>59 && CMFormatDescriptionGetMediaSubType(description)==kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)
- {
- if ( YES == [videoDevice lockForConfiguration:NULL] )
- {
- videoDevice.activeFormat = vFormat;
- [videoDevice setActiveVideoMinFrameDuration:CMTimeMake(10,600)];
- [videoDevice setActiveVideoMaxFrameDuration:CMTimeMake(10,600)];
- [videoDevice unlockForConfiguration];
- NSLog(@"formats %@ %@ %@",vFormat.mediaType,vFormat.formatDescription,vFormat.videoSupportedFrameRateRanges);
- }
- }
- }
- prevLayer = [AVCaptureVideoPreviewLayer layerWithSession: AVsession];
- prevLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
- [self.view.layer addSublayer: prevLayer];
- AVCaptureVideoDataOutput *videoOut = [[AVCaptureVideoDataOutput alloc] init];
- dispatch_queue_t videoQueue = dispatch_queue_create("videoQueue",NULL);
- [videoOut setSampleBufferDelegate:self queue:videoQueue];
- videoOut.videoSettings = @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA)};
- videoOut.alwaysDiscardsLateVideoFrames=YES;
- if (videoOut)
- {
- [AVsession addOutput:videoOut];
- videoConnection = [videoOut connectionWithMediaType:AVMediaTypeVideo];
- }
如果您想使用AVAssetWriter写入一个文件,另外两个评论.不要使用pixelAdaptor,只需要添加样品
- [videoWriterInput appendSampleBuffer:sampleBuffer]
其次,当设置assetwriter使用
- [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo
- outputSettings:videoSettings
- sourceFormatHint:formatDescription];
sourceFormatHint在写入速度方面有所不同.