2015-04-01 6 views
0

Я пытаюсь получить мой взгляд из моего приложения (используя OpenGL) для записи в файл. Это, как я получаю OpenGL кадр:Выход видео ffmpeg ненасыщен

glBindTexture(GL_TEXTURE_2D, renderTexture->getTextureData()->glId);  
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 

Это прекрасно работает и имеет правильные цвета. (Я проверил это, показывая пиксели в один файл изображения).

Теперь, поскольку я хочу это в видео, я использую ffmpeg для кодирования. Это моя команда:

ffmpeg -r 24 -pix_fmt rgba -s 1280x720 -f rawvideo -y -i - -vf vflip -vcodec mpeg1video -q:v 4 -bufsize 500KB -maxrate 5000KB 

Это также «работает», но мое видео очень ненасыщенный по сравнению с фактическим входом он получает от OpenGL. Как я могу это решить? (если возможно, могу ли я сделать это, только изменив что-то в команде?)

+0

Вы должны использовать glReadPixels вместо перехода через glGetTexImage. Две причины: glGetTexImage не поддерживается OpenGL-ES и glReadPixels даже работает без необходимости проходить FBO, если вы хотите получить содержимое своего главного окна. – datenwolf

+0

@datenwolf благодарит за информацию. Я попробую это, но я не подозреваю, что это изменит результат работы ffmpeg – Dries

+1

Действительно, это не касается вашей проблемы, поэтому это комментарий. – datenwolf

ответ

0

Скорее всего, способ чтения ffmpeg пикселей не соответствует макету, который вы получаете из OpenGL. Используйте glPixelStorei с параметрами GL_PACK_ ..., чтобы выровнять макет OpenGL.

Другой проблемой могут быть цветовые пространства. Вы должны убедиться, что ffmpeg работает в том же цветовом пространстве, что и ваш контекст OpenGL. Если нет, вы должны определить цветовые пространства и добавить фильтр преобразования в цепочку обработки ffmpeg.

+0

Я добавил 'glPixelStorei (GL_PACK_ALIGNMENT, 1);' перед вызовом 'glBindTexture' и' glGetTexImage', но он ничего не меняет. Любая идея, как установить фильтр преобразования? (Я попытался с помощью '-pix_fmt', но я не могу найти тот, который его исправляет. Думаю, он должен быть преобразован из исходного RGBA в yuv420p) – Dries

+0

@Dries:' ffmpeg -pix_fmts' (обратите внимание на 's' at конец) перечисляет все пиксельные форматы ffmpeg. Однако некоторые форматы, такие как RGB, не определены. Например, существуют различные способы применения гамма-кривых, установки первичных точек и т. Д. Если вы действительно хотите быть в безопасности, сначала нужно преобразовать (используя OpenGL с шейдером) в контактное цветовое пространство (например, Lab или XYZ) и передать его в ffmpeg. Или сделайте преобразование в YUV444 (который также хорошо определен) и передайте это в ffmpeg. ffmpeg может сделать передискретизацию цвета для YUV422 для вас. – datenwolf

+0

Разве это не глупо, что я должен сделать это сам (если это действительно единственный вариант). Я бы догадался, что ffmpeg оборудована для борьбы с этим – Dries

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