調(diào)用攝像頭來獲取幀數(shù)據(jù)

為了完成實時的捕獲私沮,首先初始化一個AVCaputureSession對象用于創(chuàng)建一個捕獲會話(session)郑兴,我們可以使用AVCaptureSession對象將AV輸入設(shè)備的數(shù)據(jù)流以另一種形式轉(zhuǎn)換到輸出册招。

然后,我們初始化一個AVCaptureDeviceInput對象兼雄,以創(chuàng)建一個輸入數(shù)據(jù)源部默,該數(shù)據(jù)源為捕獲會話(session)提供視頻數(shù)據(jù),再調(diào)用addInput方法將創(chuàng)建的輸入添加到AVCaptureSession對象称近。

接著初始化一個AVCaptureVideoDataOuput對象第队,以創(chuàng)建一個輸出目標(biāo),然后調(diào)用addOutput方法將該對象添加到捕獲會話中刨秆。

AVCaptureVideoDataOutput可用于處理從視頻中捕獲的未經(jīng)壓縮的幀凳谦。一個AVCaptureVideoDataOutput實例能處理許多其他多媒體API能處理的視頻幀,你可以通過captureOutput:didOutputSampleBuffer:fromConnection:這個委托方法獲取幀衡未,使用setSampleBufferDelegate:queue:設(shè)置抽樣緩存委托和將應(yīng)用回調(diào)的隊列尸执。AVCaptureVideoDataOutputSampleBuffer對象的委托必須采用AVCaptureVideoDataOutputSampleBufferDelegate協(xié)議家凯,使用sessionPreset協(xié)議來制定輸出品質(zhì)。

我們可以通過調(diào)用捕獲會話的startRunning方法啟動從輸入到輸出的數(shù)據(jù)流如失,通過stopRunning方法來停止數(shù)據(jù)流绊诲。

列表1給出了一個例子。setupCaptureSession創(chuàng)建了一個捕獲會話褪贵,添加了一個視頻輸入提供提視頻幀掂之,一個輸出目標(biāo)獲取捕獲的幀,然后啟動從輸入到輸出的數(shù)據(jù)流脆丁。當(dāng)捕獲會話正在運行時世舰,使用captureOut:didOutputSampleBuffer:fromConnection方法將被捕獲的視頻抽樣幀發(fā)送給抽樣緩存委托,然后每個抽樣緩存(CMSampleBufferRef)被轉(zhuǎn)換成imageFromSampleBuffer中的一個UIImage對象槽卫。

---------------------------

列表1:使用AV Foundation設(shè)置一個捕獲設(shè)備錄制視頻并將是視頻幀保存為UIImage對象跟压。

#import

// 創(chuàng)建并配置一個捕獲會話并且啟用它

- (void)setupCaptureSession

{

NSError *error = nil;

// 創(chuàng)建session

AVCaptureSession *session = [[AVCaptureSession alloc] init];

// 可以配置session以產(chǎn)生解析度較低的視頻幀,如果你的處理算法能夠應(yīng)付(這種低解析度)歼培。

// 我們將選擇的設(shè)備指定為中等質(zhì)量震蒋。

session.sessionPreset = AVCaptureSessionPresetMedium;

// 找到一個合適的AVCaptureDevice

AVCaptureDevice *device = [AVCaptureDevice

defaultDeviceWithMediaType:AVMediaTypeVideo];

// 用device對象創(chuàng)建一個設(shè)備對象input,并將其添加到session

AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device

error:&error];

if (!input) {

// 處理相應(yīng)的錯誤

}

[session addInput:input];

// 創(chuàng)建一個VideoDataOutput對象躲庄,將其添加到session

AVCaptureVideoDataOutput *output = [[[AVCaptureVideoDataOutput alloc] init] autorelease];

[session addOutput:output];

// 配置output對象

dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);

[output setSampleBufferDelegate:self queue:queue];

dispatch_release(queue);

// 指定像素格式

output.videoSettings =

[NSDictionary dictionaryWithObject:

[NSNumber numberWithInt:kCVPixelFormatType_32BGRA]

forKey:(id)kCVPixelBufferPixelFormatTypeKey];

// 如果你想將視頻的幀數(shù)指定一個頂值, 例如15ps

// 可以設(shè)置minFrameDuration(該屬性在iOS 5.0中棄用)

output.minFrameDuration = CMTimeMake(1, 15);

// 啟動session以啟動數(shù)據(jù)流

[session startRunning];

// 將session附給實例變量

[self setSession:session];

}

// 抽樣緩存寫入時所調(diào)用的委托程序

- (void)captureOutput:(AVCaptureOutput *)captureOutput

didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer

fromConnection:(AVCaptureConnection *)connection

{

// 通過抽樣緩存數(shù)據(jù)創(chuàng)建一個UIImage對象

UIImage *image = [self imageFromSampleBuffer:sampleBuffer];

< 此處添加使用該image對象的代碼 >

}

// 通過抽樣緩存數(shù)據(jù)創(chuàng)建一個UIImage對象

- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer

{

// 為媒體數(shù)據(jù)設(shè)置一個CMSampleBuffer的Core Video圖像緩存對象

CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

// 鎖定pixel buffer的基地址

CVPixelBufferLockBaseAddress(imageBuffer, 0);

// 得到pixel buffer的基地址

void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);

// 得到pixel buffer的行字節(jié)數(shù)

size_tbytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);

// 得到pixel buffer的寬和高

size_twidth = CVPixelBufferGetWidth(imageBuffer);

size_theight = CVPixelBufferGetHeight(imageBuffer);

// 創(chuàng)建一個依賴于設(shè)備的RGB顏色空間

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

// 用抽樣緩存的數(shù)據(jù)創(chuàng)建一個位圖格式的圖形上下文(graphics context)對象

CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8,

bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);

// 根據(jù)這個位圖context中的像素數(shù)據(jù)創(chuàng)建一個Quartz image對象

CGImageRef quartzImage = CGBitmapContextCreateImage(context);

// 解鎖pixel buffer

CVPixelBufferUnlockBaseAddress(imageBuffer,0);

// 釋放context和顏色空間

CGContextRelease(context);

CGColorSpaceRelease(colorSpace);

// 用Quartz image創(chuàng)建一個UIImage對象image

UIImage *image = [UIImage imageWithCGImage:quartzImage];

// 釋放Quartz image對象

CGImageRelease(quartzImage);

return (image);

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喷好,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子读跷,更是在濱河造成了極大的恐慌,老刑警劉巖禾唁,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件效览,死亡現(xiàn)場離奇詭異,居然都是意外死亡荡短,警方通過查閱死者的電腦和手機丐枉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掘托,“玉大人瘦锹,你說我怎么就攤上這事∩量” “怎么了弯院?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泪掀。 經(jīng)常有香客問我听绳,道長,這世上最難降的妖魔是什么异赫? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任椅挣,我火速辦了婚禮头岔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鼠证。我一直安慰自己峡竣,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布量九。 她就那樣靜靜地躺著适掰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娩鹉。 梳的紋絲不亂的頭發(fā)上攻谁,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機與錄音弯予,去河邊找鬼戚宦。 笑死,一個胖子當(dāng)著我的面吹牛锈嫩,可吹牛的內(nèi)容都是我干的受楼。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼呼寸,長吁一口氣:“原來是場噩夢啊……” “哼艳汽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起对雪,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤河狐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瑟捣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馋艺,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年迈套,在試婚紗的時候發(fā)現(xiàn)自己被綠了捐祠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡桑李,死狀恐怖踱蛀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贵白,我是刑警寧澤率拒,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站禁荒,受9級特大地震影響俏橘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜圈浇,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一寥掐、第九天 我趴在偏房一處隱蔽的房頂上張望靴寂。 院中可真熱鬧,春花似錦召耘、人聲如沸百炬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剖踊。三九已至,卻和暖如春衫贬,著一層夾襖步出監(jiān)牢的瞬間德澈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工固惯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留梆造,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓葬毫,卻偏偏與公主長得像镇辉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贴捡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

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