Evitar la borrosidad al inicio y al final del video (incluso después de usar setPrefernetworkingVideoStabilizationMode: AVCaptureVideoStabilizationModeAuto)?

setPrefernetworkingVideoStabilizationMode:AVCaptureVideoStabilizationModeAuto video en iOS mientras usamos setPrefernetworkingVideoStabilizationMode:AVCaptureVideoStabilizationModeAuto , pero el video aún sale borroso al principio y al final (bien en el medio), lo cual es muy problemático porque tomamos el primer marco como una image fija ( para habilitar capacidades de video y fotos sin cambiar los modos de la camera).

Al colocar el dispositivo sobre un escritorio, se elimina toda la borrosidad, por lo que todo el video se muestra en pantalla. Esto sugiere que tiene algo que ver con la estabilización de video, pero ¿hay otra propiedad para configurar?

¿Importa bloquear el modo de enfoque?

¿Algún otro consejo de solución de problemas?

Aquí está la function de captura de video de PBJVision , que utilizamos:

 - (void)startVideoCapture { if (![self _canSessionCaptureWithOutput:_currentOutput] || _cameraMode != PBJCameraModeVideo) { [self _failVideoCaptureWithErrorCode:PBJVisionErrorSessionFailed]; DLog(@"session is not setup properly for capture"); return; } DLog(@"starting video capture"); [self _enqueueBlockOnCaptureVideoQueue:^{ if (_flags.recording || _flags.paused) return; NSString *guid = [[NSUUID new] UUIDString]; NSString *outputFile = [NSString stringWithFormat:@"video_%@.mp4", guid]; if ([_delegate respondsToSelector:@selector(vision:willStartVideoCaptureToFile:)]) { outputFile = [_delegate vision:self willStartVideoCaptureToFile:outputFile]; if (!outputFile) { [self _failVideoCaptureWithErrorCode:PBJVisionErrorBadOutputFile]; return; } } NSString *outputDirectory = (_captureDirectory == nil ? NSTemporaryDirectory() : _captureDirectory); NSString *outputPath = [outputDirectory stringByAppendingPathComponent:outputFile]; NSURL *outputURL = [NSURL fileURLWithPath:outputPath]; if ([[NSFileManager defaultManager] fileExistsAtPath:outputPath]) { NSError *error = nil; if (![[NSFileManager defaultManager] removeItemAtPath:outputPath error:&error]) { [self _failVideoCaptureWithErrorCode:PBJVisionErrorOutputFileExists]; DLog(@"could not setup an output file (file exists)"); return; } } if (!outputPath || [outputPath length] == 0) { [self _failVideoCaptureWithErrorCode:PBJVisionErrorBadOutputFile]; DLog(@"could not setup an output file"); return; } if (_mediaWriter) { _mediaWriter.delegate = nil; _mediaWriter = nil; } _mediaWriter = [[PBJMediaWriter alloc] initWithOutputURL:outputURL]; _mediaWriter.delegate = self; AVCaptureConnection *videoConnection = [_captureOutputVideo connectionWithMediaType:AVMediaTypeVideo]; [self _setOrientationForConnection:videoConnection]; _startTimestamp = CMClockGetTime(CMClockGetHostTimeClock()); _timeOffset = kCMTimeInvalid; _flags.recording = YES; _flags.paused = NO; _flags.interrupted = NO; _flags.videoWritten = NO; _captureThumbnailTimes = [NSMutableSet set]; _captureThumbnailFrames = [NSMutableSet set]; if (_flags.thumbnailEnabled && _flags.defaultVideoThumbnails) { [self captureVideoThumbnailAtFrame:0]; } [self _enqueueBlockOnMainQueue:^{ if ([_delegate respondsToSelector:@selector(visionDidStartVideoCapture:)]) [_delegate visionDidStartVideoCapture:self]; }]; }]; } 

Este código configura PBJVision e inicia la captura de video:

 private func initPBJVision() { // Configure PBJVision pbj.delegate = self pbj.cameraMode = .Video pbj.cameraOrientation = .Portrait pbj.focusMode = .AutoFocus pbj.outputFormat = .Preset pbj.cameraDevice = .Back pbj.thumbnailEnabled = false // Log status print("Configunetworking PBJVision") pbj.startVideoCapture() } 

Una vez que PBJ esté listo con su vista previa, enfocaremos la camera en el punto medio de la pantalla.

 // Called when PBJVision preview begins func visionSessionDidStartPreview(vision: PBJVision) { // Focus screen at midpoint let focus_x = CGFloat(0.5) let focus_y = CGFloat(0.5) } 

El video es borroso por su naturaleza. El video de 24 o 30 fotogtwigs por segundo siempre tendrá un poco de desenfoque en el disparo porque esa es la forma en que nuestros ojos son engañados para creer que las imágenes realmente se están moviendo. La velocidad de obturación más larga le permite a la camera dar la printing de movimiento.

Las fotos utilizan una velocidad de obturación mucho más corta (1/60 de segundo o less) para proporcionar una image clara y fija.

Aquí hay alguna información sobre cómo tomar una foto mientras graba un video:

Cómo tomar fotografías mediante progtwigción mientras graba videos

No sé sobre el marco PBJVision, pero puede verificar el ajusteFocus de AVCaptureDevice antes de extraer la image que necesita.


Al parecer, puede verificar el estado de enfoque del dispositivo mediante el método PBJVision isAdjustingFocus .