2011-10-25 13 views
5

मैं का उपयोग CVPixelBufferRef में डेटा पढ़ने के लिए कर रहा हूं। मैं AVAssetWriter में इनपुट के रूप में CVPixelBufferRef का उपयोग करता हूं। दुर्भाग्यवश पिक्सेल प्रारूपों का मिलान नहीं किया जा रहा है।पिक्सेल प्रारूप, सीवीपीक्सेलबफररफ और ग्ल्रैड पिक्सल

मुझे लगता है कि glReadPixelsRGBA प्रारूप जबकि AVAssetWriterARGB प्रारूप में पिक्सेल डेटा चाहता है में पिक्सेल डेटा लौटा रहा है। आरजीबीए से ARGB को परिवर्तित करने का सबसे अच्छा तरीका क्या है?

यहाँ क्या मैं अब तक की कोशिश की है:

ARGB = की तर्ज पर
  • सा हेरफेर (RGBA >> 8) | (RGBA < < 24)
  • एक मध्यवर्ती कदम

सा हेरफेर काम नहीं किया क्योंकि CVPixelBufferRef सबस्क्रिप्ट समर्थन करने के लिए प्रतीत नहीं होता है के रूप में एक CGImageRef का उपयोग कर। CGImageRef इंटरमीडिएट चरण काम करता है ... लेकिन मैं कोड की 50 अतिरिक्त लाइनों को नहीं रखना चाहूंगा जो संभावित रूप से प्रदर्शन हिट हो सकते हैं।

+2

आप अपने सीवीपीक्सेलबफररफ को कैसे प्राप्त कर रहे हैं?क्या आप सीवी पिक्सेलबफर क्रिएट को कॉल कर रहे हैं? यदि हां, तो आप pixelFormatType पैरामीटर के रूप में क्या गुजर रहे हैं? आप glReadPixels पर किस प्रारूप में जा रहे हैं? –

+0

मैं 'केवीवी पिक्सेलफॉर्मैट टाइप प्रकार 3232 जीबी 'को' सीवी पिक्सेलबफर क्रिएट 'में भेज रहा हूं। मैं 'GL_RBGA' को 'glReadPixels' में पास करता हूं। मैंने 'सीवी पिक्सेलबफर क्रेट' को आरबीजीए प्रारूप पास करने का प्रयास किया लेकिन यह काम नहीं किया (या तो खराब रंग या ऐप दुर्घटनाग्रस्त)। – MrDatabase

उत्तर

6

सीपीयू का उपयोग कर घटकों स्वैप करने के लिए किया जाएगा एक सरल टुकड़ा शेडर लिखने के लिए की तुलना में बेहतर करने के लिए कुशलतापूर्वक उस पर कर जीपीयू के रूप में आप छवि प्रस्तुत करते हैं।

और सबसे अच्छा सबसे अच्छा तरीका है IOS5 CoreVideo CVOpenGLESTextureCache का उपयोग कर प्रतिलिपि चरण को पूरी तरह से निकालना है जो आपको सीधे CVPixelBufferRef में प्रस्तुत करने की अनुमति देता है, जिससे glReadPixels पर कॉल को समाप्त किया जाता है।

पेज। मुझे पूरा यकीन है कि AVAssetWriter बीजीआरए प्रारूप में डेटा चाहता है (वास्तव में यह शायद इसे यूव में चाहता है, लेकिन यह एक और कहानी है)।

अद्यतन: लिंक के लिए के रूप में, doco अभी भी एनडीए के तहत हो रहा है, लेकिन वहाँ उपलब्ध स्वतंत्र रूप से डाउनलोड करने योग्य उदाहरण कोड के दो टुकड़े कर रहे हैं:

GLCameraRipple और RosyWriter

हेडर फाइल खुद को अच्छा प्रलेखन होते हैं, और मैक समकक्ष बहुत समान है (सीवीओपेनजीएलटेक्चर कैश), इसलिए आपको शुरू करने के लिए बहुत कुछ होना चाहिए।

+0

'ओपनजीएलटेक्चर कैश' बहुत बढ़िया लगता है। प्रासंगिक दस्तावेज़ों के लिए कोई लिंक है? – MrDatabase

+1

यदि आपके पास एडीसी लॉगिन है तो आप दस्तावेज़ प्राप्त कर सकते हैं, कुछ उदाहरण जोड़े –

+0

का जवाब देने के लिए कोड वास्तव में दिलचस्प लगता है! धन्यवाद :-) – MrDatabase

2

यह अंधेरे में एक शॉट है, लेकिन आपने GL_BGRAglReadPixelskCVPixelFormatType_32BGRACVPixelBufferCreate के साथ GL_BGRA पर कोशिश की है?

मुझे यह सुझाव है क्योंकि Technical Q&A QA1501 किसी भी आरजीबीए प्रारूप को समर्थित के रूप में सूचीबद्ध नहीं करता है।

+0

दुर्भाग्य से GL_BGRA को 'glReadPixels' में गुजरने से आउटपुट पिक्सेल डेटा शून्य हो जाता है :-( – MrDatabase

6

सा हेरफेर के बारे में, आप पिक्सेल बफर के कच्चे डेटा के लिए सूचक प्राप्त कर सकते हैं:

CVPixelBufferLockBaseAddress(buffer, 0); 
size_t stride = CVPixelBufferGetBytesPerRow(buffer); 
char *data = (char *)CVPixelBufferGetBaseAddress(buffer); 
for (size_t y = 0; y < CVPixelBufferGetHeight(buffer); ++y) { 
    uint32_t *pixels = (uint32_t *)(data + stride * y); 
    for (size_t x = 0; x < CVPixelBufferGetWidth(buffer); ++x) 
     pixels[x] = (pixels[x] >> 8) | (pixels[x] << 24); 
} 
CVPixelBufferUnlockBaseAddress(buffer, 0); 
1

glReadPixels (0, 0, w * s, h * s, GL_BGRA, GL_UNSIGNED_BYTE, बफर);

glReadPixels में GL_BGRA का उपयोग करें। यह काम करता है, बस इसे स्वयं कोशिश की।

+0

क्या आपको शून्य डेटा प्राप्त हुआ आउटपुट बफर में? – MrDatabase

+0

GL_BGRA ओपनजीएल त्रुटियों का भार बनाता है। – emrahgunduz

1
glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, _buffer); 
    CVPixelBufferRef buffer = NULL; 
    CVReturn ret = CVPixelBufferCreateWithBytes(kCFAllocatorDefault,_size.width,_size.height,kCVPixelFormatType_32BGRA,glubyte,_size.width*4,NULL,NULL,NULL,&buffer); 
संबंधित मुद्दे