Ich möchte die Pixel des Bildes von der Kamera erhalten. Ich benutze CoreFoundation und OpenGL und ich kann das Bild rendern, aber ich möchte einige andere Dinge (an anderer Stelle/Thread) tun, also muss ich sie kopieren.Kopieren von Pixeln von Kamera-Eingang
Dies ist, was ich versucht habe: (Teil AVCaptureVideoDataOutputSampleBufferDelegate Methode)
CVImageBufferRef tmpPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(tmpPixelBuffer, 0);
//APPROACH A
CFRetain(tmpPixelBuffer);
if(pixelBuffer!= 0) CFRelease(pixelBuffer);
pixelBuffer = tmpPixelBuffer;
//create and bind textureHandle
if(m_textureHandle==0) m_textureHandle = [self _createVideoTextureUsingWidth:videoDimensions.width Height:videoDimensions.width];
glBindTexture(GL_TEXTURE_2D, m_textureHandle);
unsigned char *linebase = (unsigned char *)CVPixelBufferGetBaseAddress(tmpPixelBuffer);
//APPROACH B
unsigned size = videoDimensions.width*videoDimensions.height*4;//since its BGRA
unsigned char *imageData = malloc(size);
memcpy(linebase, imageData, size);
free(imageData);
//map the texture
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, videoDimensions.width, videoDimensions.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, linebase);
CVPixelBufferUnlockBaseAddress(tmpPixelBuffer, 0);
Im Ansatz AI das Loch Puffer zu behalten haben versucht, so kann ich später die Pixel kopiert werden, wenn nötig, aber ich bekomme immer ein NULL Zeiger (Ich weiß nicht warum)
In Ansatz BI versuchen Sie, die Pixel jedes Mal zu kopieren, aber ich dann OpenGL Renderer wird ein schwarzes Bild zeigen. Ich weiß nicht warum, ich ändere nicht den ursprünglichen Puffer bin ich?
Vielen Dank im Voraus;)
Ignacio
Sie haben Recht, aber selbst wenn ich die Erinnerung vor der Hand malloc und frei in Dealloc-Methode bekomme ich immer noch einen schwarzen Bildschirm. Ich habe erkannt, dass, wenn ich Ansatz B nach glTexSubImage2D setzen wird es den Rahmen rendern wird, aber ich frage mich warum? Ich handle nicht mit den Originaldaten. Ich kopiere es. – nacho4d
Ihr Aufruf an memcpy oben überschreibt tatsächlich den Inhalt des Pixelpuffers mit Ihrem neu zugewiesenen Speicher. Die Signatur lautet void * memcpy (void * Ziel, const void * source, size_t num); –