2011-04-11 11 views
5

मुझे अपने AVCaptureSession से एक CVImageBufferRef मिल रहा है, और मैं उस छवि बफर को लेना चाहता हूं और इसे नेटवर्क पर अपलोड करना चाहता हूं। अंतरिक्ष और समय बचाने के लिए, मैं छवि को सीआईएममेज और एनएसबीटमैप इमेज में प्रस्तुत किए बिना ऐसा करना चाहूंगा, जो समाधान मैंने हर जगह देखा है (जैसे यहां: How can I obtain raw data from a CVImageBuffer object)।प्रतिपादन के बिना CVImageBuffer से कच्चे डेटा?

ऐसा इसलिए है क्योंकि मेरी धारणा यह है कि CVImageBuffer को संपीड़ित किया जा सकता है, जो मेरे लिए बहुत ही बढ़िया है, और यदि मैं इसे प्रस्तुत करता हूं, तो मुझे इसे पूर्ण बिटमैप में असम्पीडित करना होगा और फिर संपूर्ण बिटमैप अपलोड करना होगा। मैं संपीड़ित डेटा लेना चाहता हूं (यह महसूस करना कि एक संकुचित फ्रेम बाद में खुद को बिना प्रस्तुत किया जा सकता है) जैसे कि यह CVImageBuffer के भीतर बैठता है। मुझे लगता है कि इसका मतलब है कि मैं CVImageBuffer का बेस डेटा पॉइंटर और इसकी लंबाई चाहता हूं, लेकिन ऐसा नहीं लगता कि एपीआई के भीतर इसे पाने का एक तरीका है। किसी के पास कोई विचार है?

उत्तर

8

CVImageBuffer स्वयं एक सार प्रकार है। आपकी छवि या तो CVPixelBuffer, CVOpenGLBuffer, या CVOpenGLTexture का एक उदाहरण होना चाहिए। उन प्रकारों के लिए प्रलेखन उन कार्यों को सूचीबद्ध करता है जिनका उपयोग आप डेटा तक पहुंचने के लिए कर सकते हैं।

जो टाइप बताने के लिए आप GetTypeID तरीकों का उपयोग किया है:

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

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

खैर, डॉक्स का कहना है कि CVOpenGLTexture QuartzCore.framework में परिभाषित किया गया है, लेकिन मैं अभी भी लिंकर त्रुटियों मिला है और साथ या तो OpenGLBuffer निर्माण नहीं कर सकता या OpenGLTxture जांच (CoreVideo.framework भी कोशिश की)। सौभाग्य से, मुझे पिक्सेल बफर दिखाई देता है, इसलिए यह एक महत्वपूर्ण बिंदु है। – jab

संबंधित मुद्दे