如何解决sws_scale,YUV 到 RGB 的转换
我需要将 YUV 转换为 RGB。我还需要 RGB 值在有限范围内 (16-235)。 我尝试使用 sws_scale 函数来完成此任务。
我的代码你可以在下面看到。但是转换后我得到的黑色像素是 (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,dstFormat,SWS_FAST_BILINEAR,NULL,NULL);
sws_scale(conversion,src->data,src->linesize,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) 我得到了 (16,16) RGB。
cmpR = y + 1.402 * (v - 128);
cmpG = y - 0.3441 * (u - 128) - 0.7141 * (v - 128);
cmpB = y + 1.772 * (u - 128);
解决方法
您可以将源格式设为“全尺寸”YUVJ。
据我所知,sws_scale 没有选择 Studio RGB 作为输出格式的选项。
改变输入格式是我能想到的最好的解决方案。
“JPEG:YUV -> RGB”的颜色转换formula和你帖子里的公式一样。
设置源格式的示例:
- 如果
src->format
为PIX_FMT_YUV420P
,请将格式设置为PIX_FMT_YUVJ420P
。 - 如果
src->format
为PIX_FMT_YUV422P
,请将格式设置为PIX_FMT_YUVJ422P
。 - 如果
src->format
为PIX_FMT_YUV444P
,请将格式设置为PIX_FMT_YUVJ444P
。 - 如果
PIX_FMT_YUV440P
,请使用PIX_FMT_YUVJ440P
。
我知道该解决方案并未涵盖所有可能性,并且可能有一些输出像素超出了 [16,235] 的范围,因此这不是最通用的解决方案...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。