Мой проект использует платформу GPUImage для обработки видео.Поскольку я использую несколько кадровых буферов для обработки изображения, я обнаружил, что GPUImageContext supportFastTextureUpload потребляет гораздо больше памяти, чем не использует его.(В видео 720p 15s, SupportFastTextureUpload потребляет до 500M, а не только 200M.)Он не может правильно обрабатывать различные форматы видео.
Дорожка актива с CVImageBufferYCbCrMatrix ITU_R_709_2 в порядке.
Дорожка актива с CVImageBufferYCbCrMatrix ITU_R_601_4 -> результирующее изображение разрывается.
*дорожка с formatName 'avc1' -> результат разрывается.
supportFastTextureUpload может обрабатывать их правильно, но я не могу избежать давления памяти.
Почему supportFastTextureUpload = false не может правильно прочитать другой видеокадр?
Или как решить проблему с памятью supportFastTextureUpload = true.
, если SupportFastTextureUploadустановлено в true.GPUImage использует CVOpenGLESTextureCacheCreateTextureFromImage для выделения двух текстур (luminanceTexture и chrominanceTexture), затем использует convertYUVToRGBOutput для их отрисовки в буфере кадра.
, если для SupportFastTextureUpload задано значение false.GPUImage fetchFramebuffer из кэша буфера кадров и привязка видеокадра непосредственно к текстуре буфера кадров.
//key codes of supportsFastTextureUpload set to true:
glActiveTexture(GL_TEXTURE4);
CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, [[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], movieFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef);
luminanceTexture = CVOpenGLESTextureGetName(luminanceTextureRef);
glBindTexture(GL_TEXTURE_2D, luminanceTexture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glActiveTexture(GL_TEXTURE5);
CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, [[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], movieFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef);
chrominanceTexture = CVOpenGLESTextureGetName(chrominanceTextureRef);
glBindTexture(GL_TEXTURE_2D, chrominanceTexture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
[self convertYUVToRGBOutput];
//key codes of supportsFastTextureUpload set to false:
outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(bufferWidth, bufferHeight) textureOptions:self.outputTextureOptions onlyTexture:YES];
glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]);
// Using BGRA extension to pull in video frame data directly
glTexImage2D(GL_TEXTURE_2D,
0,
self.outputTextureOptions.internalFormat,
bufferWidth,
bufferHeight,
0,
self.outputTextureOptions.format,
self.outputTextureOptions.type,
CVPixelBufferGetBaseAddress(movieFrame));