我想實時顯示來自相機的UIImage,而且看起來我的UIImageView沒有正確顯示圖像。這是一個AVCaptureVideoDataOutputSampleBufferDelegate
有方法來實現從UIImageView中不顯示CMSampleBufferRef創建的UIImage?
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
// Create a UIImage from the sample buffer data
UIImage *theImage = [self imageFromSampleBuffer:sampleBuffer];
// NSLog(@"Got an image! %f %f", theImage.size.width, theImage.size.height);
// NSLog(@"The image view is %@", imageView);
// UIImage *theImage = [[UIImage alloc] initWithData:[NSData
// dataWithContentsOfURL:[NSURL
// URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];
[self.session stopRunning];
[imageView setImage: theImage];
}
爲了讓容易出現問題的出路:
- 使用的UIImagePickerController不是一個選項(最終我們將實際做的事情與圖像)
- 我知道處理程序正在被調用(NSLog調用已完成,並且我看到了輸出)
- 我知道我已經正確設置了IBOutlet聲明。如果我使用上面的註釋代碼從web上加載任意圖像,而不是簡單地將
setImage:theImage
發送到imageView,則圖像加載正確(並且第二次調用NSLog報告非零對象)。 - 至少在基本的範圍內,我從
imageFromSampleBuffer:
得到的圖片沒有問題,因爲NSLog報告的尺寸爲360x480,這是我預期的尺寸。
我正在使用的代碼是最近發佈的AVFoundation
片段Apple提供的here。
尤其是,我使用的代碼設置了AVCaptureSession
對象和朋友(我的理解很少),並從核心視頻緩衝區創建了UIImage對象(即imageFromSampleBuffer
方法)。
最後,我可以讓應用程序崩潰,如果我嘗試發送drawInRect:
與由imageFromSamplerBuffer
返回UIImage
一個普通的UIView子類,而它如果我如上使用UIImage
從URL不會崩潰。下面是從內部崩潰的調試器堆棧跟蹤(我得到一個EXC_BAD_ACCESS信號):
#0 0x34a977ee in decode_swap()
#1 0x34a8f80e in decode_data()
#2 0x34a8f674 in img_decode_read()
#3 0x34a8a76e in img_interpolate_read()
#4 0x34a63b46 in img_data_lock()
#5 0x34a62302 in CGSImageDataLock()
#6 0x351ab812 in ripc_AcquireImage()
#7 0x351a8f28 in ripc_DrawImage()
#8 0x34a620f6 in CGContextDelegateDrawImage()
#9 0x34a61fb4 in CGContextDrawImage()
#10 0x321fd0d0 in -[UIImage drawInRect:blendMode:alpha:]()
#11 0x321fcc38 in -[UIImage drawInRect:]()
編輯:下面是有關的UIImage受到的代碼位返回一些更多的信息。
使用描述的方法here,我可以找到像素並打印它們,乍一看它們看起來不錯(例如,alpha通道中的每個值都是255)。但是,緩衝區大小略有不同。我從Flickr從該URL獲得的圖像是375x500,其[pixelData length]
給我750000 = 375*500*4
,這是預期值。但是,從imageFromSampleBuffer:
返回的圖像的像素數據的大小爲691208 = 360*480*4 + 8
,因此像素數據中有8個額外的字節。 CVPixelBufferGetDataSize
本身將返回此8值。我想了一下,可能是因爲在內存中的對齊位置分配緩衝區,但691200是256的倍數,所以也不能解釋它。這個大小的差異是我可以告訴兩個UIImages之間唯一的區別,它可能會造成麻煩。但是,沒有理由爲緩衝區分配額外的內存,從而導致EXC_BAD_ACCESS違例。
非常感謝您的幫助,如果您需要更多信息,請告知我們。
我遇到了同樣的問題。令人不快的是,Apple本身爲我們提供了自定義的「imageFromSampleBuffer」功能。 – 2010-07-22 22:36:55
更奇怪的是,圖像內容本身是正確的。我正在通過套接字將原始像素推送到不同的機器,這正是從相機以正確格式捕獲的視頻幀。 – 2010-07-22 23:59:15