Ffmpeg avcodec\u decode\u VIDEO 2后转储yuv值的正确方法

Ffmpeg avcodec\u decode\u VIDEO 2后转储yuv值的正确方法,ffmpeg,Ffmpeg,我正在解码H.265原始数据: avcodec_decode_video2(decoderCtx, pictYUV, &gotPicture, &packet) 调用后,pictYUV->format的值如预期的那样为AV_PIX_FMT_YUV420P 我将原始yuv值转储到文件中,如下所示: fwrite(pictYUV->data[0], 1, w*h, f); fwrite(pictYUV->data[2], 1, w*h/4, f); fwrite(pi

我正在解码H.265原始数据:

 avcodec_decode_video2(decoderCtx, pictYUV, &gotPicture, &packet)
调用后,
pictYUV->format
的值如预期的那样为AV_PIX_FMT_YUV420P

我将原始yuv值转储到文件中,如下所示:

fwrite(pictYUV->data[0], 1, w*h, f);
fwrite(pictYUV->data[2], 1, w*h/4, f);
fwrite(pictYUV->data[1], 1, w*h/4, f);
fwrite(pictYUV->data[0], 1, w*h, f);
fwrite(pictYUV->data[2], 1, w*h/4, f);
fwrite(pictYUV->data[1], 1, w*h/4, f);
对于输入大小为640x480的文件,当查看文件时(使用ImageMagick显示实用程序),图像是预期的图像

但是,对于864x480的输入大小,图像似乎已损坏

有趣的是,如果我通过sws_scale运行pictYUV,并转储结果yuv输出,则图像看起来很好

sws_scale(swsCtx, pictYUV->data, pictYUV->linesize, 0, pictYUV->height,
  pictNewYUV->data, pictNewYUV->linesize);
我只需要你的数据。我希望我能避免额外的sws_规模呼叫。想知道我错过了什么。问候

我将原始yuv值转储到文件中,如下所示:

fwrite(pictYUV->data[0], 1, w*h, f);
fwrite(pictYUV->data[2], 1, w*h/4, f);
fwrite(pictYUV->data[1], 1, w*h/4, f);
fwrite(pictYUV->data[0], 1, w*h, f);
fwrite(pictYUV->data[2], 1, w*h/4, f);
fwrite(pictYUV->data[1], 1, w*h/4, f);
填充行,写入每一行(亮度为
w
或色度为
w/2
),然后通过
data->linesize[n]
增加数据指针,其中
n
是平面索引:

static void writePlane(FILE *f, uint8_t *data, ptrdiff_t linesize,
                       int w, int h)
{
    for (int y = 0; y < h; y++) {
        fwrite(data, 1, w, f);
        data += linesize;
    }
}

嗯。现在我觉得自己很愚蠢。非常感谢你的帮助。