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

Posted

技术标签:

【中文标题】iOS 8 AVFoundation - 如何在有能力的设备上启用视频稳定功能【英文标题】:iOS 8 AVFoundation - how to enable video stabilization on capable devices 【发布时间】:2014-09-25 16:52:08 【问题描述】:

很高兴听到我正在做的视频应用程序在一些新 iPhone 上的视频稳定功能,但是您如何在功能强大的设备上为录制会话启用它? 查看API文档,只有一种方法可以检查它是否受支持,在ios 8中不推荐使用打开/关闭它的方法。它是自动的还是什么?

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

【问题讨论】:

【参考方案1】:

您需要设置视频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 之前链接的应用,默认值 是附加到 AVCaptureMovieFileOutput 实例的视频连接的 AVCaptureVideoStabilizationModeStandard。 对于在 iOS 6.0 或之后链接的应用程序,默认值始终为 AVCaptureVideoStabilizationModeOff。设置视频稳定 使用此属性的模式可能会更改 enableVideoStabilizationWhenAvailable 的值。

【讨论】:

【参考方案2】:

虽然这个问题询问的是 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 之前的方法调用中引入弃用警告。如果您对警告也有强迫症,您可以通过使用 #pragma 包围对 depreciated 方法的调用来抑制它,如下所示:

#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 视频格式支持稳定。

【讨论】:

以上是关于iOS 8 AVFoundation - 如何在有能力的设备上启用视频稳定功能的主要内容,如果未能解决你的问题,请参考以下文章

使用 AVFoundation 裁剪 AVAsset 视频不工作 iOS 8

iOS 8 和 XCode 6 上的 AVFoundation 语音合成

iOS 8.4 AVFoundation _attachToPlayer 或 _attachToFigPlayer 崩溃 |一个 AVPlayerItem 不能与多个 AVPlayer 实例关联

Xcode iOS:如何使用 AVFoundation 重置声音

如何使用 captureStillImageAsynchronouslyFromConnection 实现多镜头(iOS AVFoundation)

iOS AVFoundation 如何使用 CMTime 转换每秒相机帧数以创建延时摄影?