логотипы и субтитры в обратном порядке с использованием ffmpeg и OpenGL в iOS 5.0 - PullRequest
0 голосов
/ 06 февраля 2012

Я использую ffmpeg для воспроизведения видео на iOS 5.0.В моем приложении с декодированными видеокадрами ffmpeg и используйте OpenGL для его отображения.

Но у меня есть проблема, я не решаю ее.Цепочки логотипов и субтитров видеоизображения отображаются в обратном порядке.Я думаю, что это проблема рендеринга OpenGL 2.0 или ffmpeg.

Можете ли вы сказать мне, что не так? И Как я могу это исправить?

Очень спасибо,

Редактировать: я изменяю свой метод prepareTExture следующим образом:

- (void) prepareTextureW: (GLuint) texW textureHeight: (GLuint) texH frameWidth: (GLuint) frameW frameHeight: (GLuint) frameH {

float aspect = (float)frameW/(float)frameH;
float minX=-1.f, minY=-1.f, maxX=1.f, maxY=1.f;
float scale ;
if(aspect>=(float)backingHeight/(float)backingWidth){
    // Aspect ratio will retain width.
    scale = (float)backingHeight / (float) frameW;
    maxY = ((float)frameH * scale) / (float) backingWidth;
    minY = -maxY;
} else {
    // Retain height.
    scale = (float) backingWidth / (float) frameW;
    maxX = ((float) frameW * scale) / (float) backingHeight;
    minX = -maxX;
}
if(frameTexture) glDeleteTextures(1, &frameTexture);
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &frameTexture);
glBindTexture(GL_TEXTURE_2D, frameTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texW, texH, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, NULL);          


 verts[0] = maxX;           
  verts[1] = maxY;
  verts[2] = minX;      
  verts[3] = maxY;
  verts[4] = maxX;  
  verts[5] = minY;
  verts[6] = minX;    
  verts[7] = minY;

float s = (float) frameW / (float) texW;
float t = (float) frameH / (float) texH;             

texCoords[0] = 0.f;        texCoords[1] = 1.f;
texCoords[2] = 1;          texCoords[3] = 1.f;
texCoords[4] = 0.f;        texCoords[5] =0;
texCoords[6] = 1;          texCoords[7] =0;

mFrameH = frameH;
mFrameW = frameW;
mTexH = texH;
mTexW = texW;
maxS = s;
maxT = t;

// Just supporting one rotation direction, landscape left.  Rotate Z by 90 degrees.
matSetRotZ(&rot,M_PI_2);

matMul(&mvp, &rot, &rot);
[self setupShader];    

}

А теперь это мой результат: изображение ссылки

1 Ответ

2 голосов
/ 06 февраля 2012

Но у меня есть проблема, я не решаю ее.Цепочки логотипов и субтитров видеоизображения отображаются в обратном порядке.

Зеркальное изображение целиком, а не только логотип цепи и субтитры.Выглядит как неправильные координаты текстуры для меня.Не могли бы вы опубликовать свой код для рисования?

РЕДАКТИРОВАТЬ из-за обновления вопроса

Фу Сначала я должен был понять, что вы там делаете, это слишком сложно.Просто используйте координаты текстуры 0 и 1, не пытайтесь перехитрить себя, вычисляя некоторые s, t.Следующий шаг.Не используйте перспективную проекцию, если вы не хотите визуализировать что-либо в перспективе.

При исходной проблеме.OpenGL предполагает, что источник изображения находится в левом нижнем углу, в то время как большинство форматов видео помещают источник в верхний левый угол.То, что вы сделали, это повернули картинку, но пока она повернута вертикально, она останется зеркальной.Вместо этого вы хотите отразить его вдоль текстурных координат T, что легко достигается использованием отрицательного значения для t.

...