CVOpenGLESTextureCacheCreateTextureFromImage из буфера uint8_t - PullRequest
3 голосов
/ 21 февраля 2012

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

Но мой метод рендеринга очень медленный.

Пользователь сказал мне: iOS 5 включает новый способ сделать это быстро. Хитрость заключается в том, чтобы использовать AVFoundation и связать пиксельный буфер Core Video непосредственно с текстурой 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];

}

Спасибо,

Ответы [ 2 ]

0 голосов
/ 06 ноября 2015

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

0 голосов
/ 01 июня 2012

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

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

(Код не мой).

...