iOS攝像頭拍攝照片結構框架及數(shù)據(jù)流向(一)

最近在維護一個用到攝像頭的iOS app榜掌。由于什么都是從頭開始學的,趁著記憶還新鮮趕快記錄下學習內(nèi)容。這個應用中需要對拍攝下來的不同曝光度的照片進行合成星岗。為了更好的理解iOS中是如何拍照片的胚宦,以及更好的做圖像處理首有,對拍照片的類做了一點研究。本篇文章僅限于用攝像頭拍攝靜態(tài)圖片枢劝,不涉及視頻井联,音樂,麥克風您旁。

iOS有自己專屬個攝像頭接口烙常。但是由于app和iOS系統(tǒng)的互交是由iOS完成的,不熟悉的人很難在一個半成品的app中找出圖像數(shù)據(jù)究竟從哪里,怎么呈現(xiàn)到View上的蚕脏。因此在這里寫出我的理解侦副。


攝像頭用那個類?

iOS調(diào)用攝像頭有兩類方法驼鞭,一是用UIImagePickerController秦驯,二是AVFoundation

前者適用于創(chuàng)建簡單拍攝的攝像頭挣棕。你按一個按鈕译隘,拍一個照片,存到相冊里就完了洛心」淘牛可以設置相片、視頻質(zhì)量词身,分辨率玻驻,預設的攝像頭面板,開不開閃光燈 etc. ?簡單實用偿枕,但是沒有其他可操作的余地璧瞬,就像自動擋的汽車??差不多。?

后者相對復雜渐夸,需要稍微花一點時間去理解和實踐他的運作原理嗤锉。但是他提供了一些底層內(nèi)容供開發(fā)者操作。有點像手動擋的汽車??墓塌。

總結一句話瘟忱,如果你的app僅需要拍張照片就完事,用UIImagePickerController就好苫幢。如果要對照片進行二次加工访诱,用AVFoundation。


UIImagePickerController怎么用韩肝?

要用UIImagePickerController來拍照或者錄制視頻通炒ゲ耍可以分為如下步驟:

1,創(chuàng)建UIImagePickerController對象哀峻。?

2涡相,指定拾取源,平時選擇照片時使用的拾取源是照片庫或者相簿剩蟀,此刻需要指定為攝像頭類型催蝗。

3,指定攝像頭育特,前置攝像頭或者后置攝像頭丙号。?

4,設置媒體類型mediaType,注意如果是錄像必須設置犬缨,如果是拍照此步驟可以省略喳魏,因為mediaType默認包含kUTTypeImage(注意媒體類型定義在MobileCoreServices.framework中)?

5,指定捕獲模式遍尺,拍照或者錄制視頻截酷。(視頻錄制時必須先設置媒體類型再設置捕獲模式?

6涮拗,展示UIImagePickerController(通常以模態(tài)窗口形式打開)乾戏。?

7,拍照和錄制視頻結束后在代理方法中展示/保存照片或視頻三热。

具體代碼示例看這里鼓择,CSDN的大神們講的很清楚。


AVFoundation怎么用就漾?

我手里的app用的AVFoundation呐能,下面是我對AVFoundation的使用心得。這里有官方給的文字指導抑堡。一般人看這個可能比較費勁摆出,我用接地氣兒的話給解釋一遍。

如圖所示(這是中文教科書中最坑爹的一句話)首妖,簡單地說結構分3層偎漫,最上面一層是輸入,最下面一層是輸出有缆,中間需要一個Session來連接象踊。這些類的名字全是AVCapture開頭(跟SOD開頭是一個道理,一看名字就知道是什么棚壁,別往下問了杯矩。。)袖外。

輸入

AVCaptureDevice, 就是問是麥克風史隆?還是攝像頭?

創(chuàng)建:_yourDevice =?[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; //設備是攝像頭曼验,因為我要拍照

AVCaptureDeviceInput, 這個用來輸入逆害。你對麥克喊一聲“我要吃煎餅!”蚣驼。AVCaptureDevice是麥克風魄幕,輸入“我要吃煎餅!”的方法是通過AVCaptureDeviceInput颖杏。

創(chuàng)建:_yourInput = [AVCaptureDeviceInput deviceInputWithDevice:_yourDevice error:nil]; //這里需要device纯陨,所以要先創(chuàng)建device

輸出:

AVCaptureOutput,這個厲害了,看你輸出的是什么翼抠。如果是音頻咙轩,例如“我要吃煎餅!”,就是AVCaptureAudioFileOutput阴颖,如果是拍你吃煎餅的視頻是AVCaptureMovieFileOutput活喊。我們做的是圖像,用AVCapturePhotoOutput量愧。

創(chuàng)建:_yourOutput = [[AVCapturePhotoOutput alloc] init];

Session:

這個最抽象钾菊,他相當于一個有幾個state的攝像機。你需要把輸入偎肃,輸出全都加進去煞烫,配置一下,打開Session就可以了累颂。每樣就一行命令滞详。

創(chuàng)建:

_yourSession = [[AVCaptureSession alloc] init];

?[_yourSession beginConfiguration]; //是的,開始配置也要交方程

設置輸入:

if( [_yourSession canAddInput:_yourInput] ) {

? ? ?[_yourSession addInput:_yourInput];

}

設分辨率:

if( [_yourSession canSetSessionPreset:preset] ) {

? ? ? ? ? ? [_yourSession setSessionPreset:preset];

? ? ? ? }

?else if( [_yourSession canSetSessionPreset:AVCaptureSessionPreset640x480] ) {

? ? ? ? ? ? [_yourSession setSessionPreset:AVCaptureSessionPreset640x480]; //這里設置你需要的分辨率

}

設置輸出:

if([_yourSession canAddOutput:_yourOutput]) {

? ? ? ? ? ? [_yourSession addOutput:_yourOutput];

}

最后別忘了commit你的配置:

[_yourSession commitConfiguration];

預覽:

AVCaptureVideoPreviewLayer紊馏,你在開攝像頭的時候料饥,按快門之前,屏幕可以看到攝像頭傳來的影像對吧朱监。那個就是這個岸啡。這個預覽和viewController有關,需要在main.storyboard里創(chuàng)建view組件赌朋,ctrl拉出property凰狞,把這個property傳過來設置預覽。這個也需要你在建立了Session之后加入沛慢。

創(chuàng)建:_yourPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_yourSession];

你的view組件弄好之后赡若,設置預覽:

if(_previewLayer) {

? ? ? ? _yourPreviewLayer.frame = imageView.bounds;//設置預覽窗口大小與view組件大小相等

? ? ? ? _yourPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;//重力感知設置,你轉手機方向团甲,屏幕切換會resize

? ? ? ? [imageView.layer addSublayer:_yourPreviewLayer];

}

都弄完了逾冬,如果你要開始拍攝了,就交方程開始

if (![_captureSession isRunning]) { //這段一般寫在viewWillAppear里

? ? ? ? [_yourSession startRunning];

? ? }

停止也一樣

if ([_captureSession isRunning]) { //這段一般寫在viewWillDisappear里

? ? ? ? [_yourSession stopRunning];

? ? }

看完了是不是覺得Session有點像數(shù)據(jù)庫的Session躺苦,或者Source Control的用法身腻。配置完了要commit才行。

如果需要音頻匹厘,錄音嘀趟,視頻錄制和播放的話,看這里愈诚。

第二部分講圖像的數(shù)據(jù)流向她按。




ref:?

http://blog.csdn.net/u012988591/article/details/54947753

http://www.cnblogs.com/kenshincui/p/4186022.html

https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html

http://www.cnblogs.com/kenshincui/p/4186022.html

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末牛隅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子酌泰,更是在濱河造成了極大的恐慌媒佣,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陵刹,死亡現(xiàn)場離奇詭異默伍,居然都是意外死亡,警方通過查閱死者的電腦和手機衰琐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門也糊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碘耳,你說我怎么就攤上這事显设】虺冢” “怎么了辛辨?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瑟枫。 經(jīng)常有香客問我斗搞,道長,這世上最難降的妖魔是什么慷妙? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任僻焚,我火速辦了婚禮,結果婚禮上膝擂,老公的妹妹穿的比我還像新娘虑啤。我一直安慰自己,他們只是感情好架馋,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布狞山。 她就那樣靜靜地躺著,像睡著了一般叉寂。 火紅的嫁衣襯著肌膚如雪萍启。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天屏鳍,我揣著相機與錄音勘纯,去河邊找鬼。 笑死钓瞭,一個胖子當著我的面吹牛驳遵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播山涡,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼堤结,長吁一口氣:“原來是場噩夢啊……” “哼搏讶!你這毒婦竟也來了?” 一聲冷哼從身側響起霍殴,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤媒惕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后来庭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妒蔚,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年月弛,在試婚紗的時候發(fā)現(xiàn)自己被綠了肴盏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡帽衙,死狀恐怖菜皂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厉萝,我是刑警寧澤恍飘,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站谴垫,受9級特大地震影響章母,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翩剪,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一乳怎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧前弯,春花似錦蚪缀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剃根,卻和暖如春哩盲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狈醉。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工廉油, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苗傅。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓抒线,卻偏偏與公主長得像,于是被迫代替她去往敵國和親渣慕。 傳聞我的和親對象是個殘疾皇子嘶炭,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

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