什么是最好的填充方式AVFrame.data
What is the best way to fill AVFrame.data
我想尽快将 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];
您可以使用 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
中的数据将准备好进入编解码器。
在此示例中,destinationPictureYUV 是您要填充的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;
使用此设置,如果需要,您还可以填充已在 GPU 中转换为 YUV 的数据...您可以选择所需的方式。
我想尽快将 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];
您可以使用 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
中的数据将准备好进入编解码器。
在此示例中,destinationPictureYUV 是您要填充的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;
使用此设置,如果需要,您还可以填充已在 GPU 中转换为 YUV 的数据...您可以选择所需的方式。