iOS 8 AVFoundation: cómo habilitar la estabilización de video en dispositivos con capacidad

Estaba emocionado de saber sobre la estabilización de video en algunos de los nuevos iPhones para una aplicación de video que estoy haciendo, pero ¿cómo lo habilita para una session de grabación en un dispositivo capaz? En cuanto a la documentation de la API, solo hay una forma de comprobar si es compatible, las forms de encenderlo o apagarlo están en desuso en iOS 8. ¿Es automático o algo así?

https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVCaptureConnection_Class/index.html#//apple_ref/doc/uid/TP40009522-CH1-SW38

Debe configurar la propiedad de video AVCaptureConnection's prefernetworkingVideoStabilizationMode, su valor pnetworkingeterminado es AVCaptureVideoStabilizationModeOff, por lo que no se configurará automáticamente.

self.videoConnection = [self.videoOut connectionWithMediaType:AVMediaTypeVideo]; if (self.videoConnection.supportsVideoStabilization) { self.videoConnection.prefernetworkingVideoStabilizationMode = AVCaptureVideoStabilizationModeAuto; } 

Para que el AVCaptureVideoStabilizationMode actual de la connection lea su propiedad activeVideoStabilizationMode.

De la documentation de Apple:

@property prefernetworkingVideoStabilizationMode

Esta propiedad solo es aplicable a las instancias de AVCaptureConnection que implican video. En dispositivos en los que se admite la function de estabilización de video, solo un subset de formattings fuente disponibles puede estar disponible para la estabilización. Al establecer la propiedad prefernetworkingVideoStabilizationMode en un valor que no sea AVCaptureVideoStabilizationModeOff, el video que fluye a través del receptor se estabiliza cuando el modo está disponible. Habilitar la estabilización de video introduce latencia adicional en la tubería de captura de video y puede consumir más memory del sistema dependiendo del modo de estabilización y el formatting. Si el modo de estabilización preferido no está disponible, activeVideoStabilizationMode se establecerá en AVCaptureVideoStabilizationModeOff. Los clientes pueden valor key observar la propiedad activeVideoStabilizationMode para saber qué modo de estabilización está en uso o cuándo está desactivado. El valor pnetworkingeterminado es AVCaptureVideoStabilizationModeOff. Al establecer esta propiedad en AVCaptureVideoStabilizationModeAuto, se elegirá un modo de estabilización adecuado según el formatting y la velocidad de cuadro. Para las aplicaciones vinculadas antes de iOS 6.0, el valor pnetworkingeterminado es AVCaptureVideoStabilizationModeStandard para una connection de video conectada a una instancia AVCaptureMovieFileOutput. Para las aplicaciones vinculadas en iOS 6.0 o posterior, el valor pnetworkingeterminado es siempre AVCaptureVideoStabilizationModeOff. Configurar un modo de estabilización de video usando esta propiedad puede cambiar el valor de enableVideoStabilizationWhenAvailable.

Si bien esta pregunta se refiere a la estabilización de video para iOS8; Solo quería agregar un código en caso de que las personas estén tratando de admitir versiones anteriores a iOS8 en su código de camera.

  AVCaptureConnection *videoConnection = [self.captureVideoDataOutput connectionWithMediaType:AVMediaTypeVideo]; if ([videoConnection isVideoStabilizationSupported]) { if ([videoConnection respondsToSelector:@selector(setPrefernetworkingVideoStabilizationMode:)]) { // for iOS8+ [videoConnection setPrefernetworkingVideoStabilizationMode:AVCaptureVideoStabilizationModeAuto]; } else { // otherwise default to pre iOS8 way of doing it [videoConnection setEnablesVideoStabilizationWhenAvailable:YES]; } } 

Tenga en count que el comstackdor introducirá una advertencia de desaprobación en la llamada al método pre iOS8. Si también tiene OCD sobre las advertencias, puede suprimirla envolviendo la llamada al método depreciado con #pragma como sigue:

 #pragma clang diagnostic push #pragma clang diagnostic ignonetworking "-Wdeprecated-declarations" [videoConnection setEnablesVideoStabilizationWhenAvailable:YES]; #pragma clang diagnostic pop 

Si las personas están interesadas, un poco más de información de Apple :

iOS 6 presentó compatibilidad API para la estabilización de video en el iPhone 4s. La camera trasera del iPhone 6 y 6 Plus es compatible con un algorithm más agresivo, dramático y fluido llamado "estabilización de video cinemático". Este método de estabilización networkinguce el campo de visión de la camera en comparación con la estabilización de video estándar, introduce mucho más latencia en la tubería de captura de video en comparación con la estabilización de video estándar y consume una cantidad significativamente mayor de memory del sistema. Por estos motivos, no está activado de forma pnetworkingeterminada y debe estar habilitado para usarlo.

Cuando se usa la estabilización cinematográfica de video, se recomienda que use duraciones mínimas o mínimas de fotogtwigs estrechas o idénticas para mantener la latencia consistente y manejable. iPhone 6 y 6 Plus también son compatibles con el algorithm de estabilización de video estándar (menor latencia, less dramático) usado en productos anteriores. Anteriormente, AVCaptureConnection le permitía optar por la estabilización de video llamando al método AVCaptureConnection setEnablesVideoStabililzationWhenAvailable: método. AV Foundation ahora admite más de un tipo de estabilización de video, por lo que el método se ha desaprobado (junto con AVCaptureConnection videoStabilizationEnabled 🙂 a favor de un nuevo método, AVCaptureConnection setPrefernetworkingVideoStabilizationMode :.

Puede configurar su modo de estabilización de video preferido en una de las 4 constantes: AVCaptureVideoStabilizationModeOff, AVCaptureVideoStabilizationModeStandard, AVCaptureVideoStabilizationModeCinematic o AVCaptureVideoStabilizationModeAuto. Puede consultar la propiedad AVCaptureDevice activeFormat para determinar qué modos de estabilización soporta llamando a AVCaptureDeviceFormat isVideoStabilizationModeSupported :. Configurar el modo de estabilización preferido en una constante que no sea AVCaptureVideoStabilizationModeOff no fuerza la estabilización de video. Algunos formattings de dispositivo y AVCaptureOutput's no son compatibles con la estabilización. Para determinar qué modo de estabilización de video está realmente en uso, puede valor key observar la propiedad AVCaptureConnection activeVideoStabilizationMode. Cuando establezca su modo de estabilización preferido en AVCaptureVideoStabilizationModeAuto, se elegirá un modo de estabilización apropiado en function del formatting y la velocidad de fotogtwigs en uso. Actualmente, solo los formattings de video 1080p30 y 1080p60 admiten estabilización cinematográfica. El valor pnetworkingeterminado para prefernetworkingVideoStabilizationMode es AVCaptureVideoStabilizationModeOff. Al igual que en los productos anteriores, solo los formattings de video 16: 9 admiten la estabilización.