2012-02-29 75 views
4

我正试图调节我的应用程序的视频捕获帧率,因为我发现它影响了VoiceOver的性能。我想在AVCapture框架中调节视频捕获帧速率

目前,它从摄像机捕获帧,然后尽可能快地使用OpenGL例程处理帧。我想在捕捉过程中设置特定的帧率。

我期待能够通过使用videoMinFrameDuration或minFrameDuration来做到这一点,但这似乎对性能没有影响。有任何想法吗?

NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; 
for (AVCaptureDevice *device in devices) 
{ 
    if ([device position] == AVCaptureDevicePositionBack) 
    { 
     backFacingCamera = device; 
        // SET SOME OTHER PROPERTIES 
    } 
} 


// Create the capture session 
captureSession = [[AVCaptureSession alloc] init]; 

// Add the video input 
NSError *error = nil; 
videoInput = [[[AVCaptureDeviceInput alloc] initWithDevice:backFacingCamera error:&error] autorelease]; 

// Add the video frame output 
videoOutput = [[AVCaptureVideoDataOutput alloc] init]; 
[videoOutput setAlwaysDiscardsLateVideoFrames:YES]; 

[videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; 
[videoOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; 



// Start capturing 
if([backFacingCamera supportsAVCaptureSessionPreset:AVCaptureSessionPreset1920x1080]) 
{ 
    [captureSession setSessionPreset:AVCaptureSessionPreset1920x1080]; 
    captureDeviceWidth = 1920; 
    captureDeviceHeight = 1080; 
    #if defined(VA_DEBUG) 
    NSLog(@"Video AVCaptureSessionPreset1920x1080"); 
    #endif 
} 
else do some fall back stuff 

// If you wish to cap the frame rate to a known value, such as 15 fps, set 
// minFrameDuration. 
AVCaptureConnection *conn = [videoOutput connectionWithMediaType:AVMediaTypeVideo]; 
if (conn.supportsVideoMinFrameDuration) 
    conn.videoMinFrameDuration = CMTimeMake(1,2); 
else 
    videoOutput.minFrameDuration = CMTimeMake(1,2); 


if ([captureSession canAddInput:videoInput]) 
    [captureSession addInput:videoInput]; 


if ([captureSession canAddOutput:videoOutput]) 
    [captureSession addOutput:videoOutput]; 

if (![captureSession isRunning]) 
    [captureSession startRunning]; 

任何想法?我错过了什么吗?这是节流的最佳方式吗?

AVCaptureConnection *conn = [videoOutput connectionWithMediaType:AVMediaTypeVideo]; 
if (conn.supportsVideoMinFrameDuration) 
    conn.videoMinFrameDuration = CMTimeMake(1,2); 
else 
    videoOutput.minFrameDuration = CMTimeMake(1,2); 
+0

我在原始消息中并不清楚。 minFrameDuration方法似乎没有做任何事情,它不减少帧率。我正在用ios 5.0 SDK构建ios 4.3目标。 – 2012-03-01 08:47:37

回答

2

原来,您需要设置videoMinFrameDuration和videoMaxFrameDuration两者才能正常工作。

如:

[conn setVideoMinFrameDuration:CMTimeMake(1,1)]; 
[conn setVideoMaxFrameDuration:CMTimeMake(1,1)]; 
5

迈克·乌尔里希的答复工作,直到7 IOS这两种方法在ios7不幸弃用。您必须在AVCaptureDevice本身上设置activeVideo{Min|Max}FrameDuration。例如:

int fps        = 30; // Change this value 
AVCaptureDevice *device    = ...; // Get the active capture device 
[device lockForConfiguration:nil]; 
[device setActiveVideoMinFrameDuration:CMTimeMake(1, fps)]; 
[device setActiveVideoMaxFrameDuration:CMTimeMake(1, fps)]; 
[device unlockForConfiguration];