1、管理數(shù)據(jù)輸入的抽象類 AVCaptureInput
AVCaptureInput 繼承 NSObject
,是向 AVCaptureSession
提供輸入數(shù)據(jù)的對象的抽象超類卿啡。
要將 AVCaptureInput
對象與會話 AVCaptureSession
關(guān)聯(lián),需要 AVCaptureSession
實例調(diào)用 -addInput:
方法答毫。
AVCaptureInput
對象具有一個或多個端口(AVCaptureInputPort
的實例)摹量,每個端口對應(yīng)于它們可以生成的每個數(shù)據(jù)流。 例如盔憨,呈現(xiàn)一個視頻數(shù)據(jù)流的AVCaptureDevice
對象具有一個端口徙菠。
@property(nonatomic, readonly) NSArray<AVCaptureInputPort *> *ports;
捕獲輸入的端口集。當(dāng)該端口的formatDescription
發(fā)生更改時郁岩,每個AVCaptureInputPort
實例都會發(fā)送AVCaptureInputPortFormatDescriptionDidChangeNotification
通知婿奔。
1.1、輸入端口 AVCaptureInputPort
AVCaptureInputPort 捕獲輸入提供的特定數(shù)據(jù)流问慎。
屬性 | 類型 | 描述 |
---|---|---|
enabled |
BOOL |
指示端口是否已啟用萍摊,默認(rèn)為YES。如果要僅捕獲AVCaptureInput 對象提供的媒體流的子集如叼,請使用此屬性有選擇地禁用流冰木。 |
input |
AVCaptureInput |
擁有該端口的輸入對象 |
mediaType |
AVMediaType |
端口的媒體類型 |
clock |
CMClockRef |
表示AVCaptureDevice 自己的時鐘的對象。返回的CMClockRef 對象是只讀的,可能無法反映AVCaptureDevice 中的實際時鐘踊沸。 |
formatDescription |
CMFormatDescriptionRef |
返回的對象描述了端口當(dāng)前提供的媒體格式歇终。 |
NSString *const AVCaptureInputPortFormatDescriptionDidChangeNotification;
如果AVCaptureInputPort
的formattcription
屬性的值更改,則發(fā)送該通知逼龟。
1.2评凝、媒體類型AVMediaType
媒體類型AVMediaType是使用typedef
修飾的標(biāo)識符,提供各種媒體類型:
值 | 描述 |
---|---|
AVMediaTypeVideo |
指定視頻 |
AVMediaTypeAudio |
指定音頻 |
AVMediaTypeText |
指定文本 |
AVMediaTypeClosedCaption |
指定閉路內(nèi)容 |
AVMediaTypeSubtitle |
指定字幕 |
AVMediaTypeTimecode |
指定一個時間代碼 |
AVMediaTypeMetadata |
指定元數(shù)據(jù) |
AVMediaTypeMuxed |
指定mux媒體 |
AVMediaTypeMetadataObject |
|
AVMediaTypeDepthData |
1.3腺律、子類
由于 AVCaptureInput
是個抽象類奕短,無法直接使用,所以我們一般使用它的子類類管理輸入數(shù)據(jù)匀钧。我們常用的AVCaptureInput
的子類有三個:
-
AVCaptureDeviceInput
:用于從AVCaptureDevice
對象捕獲數(shù)據(jù)翎碑。 -
AVCaptureScreenInput
:從macOS屏幕上錄制的一種捕獲輸入。 -
AVCaptureMetadataInput
:它為AVCaptureSession
提供AVMetadataItems
榴捡。AVCaptureMetadataInputs
呈現(xiàn)了一個且只有一個AVCaptureInputPort
杈女,它目前可能只連接到AVCaptureMovieFileOutput
。通過輸入端口提供的元數(shù)據(jù)由客戶機(jī)提供吊圾,并且必須符合客戶機(jī)提供的CMFormatDescription
达椰。AVMetadataItems
在AVTimedMetadataGroup
中提供。
2项乒、AVCaptureDeviceInput
AVCaptureDeviceInput AVCaptureDeviceInput
是AVCaptureInput
的一個具體子類啰劲,用于從AVCaptureDevice
對象捕獲數(shù)據(jù)傳遞給AVCaptureSession
。
2.1檀何、創(chuàng)建AVCaptureDeviceInput
我們可以使用類方法或者實例方法通過指定的 AVCaptureDevice
初始化 AVCaptureDeviceInput
:
- (instancetype)initWithDevice:(AVCaptureDevice *)device error:(NSError * _Nullable *)outError;
+ (instancetype)deviceInputWithDevice:(AVCaptureDevice *)device error:(NSError * _Nullable *)outError;
2.2蝇裤、訪問設(shè)備 AVCaptureDevice
@property(nonatomic, readonly) AVCaptureDevice *device;
與輸入相關(guān)聯(lián)的設(shè)備。
2.3频鉴、設(shè)置AVCaptureDeviceInput
屬性
@property(nonatomic) BOOL unifiedAutoExposureDefaultsEnabled;
指示自動曝光默認(rèn)值是否統(tǒng)一的布爾值栓辜。如果是,自動曝光默認(rèn)值是統(tǒng)一的垛孔。如果沒有(默認(rèn))藕甩,應(yīng)用程序的自動曝光行為將被保留。
如果手動設(shè)置minFrameRate
周荐、maxFrameRate
或maxExposureDuration
狭莱,則無論此屬性的設(shè)置如何,自定義值都將覆蓋設(shè)備默認(rèn)值概作。
//使用AVMediaTypeVideo 指明AVCaptureDevice代表視頻腋妙,默認(rèn)使用后置攝像頭進(jìn)行初始化
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *videoInputError = nil;
AVCaptureDeviceInput *videoInput = [[AVCaptureDeviceInput alloc]initWithDevice:device error:&videoInputError];
if (videoInputError){
NSLog(@"videoInputError == %@",videoInputError);
}
else{
AVCaptureSession *session = [[AVCaptureSession alloc]init];
if ([session canAddInput:videoInput]){
[session addInput:videoInput];
}
}
3、AVCaptureScreenInput
AVCaptureScreenInput 是AVCaptureInput
的具體子類讯榕,用于從macOS中的屏幕錄制的捕獲輸入骤素。
AVCaptureScreenInput
實例是 AVCaptureSession
對象的輸入源匙睹,AVCaptureSession
對象從連接到系統(tǒng)的其中一個屏幕提供媒體數(shù)據(jù),由CGDirectDisplayIDs
表示谆甜。
3.1垃僚、初始化捕獲屏幕輸入
- (instancetype)initWithDisplayID:(CGDirectDisplayID)displayID;
該方法初始化AVCaptureScreenInput
,并提供來自指定顯示的媒體數(shù)據(jù)规辱。
- 參數(shù)
displayID
: 從中捕獲視頻的顯示ID。 - 返回值:初始化捕獲屏幕輸入以提供來自給定顯示器的媒體數(shù)據(jù)栽燕。如果無法使用顯示例如:它在系統(tǒng)上不可用罕袋,則返回nil。
- (instancetype)init;
+ (instancetype)new;
創(chuàng)建AVCaptureScreenInput
碍岔,從主屏幕提供媒體數(shù)據(jù)浴讯。使用這兩個方法等效于使用CGMainDisplayID()
函數(shù)獲取CGDirectDisplayID
傳遞給-initWithDisplayID:
方法。
3.2蔼啦、一些設(shè)置
屬性 | 類型 | 描述 |
---|---|---|
minFrameDuration |
CMTime |
屏幕輸入的最小幀持續(xù)時間榆纽。使用此屬性來請求輸入生成視頻幀的最大幀速率。由于總帶寬捏肢,所請求的速率可能無法實現(xiàn)奈籽,因此實際幀速率可能較低。 |
cropRect |
CGRect |
指示要捕獲的屏幕區(qū)域的邊界矩形(以像素為單位)鸵赫。默認(rèn)情況下衣屏,AVCaptureScreenInput 捕獲與其關(guān)聯(lián)的displayID 的整個區(qū)域。原點(diǎn)(0,0) 是屏幕的左下角辩棒。 |
scaleFactor |
CGRect |
指示從屏幕捕獲的視頻緩沖區(qū)的縮放系數(shù)狼忱。默認(rèn)情況下,AVCaptureScreenInput 以 1.0 的比例因子(無縮放)從顯示器捕獲視頻緩沖區(qū)一睁。設(shè)置此屬性以按給定因子縮放緩沖區(qū); 例如钻弄,scaleFactor 為 2.0 的 320x240 捕獲區(qū)域產(chǎn)生 640x480 的視頻緩沖區(qū)。 |
capturesCursor |
BOOL |
指定鼠標(biāo)光標(biāo)是否出現(xiàn)在捕獲的輸出中者吁。當(dāng)此屬性為true(默認(rèn)值)時窘俺,捕獲的視頻幀包括鼠標(biāo)指針。如果將此屬性更改為false砚偶,則捕獲的輸出僅包含屏幕上的窗口(即批销,捕獲的視頻中鼠標(biāo)指針不可見)。 |
capturesMouseClicks |
BOOL |
指定鼠標(biāo)單擊是否在捕獲的輸出中突出顯示染坯。默認(rèn)情況下均芽,AVCaptureScreenInput 不會突出顯示其捕獲的輸出中的鼠標(biāo)單擊。如果將此屬性設(shè)置為YES单鹿,則會在捕獲的輸出中突出顯示鼠標(biāo)單擊(在單擊的持續(xù)時間內(nèi)圍繞鼠標(biāo)繪制圓圈)掀宋。 |
AVCaptureScreenInput *screenInput = [[AVCaptureScreenInput alloc] initWithDisplayID:CGMainDisplayID()];
AVCaptureSession *session = [[AVCaptureSession alloc]init];
if ([session canAddInput:screenInput]){
[session addInput:screenInput];
}
4、AVCaptureMetadataInput
AVCaptureMetadataInput 是AVCaptureInput
的具體子類,用于向AVCaptureSession
提供定時元數(shù)據(jù)的捕獲輸入劲妙。
4.1湃鹊、創(chuàng)建 AVCaptureMetadataInput
- (instancetype)initWithFormatDescription:(CMMetadataFormatDescriptionRef)desc
clock:(CMClockRef)clock;
+ (instancetype)metadataInputWithFormatDescription:(CMMetadataFormatDescriptionRef)desc
clock:(CMClockRef)clock;
創(chuàng)建捕獲元數(shù)據(jù)輸入,以便為AVCaptureSession
提供定時組镣奋。有兩個參數(shù):
- 參數(shù):
desc
: 用于定義客戶端提供的元數(shù)據(jù)币呵。如果傳遞NULL
,則拋出異常NSInvalidArgumentException
侨颈。 - 參數(shù):
clock
:為提供的樣本提供時基余赢。如果傳遞NULL
,則拋出異常NSInvalidArgumentException
哈垢。
4.2妻柒、提供元數(shù)據(jù)
- (BOOL)appendTimedMetadataGroup:(AVTimedMetadataGroup *)metadata
error:(NSError * _Nullable *)outError;
為AVCaptureSession
提供元數(shù)據(jù)。
- 參數(shù)
metadata
:定時的元數(shù)據(jù)組耘分。要表示沒有元數(shù)據(jù)的句點(diǎn)举塔,傳遞一個空的AVTimedMetadataGroup
。 - 返回值:指示組是否已成功附加求泰。