我需要将YUV转换为RGB,并且需要RGB值处于有限范围(16-235)之间。我尝试使用sws_scale函数来完成此任务。
您可以在下面看到我的代码。但是,转换后,我得到的黑色像素是(0, 0, 0),而不是(16, 16, 16)。
也许有一些选项可以告诉sws_scale函数计算有限范围。
您可以在下面看到我的代码。但是,转换后,我得到的黑色像素是(0, 0, 0),而不是(16, 16, 16)。
也许有一些选项可以告诉sws_scale函数计算有限范围。
AVFrame* frameRGB = avFrameConvertPixelFormat(_decodedBuffer[i].pAVFrame, AV_PIX_FMT_RGB24);
AVFrame* Decoder::avFrameConvertPixelFormat(const AVFrame* src, AVPixelFormat dstFormat) {
int width = src->width;
int height = src->height;
AVFrame* dst = allocPicture(dstFormat, width, height);
SwsContext* conversion = sws_getContext(width,
height,
(AVPixelFormat)src->format,
width,
height,
dstFormat,
SWS_FAST_BILINEAR,
NULL,
NULL,
NULL);
sws_scale(conversion, src->data, src->linesize, 0, height, dst->data, dst->linesize);
sws_freeContext(conversion);
dst->format = dstFormat;
dst->width = src->width;
dst->height = src->height;
return dst;
}
我也尝试使用公式手动将YUV像素转换为RGB像素,并且得到了正确的结果。从YUV(16,128,128)到RGB(16,16,16)。
cmpR = y + 1.402 * (v - 128);
cmpG = y - 0.3441 * (u - 128) - 0.7141 * (v - 128);
cmpB = y + 1.772 * (u - 128);