OC之輸入管理AVCaptureInput

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;

如果AVCaptureInputPortformattcription屬性的值更改,則發(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的子類有三個:

AVCaptureInput繼承關(guān)系.png
  • AVCaptureDeviceInput:用于從AVCaptureDevice對象捕獲數(shù)據(jù)翎碑。
  • AVCaptureScreenInput:從macOS屏幕上錄制的一種捕獲輸入。
  • AVCaptureMetadataInput:它為AVCaptureSession提供AVMetadataItems榴捡。AVCaptureMetadataInputs呈現(xiàn)了一個且只有一個AVCaptureInputPort杈女,它目前可能只連接到AVCaptureMovieFileOutput。通過輸入端口提供的元數(shù)據(jù)由客戶機(jī)提供吊圾,并且必須符合客戶機(jī)提供的CMFormatDescription达椰。AVMetadataItemsAVTimedMetadataGroup中提供。

2项乒、AVCaptureDeviceInput

AVCaptureDeviceInput AVCaptureDeviceInputAVCaptureInput的一個具體子類啰劲,用于從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周荐、maxFrameRatemaxExposureDuration狭莱,則無論此屬性的設(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

AVCaptureScreenInputAVCaptureInput的具體子類讯榕,用于從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

AVCaptureMetadataInputAVCaptureInput的具體子類,用于向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
  • 返回值:指示組是否已成功附加求泰。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末央渣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拜秧,更是在濱河造成了極大的恐慌痹屹,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枉氮,死亡現(xiàn)場離奇詭異志衍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)聊替,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門楼肪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惹悄,你說我怎么就攤上這事春叫。” “怎么了泣港?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵暂殖,是天一觀的道長。 經(jīng)常有香客問我当纱,道長呛每,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任坡氯,我火速辦了婚禮晨横,結(jié)果婚禮上洋腮,老公的妹妹穿的比我還像新娘。我一直安慰自己手形,他們只是感情好啥供,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著库糠,像睡著了一般伙狐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上曼玩,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天鳞骤,我揣著相機(jī)與錄音,去河邊找鬼黍判。 笑死,一個胖子當(dāng)著我的面吹牛篙梢,可吹牛的內(nèi)容都是我干的顷帖。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼渤滞,長吁一口氣:“原來是場噩夢啊……” “哼贬墩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起妄呕,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤陶舞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绪励,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肿孵,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年疏魏,在試婚紗的時候發(fā)現(xiàn)自己被綠了停做。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡大莫,死狀恐怖蛉腌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情只厘,我是刑警寧澤烙丛,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站羔味,受9級特大地震影響河咽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜介评,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一库北、第九天 我趴在偏房一處隱蔽的房頂上張望爬舰。 院中可真熱鬧,春花似錦寒瓦、人聲如沸情屹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垃你。三九已至,卻和暖如春喂很,著一層夾襖步出監(jiān)牢的瞬間惜颇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工少辣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凌摄,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓漓帅,卻偏偏與公主長得像锨亏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子忙干,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容