使用OpenGL和X264更快地编码实时3D图形
-
13-12-2019 - |
题
我正在处理一个系统,该系统向客户端向客户端发送到客户端,只要在服务器中完成。 我已经有了代码,但我觉得它可能会更快(并且它已经是系统中的瓶颈)
这是我正在做的事情:
首先我抓住框架缓冲器
glReadBuffer( GL_FRONT );
glReadPixels( 0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer );
.
然后我翻转帧缓冲区,因为SWSScale存在奇怪的错误(我使用的是颜色空间转换),当我转换时垂直翻转图像。我提前翻转,没有任何花哨。
void VerticalFlip(int width, int height, byte* pixelData, int bitsPerPixel)
{
byte* temp = new byte[width*bitsPerPixel];
height--; //remember height array ends at height-1
for (int y = 0; y < (height+1)/2; y++)
{
memcpy(temp,&pixelData[y*width*bitsPerPixel],width*bitsPerPixel);
memcpy(&pixelData[y*width*bitsPerPixel],&pixelData[(height-y)*width*bitsPerPixel],width*bitsPerPixel);
memcpy(&pixelData[(height-y)*width*bitsPerPixel],temp,width*bitsPerPixel);
}
delete[] temp;
}
.
然后我将其转换为Yuv420p
convertCtx = sws_getContext(width, height, PIX_FMT_RGB24, width, height, PIX_FMT_YUV420P, SWS_FAST_BILINEAR, NULL, NULL, NULL);
uint8_t *src[3]= {buffer, NULL, NULL};
sws_scale(convertCtx, src, &srcstride, 0, height, pic_in.img.plane, pic_in.img.i_stride);
.
然后我几乎拨打了x264编码器。我已经使用了Zerolatency预设。
int frame_size = x264_encoder_encode(_encoder, &nals, &i_nals, _inputPicture, &pic_out);
.
我的猜测是应该有更快的方法来做这件事。捕获框架并将其转换为YUV420P。将其转换为GPU中的YUV420P很好,只有在将其复制到系统内存之后,希望有一种方法可以在不需要翻转的情况下进行颜色转换。
如果没有更好的方式,至少这个问题可能有助于某人试图这样做,以便这样做。
解决方案
首先,使用使用pbos的异步纹理。它是 example
但如果您真的想将视频编码到下一个级别,您可以通过cuda使用 nvidia codec库 .i最近问了同样的问题,所以这个可以有帮助。
不隶属于 StackOverflow