OC之捕获连接 AVCaptureConnection
AVCaptureConnection 捕获会话中特定捕获输入对和捕获输出对象之间的连接。
捕获输入 AVCaptureInput
具有一个或多个输入端口 AVCaptureInputPort
。 捕获输出 AVCaptureOutput
可以接受来自一个或多个源的数据,例如,AVCaptureMovieFileOutput
对象接受视频和音频数据。
只有会话AVCaptureSession
的方法 -canAddConnection:
方法返回YES时,才可以使用 -addConnection:
方法将 AVCaptureConnection
实例添加到会话。
调用 AVCaptureSession
实例的方法-addInput:
或 -addOutput:
方法时,会在所有兼容的输入和输出之间自动形成连接。添加没有连接的输入或输出时,只需手动添加连接。还可以使用连接来启用或禁用来自给定输入或给定输出的数据流。
1、创建连接
我们可以根据指定的一组输入端口和一个输出对象,创建一个连接:
+ (instancetype)connectionWithInputPorts:(NSArray<AVCaptureInputPort *> *)ports
output:(AVCaptureOutput *)output;
- (instancetype)initWithInputPorts:(NSArray<AVCaptureInputPort *> *)ports
output:(AVCaptureOutput *)output;
该方法有两个参数:
- 参数
ports
:与AVCaptureInput
对象关联的一组输入端口。 - 参数
output
:输出对象AVCaptureOutput
。 - 返回值:根据指定的一组输入端口和一个输出对象创建的一个连接
我们也可以根据一个指定输入端口和指定视频预览图层,创建一个捕获连接:
+ (instancetype)connectionWithInputPort:(AVCaptureInputPort *)port
videoPreviewLayer:(AVCaptureVideoPreviewLayer *)layer;
- (instancetype)initWithInputPort:(AVCaptureInputPort *)port
videoPreviewLayer:(AVCaptureVideoPreviewLayer *)layer;
该方法有两个参数:
- 参数
port
:与AVCaptureInput
对象关联的输入端口AVCaptureInputPort
。 - 参数
layer
: 一个AVCaptureVideoPreviewLayer对象。 - 返回值:根据一个指定输入端口和指定视频预览图层创建的一个捕获连接。
可以使用 -addConnection:
方法将此方法返回的连接添加到AVCaptureSession实例。
调用 AVCaptureSession
实例的方法-addInput:
或 -addOutput:
方法时,会在所有兼容的输入和输出之间自动形成连接。除非使用 -addInputWithNoConnections:
和 -addOutputWithNoConnections:
方法,否则无需手动创建会话并向会话添加连接。
2、配置
属性 | 类型 | 描述 |
---|---|---|
enabled |
BOOL |
指示是否已启用连接 |
active |
BOOL |
指示连接是否处于活动状态 |
inputPorts |
NSArray |
连接的输入端口集合 |
output |
AVCaptureOutput |
连接的输出端口 |
videoPreviewLayer |
AVCaptureVideoPreviewLayer |
与连接关联的视频预览图层 |
audioChannels |
NSArray |
一组AVCaptureAudioChannel 对象;此属性仅适用于涉及音频的连接。 |
3、管理视频配置
属性(仅适用于涉及视频的连接) | 类型 | 描述 |
---|---|---|
videoOrientation |
AVCaptureVideoOrientation |
视频的方向;设置videoOrientation 不一定会导致视频缓冲区的物理旋转;例如,与AVCaptureMovieFileOutput 对象的视频连接使用Quicktime 轨道矩阵处理方向; 使用AVCaptureStillImageOutput 对象,使用Exif 标记处理方向。 |
supportsVideoOrientation |
BOOL |
指示连接是否支持更改视频的方向; 如果supportsVideoOrientation 的值为YES,则可以设置videoOrientation 以旋转连接输出所使用的视频缓冲区。 |
videoFieldMode |
AVVideoFieldMode |
应该如何处理隔行扫描视频流经连接的指标。 |
supportsVideoFieldMode |
BOOL |
指示连接是否支持设置videoFieldMode 属性。 |
videoMinFrameDuration |
CMTime |
接收器应输出连续视频帧的最小时间间隔,默认值为kCMTimeInvalid 。值kCMTimeZero 或kCMTimeInvalid 表示无限制的最大帧速率。 |
supportsVideoMinFrameDuration |
BOOL |
指示连接是否支持设置videoMinFrameDuration 属性 |
videoMaxFrameDuration |
CMTime |
接收器应输出连续视频帧的最大时间间隔。默认值为kCMTimeInvalid 。值kCMTimeZero 或kCMTimeInvalid 表示无限的最小帧速率。 |
supportsVideoMaxFrameDuration |
BOOL |
指示连接是否支持设置videoMaxFrameDuration 属性。 |
videoScaleAndCropFactor |
CGFloat |
缩放系数,取值范围为 1.0 到 videoMaxScaleAndCropFactor 之间。系数为 1.0 时,图像为原始大小。在大于 1.0 的因子下,图像按因子缩放并中心裁剪为其原始尺寸。 |
videoMaxScaleAndCropFactor |
CGFloat |
连接的最大视频比例和裁剪因子,是设置videoScaleAndCropFactor 属性时可以使用的最大值。 |
3.1、视频方向 AVCaptureVideoOrientation
AVCaptureVideoOrientation 指示视频方向的枚举。可以将这些常量与AVCaptureVideoPreviewLayer
对象结合使用;
枚举值 | 描述 |
---|---|
AVCaptureVideoOrientationPortrait |
表示视频应垂直定向,顶部位于手机顶部。 |
AVCaptureVideoOrientationPortraitUpsideDown |
表示视频应垂直定向,顶部位于手机底部。 |
AVCaptureVideoOrientationLandscapeRight |
表示视频应水平定向,顶部位于手机右部。 |
AVCaptureVideoOrientationLandscapeLeft |
表示视频应水平定向,顶部位于手机左部。 |
3.2、视频字段模式 AVVideoFieldMode
AVVideoFieldMode 指示视频字段模式的枚举,用于videoFieldMode属性。
枚举值 | 描述 |
---|---|
AVVideoFieldModeBoth |
表示隔行扫描内容中的顶部和底部视频字段都应该通过。 |
AVVideoFieldModeTopOnly |
表示只应传递隔行扫描内容中的顶部视频字段。 |
AVVideoFieldModeBottomOnly |
表示仅应在隔行扫描内容中传递底部视频字段。 |
AVVideoFieldModeDeinterlace |
表示隔行扫描内容中的顶部和底部视频字段应该被解除隔行扫描。 |
4、管理视频镜像设置
属性 | 类型 | 描述 |
---|---|---|
automaticallyAdjustsVideoMirroring |
BOOL |
指示videoMirrored 的值是否可以根据会话的配置进行更改,默认值为YES。 |
supportsVideoMirroring |
BOOL |
指示连接是否支持视频镜像。 |
videoMirrored |
BOOL |
指示流经连接的视频是否应围绕其垂直轴进行镜像;如果supportsVideoMirroring 的值为YES,则可以设置该属性为YES以翻转视频的垂直轴并产生镜像效果。 |
5、管理视频稳定设置
属性 | 类型 | 描述 |
---|---|---|
supportsVideoStabilization |
BOOL |
指示此连接(视频连接类型)是否支持视频稳定;即使是视频连接,它也可能无法在所有分辨率下使用。 |
activeVideoStabilizationMode |
AVCaptureVideoStabilizationMode |
当前为连接激活的稳定模式。在支持视频稳定功能的设备上,只能稳定一部分可用的源格式。这个属性的值永远不会是AVCaptureVideoStabilizationModeAuto ,相反,该属性明确指示稳定当前是否正在使用。 |
preferredVideoStabilizationMode |
AVCaptureVideoStabilizationMode |
稳定模式最适合与连接一起使用,默认值为AVCaptureVideoStabilizationModeOff 。 |
对于preferredVideoStabilizationMode
属性:将此属性设置为AVCaptureVideoStabilizationModeOff
以外的值,以便在指定模式可用时启用稳定。启用视频稳定会在视频捕获管道中引入额外的延迟,并且可能会消耗更多的系统内存,具体取决于稳定模式和格式。如果首选稳定模式不可用,则activeVideoStabilizationMode
属性设置为AVCaptureVideoStabilizationModeOff
。将此属性设置为AVCaptureVideoStabilizationModeAuto
会为捕获格式和帧速率选择适当的模式。
5.1、视频稳定模式 AVCaptureVideoStabilizationMode
AVCaptureVideoStabilizationMode 描述设备格式支持的视频稳定模式的常量。
枚举值 | 描述 |
---|---|
AVCaptureVideoStabilizationModeOff |
视频不应该稳定。 |
AVCaptureVideoStabilizationModeStandard |
应使用iOS 5.0中引入的标准视频稳定算法来稳定视频。 |
AVCaptureVideoStabilizationModeCinematic |
应使用电影稳定算法稳定视频,以获得更加生动的效果。 |
AVCaptureVideoStabilizationModeAuto |
应选择最适合设备和格式的视频稳定模式。 |
6、管理相机校准传送设置
@property(nonatomic, readonly, getter=isCameraIntrinsicMatrixDeliverySupported) BOOL cameraIntrinsicMatrixDeliverySupported;
指示捕获连接当前是否支持传送相机内在信息。
相机内在函数以可用于渲染叠加或执行计算机视觉任务的方式描述捕获设备的当前成像参数。
如果此属性为YES,则可以设置cameraIntrinsicMatrixDeliveryEnabled
属性以在视频捕获期间捕获相机内在信息。仅当连接的输入设备格式和输出类都支持相机内在函数的传送时,此属性的值才为YES。
在 iOS 11
中,AVCaptureVideoDataOutput
类是唯一支持相机内在函数的输出。
@property(nonatomic, getter=isCameraIntrinsicMatrixDeliveryEnabled) BOOL cameraIntrinsicMatrixDeliveryEnabled;
指定是否配置捕获管道以传递摄像机内在信息;默认值为NO。
相机内在函数以可用于渲染叠加或执行计算机视觉任务的方式描述捕获设备的当前成像参数。
如果此属性为YES,则此连接中的任何AVCaptureVideoDataOutput
对象都包含其所有样本缓冲区中的kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix
附件。
只能在调用AVCaptureSession
的实例方法 -startRunning
之前更改此属性的值。