Changer de caméra avec avcapturesession
À l'aide de ce tutoriel ici: http://www.musicalgeometry.com/?p=1297 j'ai créé une coutume de superposition et de capture d'image avec AVCaptureSession
.
Je cherche à permettre à l'utilisateur de basculer entre l'appareil photo avant et arrière. Voici mon code dans CaptureSessionManager
à changer de caméra:
- (void)addVideoInputFrontCamera:(BOOL)front {
NSArray *devices = [AVCaptureDevice devices];
AVCaptureDevice *frontCamera;
AVCaptureDevice *backCamera;
for (AVCaptureDevice *device in devices) {
//NSLog(@"Device name: %@", [device localizedName]);
if ([device hasMediaType:AVMediaTypeVideo]) {
if ([device position] == AVCaptureDevicePositionBack) {
//NSLog(@"Device position : back");
backCamera = device;
}
else {
//NSLog(@"Device position : front");
frontCamera = device;
}
}
}
NSError *error = nil;
if (front) {
AVCaptureDeviceInput *frontFacingCameraDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:frontCamera error:&error];
if (!error) {
if ([[self captureSession] canAddInput:frontFacingCameraDeviceInput]) {
[[self captureSession] addInput:frontFacingCameraDeviceInput];
} else {
NSLog(@"Couldn't add front facing video input");
}
}
} else {
AVCaptureDeviceInput *backFacingCameraDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:backCamera error:&error];
if (!error) {
if ([[self captureSession] canAddInput:backFacingCameraDeviceInput]) {
[[self captureSession] addInput:backFacingCameraDeviceInput];
} else {
NSLog(@"Couldn't add back facing video input");
}
}
}
}
Maintenant dans mon overlays contrôleur j'initialise tout comme dans viewDidLoad
:
[self setCaptureManager:[[CaptureSessionManager alloc] init]];
[[self captureManager] addVideoInputFrontCamera:NO]; //set to YES for Front Camera, No for Back camera
[[self captureManager] addStillImageOutput];
[[self captureManager] addVideoPreviewLayer];
CGRect layerRect = [[[self view] layer] bounds];
[[[self captureManager] previewLayer] setBounds:layerRect];
[[[self captureManager] previewLayer] setPosition:CGPointMake(CGRectGetMidX(layerRect),CGRectGetMidY(layerRect))];
[[[self view] layer] addSublayer:[[self captureManager] previewLayer]];
[[_captureManager captureSession] startRunning];
Le commutateur de bouton de la caméra est connectée à une méthode appelée switchCamera
. J'ai essayé ceci:
- (void)switchCameraView:(id)sender {
[[self captureManager] addVideoInputFrontCamera:YES]; //set to YES for Front Camera, No for Back camera
}
Lors de l'appel de ceci, j'obtiens l'erreur NSLog
de la CaptureSessionManager
et je ne peux pas comprendre pourquoi. Dans viewDidLoad
, si j'ai mis le fontCamera
à YES
, il montre la face avant de la caméra, mais ne peut pas basculer en arrière, et vice-versa.
Toutes les idées sur la façon de l'obtenir pour passer correctement?
- Mon collègue a eu des problèmes en essayant de faire la même chose. Nous avons travaillé autour de la question par l'initialisation de 2 vues distinctes pour appareil photo avant et arrière. Vous pouvez appeler startRunning et stopRunning sur le AVCaptureSession et apporter le point de vue que vous souhaitez utiliser à l'avant lors de la modification de dispositifs.
- J'ai déjà ajouté une réponse s'il vous Plaît voir [LIEN][1] [1]: stackoverflow.com/questions/26423953/...
- voici solution de travail pour swift 3.0.1
Vous devez vous connecter pour publier un commentaire.
Vous devez d'abord enlever l'existant AVCameraInput de la AVCaptureSession puis ajouter un nouveau AVCameraInput à la AVCaptureSession. Les ouvrages suivants, pour moi (en vertu de l'ARC):
[_captureSession.inputs objectAtIndex:0]
_captureSession.inputs
comprendra également une entrée audio et[_captureSession.inputs objectAtIndex:0]
peut ou peut ne pas être votre entrée de caméra. (Indice 0 semble être la première que vous l'ajouter, mais je ne compte pas sur ça). J'ai eu autour de ce en ayant une propriété de la caméra qui est actuellement en cours d'utilisation, puis en supprimant les entrées et les re-ajout d'eux.Swift 4
Swift 3 Edit (Combiné avec François-Julien Alcaraz réponse):
Swift version de @NES_4Life réponse:
return discoverySession.devices.filter { $0.position == position }.first ?? nil
Sur la base des réponses que j'ai fait ma propre version avec certaines validations et un changement spécifique, le courant d'entrée de la caméra ne peut pas être le premier objet de la session de capture d'entrées, alors j'ai changé cela:
À ce (suppression de tout type de vidéo entrées):
Voici le code entier:
Swift 3
Swift 3 version de cameraWithPosition sans obsolète avertissement :
Si vous le souhaitez, vous pouvez également obtenir la nouvelle devicesTypes de l'iPhone 7+ (double caméra) par la modification de la deviceTypes tableau.
Voici une bonne lecture : https://forums.developer.apple.com/thread/63347
Ici est une version mise à jour de chengsam du code qui inclut le correctif pour 'Plusieurs audio/vidéo AVCaptureInputs ne sont pas actuellement pris en charge'.