2016-03-25 176 views
1

我收到來自[_videoOutput copyPixelBufferForItemTime:[_ playerItem currentTime] itemTimeForDisplay:nil]的CVPixelBuffer;我這個pixelbuffer轉移到CVOpenGLESTextureCacheCreateTextureFromImage函數來創建亮度紋理或鍍鉻質感OpenGLES 3 Error at CVOpenGLESTextureCacheCreateTextureFromImage -6683

// Y-plane 
glActiveTexture(GL_TEXTURE0); 
err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,_videoTextureCache, pixelBuffer, NULL, GL_TEXTURE_2D, GL_RED_EXT,width, height, GL_RED_EXT, GL_UNSIGNED_BYTE, 0, &outTexture); 
if (err) { 
    NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err); 
} 
當我使用OpenGLES 2.0

,它的工作,但改爲OpenGLES 3.0,它會失敗並打印一些錯誤象下面這樣:

錯誤在CVOpenGLESTextureCacheCreateTextureFromImage -6683 未能創建IOSurface圖像(紋理)

OpenGLES 3.0/2.0代碼:

_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3]; 

if (!_context) { 
    _context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 
    if (!_context) { 
     NSLog(@"Failed to create ES context"); 
    } 
    _openGLESVer = OpenGLESVersion2; 
} 

回答

1

當使用OpenGL ES 3.0,你需要GL_LUMINANCE更換GL_RED_EXT,考慮下面的代碼(我在我的應用程序使用它前一年),它應該工作只有pixelBuffer是yuv420sp是否齊全或視頻範圍。請注意,CVOpenGLESTextureCacheCreateTextureFromImage不適用於yuv420p。 // Y-plane glActiveTexture(GL_TEXTURE0); err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,_videoTextureCache, pixelBuffer, NULL, GL_TEXTURE_2D, GL_LUMINANCE,width, height, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &outTexture);

+0

什麼是核心視頻中的yuv420sp常量? –

相關問題