दुर्भाग्यवश, वास्तव में, इन नए कार्यों पर कोई दस्तावेज़ीकरण नहीं है।
/*!
@function CVOpenGLESTextureCacheCreate
@abstract Creates a new Texture Cache.
@param allocator The CFAllocatorRef to use for allocating the cache. May be NULL.
@param cacheAttributes A CFDictionaryRef containing the attributes of the cache itself. May be NULL.
@param eaglContext The OpenGLES 2.0 context into which the texture objects will be created. OpenGLES 1.x contexts are not supported.
@param textureAttributes A CFDictionaryRef containing the attributes to be used for creating the CVOpenGLESTexture objects. May be NULL.
@param cacheOut The newly created texture cache will be placed here
@result Returns kCVReturnSuccess on success
*/
CV_EXPORT CVReturn CVOpenGLESTextureCacheCreate(
CFAllocatorRef allocator,
CFDictionaryRef cacheAttributes,
void *eaglContext,
CFDictionaryRef textureAttributes,
CVOpenGLESTextureCacheRef *cacheOut) __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);
अधिक कठिन तत्वों गुण शब्दकोशों कर रहे हैं, जो दुर्भाग्य से आप की जरूरत: सबसे अच्छा आप पा लिए जा रहे हैं अभी CVOpenGLESTextureCache.h
हेडर फाइल है, जहां आप समारोह मानकों का एक बुनियादी विवरण देखेंगे में है इन कार्यों का सही ढंग से उपयोग करने के लिए उदाहरण ढूंढने के लिए। ऐप्पल में GLCameraRipple और RosyWriter उदाहरण हैं जो दिखाते हैं कि बीजीआरए और वाईयूवी इनपुट रंग प्रारूपों के साथ तेज़ बनावट अपलोड पथ का उपयोग कैसे करें। ऐप्पल ने डब्ल्यूडब्ल्यूडीसी (जो अभी भी वीडियो के साथ सुलभ हो सकता है) में क्रोमाकी उदाहरण प्रदान किया है, जो दिखाता है कि ओपनजीएल ईएस बनावट से जानकारी खींचने के लिए इन बनावट कैश का उपयोग कैसे किया जाए।
मुझे बस यह GPUImage फ्रेमवर्क (उस स्रोत कोड के लिए उपलब्ध है जो उस लिंक पर उपलब्ध है) में काम कर रहा है, इसलिए मैं यह बताऊंगा कि मैं इससे क्या पालने में सक्षम था। सबसे पहले, मैं एक बनावट कैश निम्नलिखित कोड का उपयोग कर बनाने के लिए:
CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache);
if (err)
{
NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d");
}
जहां संदर्भ के लिए भेजा एक EAGLContext ओपन ES 2.0 के लिए कॉन्फ़िगर है।
मैं इस का उपयोग वीडियो स्मृति में IOS डिवाइस कैमरे से वीडियो फ्रेम रखने के लिए, और मैं निम्नलिखित कोड का उपयोग करते हैं:
CVPixelBufferLockBaseAddress(cameraFrame, 0);
CVOpenGLESTextureRef texture = NULL;
CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture);
if (!texture || err) {
NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err);
return;
}
outputTexture = CVOpenGLESTextureGetName(texture);
glBindTexture(GL_TEXTURE_2D, outputTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// Do processing work on the texture data here
CVPixelBufferUnlockBaseAddress(cameraFrame, 0);
CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0);
CFRelease(texture);
outputTexture = 0;
यह एक नया CVOpenGLESTextureRef, एक OpenGL ES बनावट का प्रतिनिधित्व करता है, से बनावट कैश। यह बनावट कैमरे द्वारा पारित CVImageBufferRef पर आधारित है। उस बनावट को तब CVOpenGLESTextureRef से पुनर्प्राप्त किया जाता है और इसके लिए निर्धारित उचित पैरामीटर (जो मेरी प्रसंस्करण में आवश्यक प्रतीत होता है)। अंत में, मैं बनावट पर अपना काम करता हूं और जब मैं कर रहा हूं तो साफ़ कर देता हूं।
यह तेज़ अपलोड प्रक्रिया आईओएस उपकरणों पर एक वास्तविक अंतर बनाती है। आईफोन 4 एस पर 9.0 एमएस से 1.8 एमएस तक एक 640x480 फ्रेम वीडियो के अपलोड और प्रसंस्करण को लिया गया।
मेरे पास heard that this works in reverse है, साथ ही, कुछ स्थितियों में glReadPixels()
के प्रतिस्थापन के लिए अनुमति दे सकता है, लेकिन मैंने अभी तक इसे आजमाया है।
यह वास्तव में एक शर्म की बात है कि छवि प्रसंस्करण के लिए ऐसा एक प्रभावी तरीका बहुत अच्छी तरह से प्रलेखित नहीं है।लेकिन आपके जैसे लोगों के लिए धन्यवाद कम अनुभव डेवलपर्स इसका भी उपयोग करने का प्रयास कर सकते हैं। – Pochi
क्या आप फोटो प्रीसेट के लिए काम कर रहे बनावट कैश प्राप्त करने में सक्षम थे? मुझे 'CVOpenGLESTextureCacheCreate' – Dex
@Dex - हाँ के लिए 'CFDictionaryRef कैश एट्रिब्यूट्स' पर कहीं भी कोई जानकारी नहीं मिली, हां, यह उसी फ़ोटो के साथ फोटो प्रीसेट के लिए काम करता है जैसा मैंने वीडियो फ्रेम के लिए उपयोग किया है। मेरे द्वारा उपयोग किए गए विकल्पों के साथ कोड के लिए मेरे उपरोक्त लिंकवर्क देखें। एक चेतावनी यह है कि आईफोन 4 पर, कैमरा उस डिवाइस पर अधिकतम बनावट आकार की तुलना में बड़े फ्रेम को कैप्चर कर सकता है। इन तस्वीरों को सीधे बनावट के रूप में संसाधित नहीं किया जा सकता है, इसलिए उनके साथ निपटने के लिए कुछ प्रकार की टाइलिंग की आवश्यकता होगी। मैं उस पर काम कर रहा हूँ। –