2012-02-29 3 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 대상에 대해 구축하고 있습니다. –

답변

2

둘 중 하나가 작동하려면 videoMinFrameDuration과 videoMaxFrameDuration을 모두 설정해야합니다.

예 :

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

마이크 울리히의 대답은 IOS 7이 두 가지 방법은 불행하게도 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]; 
관련 문제