iOS 8 AVFoundation - 如何在功能强大的设备上启用视频稳定功能

时间:2014-09-25 16:52:09

标签: ios objective-c swift avfoundation

很高兴听到我正在做的视频应用的一些新iPhone的视频稳定性,但是你如何在一个功能强大的设备上实际启用它? 查看API文档,只有一种方法可以检查它是否受支持,在iOS 8中不推荐开启/关闭它的方法。它是自动的还是什么?

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

2 个答案:

答案 0 :(得分:12)

您需要设置视频AVCaptureConnection的preferredVideoStabilizationMode属性,其默认值为AVCaptureVideoStabilizationModeOff,因此不会自动设置。

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

要获取连接的当前AVCaptureVideoStabilizationMode,请读取其activeVideoStabilizationMode属性。

来自Apple的文档:

  

@property preferredVideoStabilizationMode

     

此属性仅适用于涉及视频的AVCaptureConnection实例。       在支持视频稳定功能的设备上,仅限可用源的子集       格式可用于稳定。通过设置preferredVideoStabilizationMode       属性为AVCaptureVideoStabilizationModeOff以外的值,流经接收器的视频稳定       当模式可用时。启用视频稳定功能会为视频捕获管道带来额外的延迟       可能会消耗更多的系统内存,具体取决于稳定模式和格式。如果没有首选的稳定模式,       activeVideoStabilizationMode将设置为AVCaptureVideoStabilizationModeOff。客户可以通过键值观察       activeVideoStabilizationMode属性,用于了解正在使用的稳定模式或何时关闭。默认值       是AVCaptureVideoStabilizationModeOff。将此属性设置为AVCaptureVideoStabilizationModeAuto时,为宜       将根据格式和帧速率选择稳定模式。对于iOS 6.0之前链接的应用,默认值       是AVCaptureVideoStabilizationModeStandard,用于连接到AVCaptureMovieFileOutput实例的视频连接。       对于在iOS 6.0上或之后链接的应用,默认值始终为AVCaptureVideoStabilizationModeOff。设置视频稳定       使用此属性的模式可能会更改enableVideoStabilizationWhenAvailable的值。

答案 1 :(得分:1)

虽然这个问题询问iOS8的视频稳定性;我只想添加一些代码,以防人们试图支持早于iOS8的版本以及相机代码。

    AVCaptureConnection *videoConnection = [self.captureVideoDataOutput connectionWithMediaType:AVMediaTypeVideo];

    if ([videoConnection isVideoStabilizationSupported]) {
        if ([videoConnection respondsToSelector:@selector(setPreferredVideoStabilizationMode:)]) { // for iOS8+
            [videoConnection setPreferredVideoStabilizationMode:AVCaptureVideoStabilizationModeAuto];
        } else { // otherwise default to pre iOS8 way of doing it
            [videoConnection setEnablesVideoStabilizationWhenAvailable:YES];
        }
    }

请注意,编译器将在iOS8之前的方法调用中引入弃用警告。如果您也是关于警告的OCD,您可以通过使用#pragma围绕调用折旧方法来抑制警告:

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

如果有兴趣的话,可以从Apple获得更多信息:

  

iOS 6在iPhone 4s上引入了对视频稳定的API支持。 iPhone 6和6 Plus上的后置摄像头支持更具侵略性,戏剧性和流畅性的算法,称为“电影视频稳定”。与标准视频稳定相比,这种稳定方法降低了相机的视野,与标准视频稳定相比,在视频捕捉流水线中引入了更多的延迟,并且消耗了更多的系统内存。由于这些原因,它默认情况下不启用,必须选择使用。

     

使用影院视频稳定功能时,建议您使用较窄或相同的最小和最大帧持续时间,以使延迟保持一致且易于管理。 iPhone 6和6 Plus还支持早期产品中使用的标准(低延迟,低戏剧性)视频稳定算法。以前,AVCaptureConnection允许您通过调用AVCaptureConnection setEnablesVideoStabililzationWhenAvailable:方法来选择视频稳定。 AV Foundation现在支持多种类型的视频稳定,因此该方法已被弃用(与AVCaptureConnection一起使用videoStabilizationEnabled :)以支持新方法,AVCaptureConnection setPreferredVideoStabilizationMode:。

     

您可以将首选视频稳定模式设置为4个常量之一:AVCaptureVideoStabilizationModeOff,AVCaptureVideoStabilizationModeStandard,AVCaptureVideoStabilizationModeCinematic或AVCaptureVideoStabilizationModeAuto。您可以通过调用AVCaptureDeviceFormat isVideoStabilizationModeSupported:来查询AVCaptureDevice activeFormat属性以确定它支持的稳定模式。将首选稳定模式设置为AVCaptureVideoStabilizationModeOff以外的常量不会强制启用视频稳定功能。某些设备格式和AVCaptureOutput不支持稳定。要确定实际使用哪种视频稳定模式,您可以键值观察AVCaptureConnection activeVideoStabilizationMode属性。将首选稳定模式设置为AVCaptureVideoStabilizationModeAuto时,将根据使用的格式和帧速率选择适当的稳定模式。目前,只有1080p30和1080p60视频格式支持电影稳定。 preferredVideoStabilizationMode的默认值是AVCaptureVideoStabilizationModeOff。与早期产品一样,只有16:9视频格式支持稳定。