2011-04-11 13 views
5

AVCaptureSession'dan CVImageBufferRef alıyorum ve bu görüntü arabelleğini almak ve ağ üzerinden yüklemek istiyorum. Yer ve zamandan tasarruf etmek için, görüntüyü CIImage ve NSBitmapImage'a dönüştürmeden yapmak istiyorum. Bu, her yerde gördüğüm çözümdür (burada: How can I obtain raw data from a CVImageBuffer object).Ham veri CVImageBuffer oluşturulmadan?

Bunun nedeni benim izlenimimin CVImageBuffer'ın sıkıştırılmış olabileceğidir, ki bu benim için harika bir şeydir ve eğer render edersem onu ​​tam bir bitmap halinde açmalıyım ve sonra tüm bitmap'i yüklemeliyim. Sıkıştırılmış veriyi almak istiyorum (CVImageBuffer'da olduğu gibi tek bir sıkıştırılmış çerçevenin kendiliğinden daha sonra kendiliğinden geçemeyeceğini fark etmek). Bence bu CVImageBuffer'ın temel veri işaretçisini ve uzunluğunu istiyorum, ancak API içinde bunu elde etmenin bir yolu olmadığını görüyorum. Herhangi bir fikri olan var mı?

cevap

8

CVImageBuffer kendisi bir soyut türüdür. Resminiz CVPixelBuffer, CVOpenGLBuffer veya CVOpenGLTexture örneklerinden biri olmalıdır. Bu türlere ait belgeler, verilere erişmek için kullanabileceğiniz işlevleri listeler.

Eğer GetTypeID yöntemleri kullanmak hangi tip olduğunu söylemek için:, dokümanlar CVOpenGLTexture QuartzCore.framework tanımlanır söylemek

CVImageBufferRef image = …; 
CFTypeID imageType = CFGetTypeID(image); 

if (imageType == CVPixelBufferGetTypeID()) { 
    // Pixel Data 
} 
else if (imageType == CVOpenGLBufferGetTypeID()) { 
    // OpenGL pbuffer 
} 
else if (imageType == CVOpenGLTextureGetTypeID()) { 
    // OpenGL Texture 
} 
+0

Eh, ama yine de bağlayıcı hataları var ve her iki OpenGLBuffer ile kuramayacağını veya OpenGLTexture denetimi (ayrıca CoreVideo.framework çalıştı). Neyse ki, piksel arabellekleri var gibi görünüyor, bu yüzden bir moot noktası. – jab