6 votes

Je veux limiter le taux de rafraîchissement de la capture vidéo dans le cadre d'AVCapture.

J'essaie de réduire le taux de rafraîchissement de la capture vidéo pour mon application, car j'ai constaté que cela a un impact sur les performances de VoiceOver.

Pour l'instant, il capture les images de la caméra vidéo, puis les traite à l'aide de routines OpenGL aussi rapidement que possible. J'aimerais définir un taux de rafraîchissement spécifique dans le processus de capture.

Je m'attendais à pouvoir le faire en utilisant videoMinFrameDuration ou minFrameDuration, mais cela ne semble faire aucune différence au niveau des performances. Avez-vous une idée ?

    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];

Des idées ? Est-ce que je rate quelque chose ? Est-ce la meilleure façon de mettre les gaz ?

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

11voto

Mr. T Points 4405

La réponse de Mike Ullrich a fonctionné jusqu'à ios 7. Ces deux méthodes sont malheureusement dépréciées dans ios7. Vous devez définir l'option activeVideo{Min|Max}FrameDuration sur l'AVCaptureDevice lui-même. Quelque chose comme :

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];

3voto

Mike Ullrich Points 203

Il s'avère que vous devez définir à la fois videoMinFrameDuration et videoMaxFrameDuration pour que l'un ou l'autre fonctionne.

eg :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X