2012-02-21 3 views
3

Я разрабатываю видеопроигрыватель для iPhone. Я использую библиотеки ffmpeg для декодирования кадров видео, и я использую opengl 2.0 для рендеринга кадров на экран.CVOpenGLESTextureCacheCreateTextureFromImage из буфера uint8_t

Но мой метод визуализации очень медленно.

Пользователь сказал мне: iOS 5 включает в себя новый способ сделать это быстро. Хитрость заключается в использовании AVFoundation и привязки буфера основного видеосигнала непосредственно к тексту OpenGL.

Моя проблема теперь в том, что мой видеопроигрыватель отправляет методу визуализации тип uint8_t *, который я использую затем с glTexSubImage2D.

Но если я хочу использовать CVOpenGLESTextureCacheCreateTextureFromImage, мне нужен CVImageBufferRef с фреймом.

Вопрос: Как я могу создать CVImageBufferRef из буфера uint8_t?

Это мой метод визуализации:

- (void) render: (uint8_t*) buffer 

{
NSLog (@ "визуализацией");

[EAGLContext setCurrentContext:context]; 

glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); 
glViewport(0, 0, backingWidth, backingHeight); 

glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

// OpenGL loads textures lazily so accessing the buffer is deferred until draw; notify 
// the movie player that we're done with the texture after glDrawArrays.   
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, mFrameW, mFrameH, GL_RGB,GL_UNSIGNED_SHORT_5_6_5, buffer); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

[moviePlayerDelegate bufferDone]; 

glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); 
[context presentRenderbuffer:GL_RENDERBUFFER]; 

}

Спасибо,

ответ

0

Я пытаюсь сделать что-то подобное. Очевидно, вам нужно создать CVPixelBufferRef и заменить его на CVImageBufferRef. Т.е., сначала необходимо создать CVPixelBufferRef, как описано в here (для загрузки), а затем получить доступ к буферу пикселей:

CVPixelBufferLockBaseAddress(renderTarget, 0); 
_rawBytesForImage = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget); 

(код не мое).

0

Для фактического рабочего примера, показывающего, как видеоданные могут быть переданы непосредственно в представление OpenGL, см. Мой blog post по этому вопросу. Проблема с просмотром серии «фрагментов кода» в Интернете заключается в том, что вы не найдете фактических полных рабочих примеров для iOS.

Смежные вопросы