gpt4 book ai didi

FFMPEG:通过二进制 ffmpeg 和代码 C++ 将 RGB 转换为 YUV 给出不同的结果

转载 作者:行者123 更新时间:2023-12-04 23:29:06 25 4
gpt4 key购买 nike

我正在尝试使用 ffmpeg 将 RGB 帧(ppm 格式)转换为 YUV420P 格式。为了确保我的代码 C++ 是好的,我将输出与此命令创建的输出进行了比较(相同的文件管理器 BILINEAR):
ffmpeg -start_number 1 -i data/test512x512%d.ppm -sws_flags '双线性' -pix_fmt yuv420p data/test-yuv420p.yuv

我的代码:

static unsigned char *readPPM(int i)
{
FILE *pF;
unsigned char *imgRGB;
unsigned char *imgBGR;
int w,h;
int c;
int bit;
char buff[16];

char *filename;
asprintf(&filename,"test512x512%d.ppm",i);
pF = fopen(filename,"rb");
free(filename);

if (pF) {
if (!fgets(buff, sizeof(buff), pF)) {
return nullptr;
}
if (buff[0] != 'P' || buff[1] != '6') {
fprintf(stderr, "Invalid image format (must be 'P6')\n");
return nullptr;
}
c = getc(pF);
while (c == '#') {
while (getc(pF) != '\n') ;
c = getc(pF);
}
ungetc(c, pF);
// read size
if (fscanf(pF, "%d %d", &w, &h) != 2) {
fprintf(stderr, "Invalid image size (error loading '%s')\n", filename);
return nullptr;

}
//read bit
if (fscanf(pF, "%d", &bit) != 1) {
fprintf(stderr, "Invalid rgb component (error loading '%s')\n", filename);
exit(1);
}

imgRGB =(unsigned char*) malloc(3*h*w);
imgBGR =(unsigned char*) malloc(3*h*w);
//read pixel data from file
int length = fread(imgBGR, sizeof(unsigned char)*3, w*h, pF) ;
if (length != w*h) {
fprintf(stderr, "Error loading image '%s'\n", filename);
return nullptr;
}


int start=0;
for (i=0; i < HEIGHT*WIDTH;i++) {
imgRGB[start] = imgBGR[start];
imgRGB[start+2]= imgBGR[start+2];
imgRGB[start+1]= imgBGR[start+1];
start+=3;
}

fclose(pF);
free(imgBGR);
return imgRGB;
}
else {
return nullptr;
}
}

void Test_FFMPEG::FillFrame (uint8_t* pic, int index)
{

avpicture_fill((AVPicture*)RGBFrame, pic, AV_PIX_FMT_RGB24, encodeContext->width, encodeContext->height);

struct SwsContext* fooContext = sws_getContext(encodeContext->width, encodeContext->height,
PIX_FMT_RGB24,
encodeContext->width, encodeContext->height,
PIX_FMT_YUV420P,
SWS_BILINEAR , nullptr, nullptr, nullptr);
sws_scale(fooContext, RGBFrame->data, RGBFrame->linesize, 0, encodeContext->height, OrgFrame->data, OrgFrame->linesize);

OrgFrame->pts = index;
}

对比结果不好。 Y 和 V 略有不同,但在 U 中差异很大。我无法发布我的图像,但 Y 的一部分在 U 图像中。它使颜色发生了一点变化。

你能告诉我我的错误在哪里吗?谢谢

最佳答案

我对 ffmpeg 的默认值不肯定,但使用 SWS_BILINEAR | SWS_ACCURATE_RND应该会产生更好的结果。

关于FFMPEG:通过二进制 ffmpeg 和代码 C++ 将 RGB 转换为 YUV 给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27449177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com