Définir la fréquence d'images maximale avec AVFoundation dans iOS 5

Je crois que cela était fait avec captureOutput.minFrameDuration . Cependant, ceci est obsolète dans iOS 5.

Au lieu de cela, je dois apparemment utiliser AVCaptureConnection de video.minFrameDuration . Donc, j'ai mes inputs, ma sortie, je les ajoute à la fois la session de capture – où puis-je avoir access à la connection de capture? Je pense qu'il est créé pour moi par la session, mais où?

Je pourrais essayer d'append l'E / S en utilisant addInputWithNoConnections et addOutputWithNoConnections , puis en créant peut-être la connection manuellement. Mais cela ressemble à un peu de tracas juste pour définir un taux de trame maximum. De plus, Xcode se plaint que ces methods n'existent pas.

Chris, je pense avoir résolu ce problème:

(Edit – Voir le commentaire de Tomas Camin ci-dessous sur la façon correcte de vérifier si videoMinFrameDuration videoMaxFrameDuration est supporté, bien que le code ci-dessous a bien fonctionné lors de la publication)

La ligne ci-dessous donne access à l'object AVCaptureConnection associé à l'object AVCaptureVideoDataOutput :

 AVCaptureConnection *conn = [output connectionWithMediaType:AVMediaTypeVideo]; CMTimeShow(conn.videoMinFrameDuration); CMTimeShow(conn.videoMaxFrameDuration); if (conn.isVideoMinFrameDurationSupported) conn.videoMinFrameDuration = CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND); if (conn.isVideoMaxFrameDurationSupported) conn.videoMaxFrameDuration = CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND); CMTimeShow(conn.videoMinFrameDuration); CMTimeShow(conn.videoMaxFrameDuration); 

Si vous utilisez (comme je suis) le délégué didOutputSampleBuffer , vous pouvez confirmer que la fréquence d'images video dans la valeur fromConnection AVCaptureConnection * transmise au délégué a été correctement définie et «mémorisée» par le code ci-dessus.

Notez que vous devez définir à la fois videoMinFrameDuration et videoMaxFrameDuration à la même valeur pour réussir à videoMaxFrameDuration la fréquence d'images. Le paramètre min seul ne semble pas fonctionner lors d'un test sur un iPhone 4s. Cela ne semble pas être documenté.

Josh

AVCaptureConnection videoMinFrameDuration est obsolète. Utilisez AVCaptureDevice activeVideoMinFrameDuration / activeVideoMaxFrameDuration . Le premier extrait de code dans la reference de class AVCaptureDevice répond à la question.

Supposons les membres suivants.

 AVCaptureConnection *videoConnection; AVCaptureVideoDataOutput *videoOutput; AVCaptureDeviceInput *videoInput; 

Ensuite, vous feriez quelque chose comme ce qui suit. Je n'ai pas testé ça. C'est juste une supposition de la lecture des docs.

 AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if ( videoDevice ) { NSError *error; videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; [captureSession addInput:videoInput]; } videoOutput = [[AVCaptureVideoDataOutput alloc] init]; //setup video options if ([captureSession canAddOutput:videoOutput]) [captureSession addOutput:videoOutput]; videoConnection = [[AVCaptureConnection alloc] initWithInputPorts:captureSession.inputs output:videoOutput]; videoConnection.videoMinFrameDuration = CMTimeMake(1, frameRate); [captureSession addConnection:videoConnection]; 

Je n'ai pas encore converti mon propre code. Je répondrai avec le code de travail quand je fais la conversion. Si vous avez ajouté plusieurs inputs à la captureSession, vous devrez peut-être charger explicitement celle que vous voulez dans un tableau. par exemple

 ports = [NSArray arrayWithObject:videoInput]; 

Puis passez ceci dans l'initialiseur pour AVCaptureConnection.

Comme mentionné par Kiran, AVCaptureConnection videoMinFrameDuration est obsolète depuis iOS 7.

Juste pour être plus précis, 'mise à jour' de l'exemple d'Apple :

 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDeviceInput *input = ... // Following the example // ** Create and Configure the Video Data Output ** AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init]; [session addOutput:output]; output.videoSettings = @{ (NSSsortingng *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA) }; device.activeVideoMinFrameDuration = CMTimeMake(1, 15);