2015-04-01 81 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 2015-04-01 10:05:51

+0

@datenwolf感谢您的信息。我会尝试,但我不怀疑这会改变从ffmpeg – Dries 2015-04-01 10:08:22

+1

的输出确实它不能解决你的问题,因此这是一个评论。 – datenwolf 2015-04-01 10:08:54

回答

0

最有可能的ffmpeg的方式读取像素不匹配你走出的OpenGL的布局。使用glPixelStorei和GL_PACK_ ...参数来锁定OpenGL发出的布局。

另一个问题可能是色彩空间。您必须确保ffmpeg在与OpenGL上下文相同的颜色空间中运行。如果没有,您必须确定色彩空间并将转换过滤器添加到ffmpeg的处理链中。

+0

我在'glBindTexture'和'glGetTexImage'调用之前添加了'glPixelStorei(GL_PACK_ALIGNMENT,1);',但它似乎没有改变任何东西。任何想法如何设置转换过滤器? (我试过用'-pix_fmt'但我无法找到一个修复它,我想这应该从原来的RGBA转换为YUV420P。) – Dries 2015-04-01 10:16:24

+0

@Dries:'ffmpeg的-pix_fmts'(注意在's'最后)列出了ffmpeg可以理解的所有像素格式。然而,像RGB这样的格式并没有很好的定义。例如,有不同的方法来应用伽马曲线,设置主要点等。如果你真的想要安全起见,你应该首先将(使用OpenGL和着色器)转换为联系色彩空间(如Lab或XYZ)并将其传递给ffmpeg。或者转换到YUV444(这也是很好的定义)并将其传递给ffmpeg。 ffmpeg可以为你做YUV422的色度二次采样。 – datenwolf 2015-04-01 12:32:02

+0

我不得不亲自去做这件事(如果这确实是唯一的选择)。我会猜想ffmpeg有处理这个 – Dries 2015-04-01 13:35:16