我想尽快将opengl帧缓冲数据传输到AVCodec。
我已经使用着色器将RGB转换为YUV并使用glReadPixels读取
我仍然需要手动填充AVFrame数据。还有更好的办法吗?
AVFrame *frame;
// Y
frame->data[0][y*frame->linesize[0]+x] = data[i*3];
// U
frame->data[1][y*frame->linesize[1]+x] = data[i*3+1];
// V
frame->data[2][y*frame->linesize[2]+x] = data[i*3+2];
答案 0 :(得分:0)
您可以使用sws_scale
。
实际上,您不需要着色器来转换RGB-> YUV。相信我,它不会有非常不同的表现。
swsContext = sws_getContext(WIDTH, HEIGHT, AV_PIX_FMT_RGBA, WIDTH, HEIGHT, AV_PIX_FMT_YUV, SWS_BICUBIC, 0, 0, 0 );
sws_scale(swsContext, (const uint8_t * const *)sourcePictureRGB.data, sourcePictureRGB.linesize, 0, codecContext->height, destinyPictureYUV.data, destinyPictureYUV.linesize);
destinyPictureYUV
中的数据将准备好转到编解码器。
在此示例中,destinyPictureYUV是您要填充的AVFrame
。尝试这样设置:
AVFrame * frame;
AVPicture destinyPictureYUV;
avpicture_alloc(&destinyPictureYUV, codecContext->pix_fmt, newCodecContext->width, newCodecContext->height);
// THIS is what you want probably
*reinterpret_cast<AVPicture *>(frame) = destinyPictureYUV;
使用此设置,如果您愿意,您还可以填写已经转换为YUV的数据......您可以选择所需的方式。