在avcodec_decode_video2之后正确转储yuv值的方法

时间:2017-06-27 16:49:38

标签: ffmpeg

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

self.validates

通话结束后, avcodec_decode_video2(decoderCtx, pictYUV, &gotPicture, &packet) 的值为AV_PIX_FMT_YUV420P。

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

pictYUV->format

对于640x480的输入尺寸,当查看文件时(使用ImageMagick显示实用程序),图像是预期的。

但是,对于864x480的输入尺寸,图像似乎已损坏。

有趣的是,如果我通过sws_scale运行pictYUV,并转储生成的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);

我所需要的只是yuv数据。我希望我可以避免额外调用sws_scale。想知道我错过了什么。问候。

1 个答案:

答案 0 :(得分:2)

  

我将原始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);

填充行,写入每行(大小为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;
    }
}

然后使用以下方法编写飞机:

writePlane(f, pictYUV->data[0], pictYUV->linesize[0], w, h);
writePlane(f, pictYUV->data[1], pictYUV->linesize[1], w / 2, h / 2);
writePlane(f, pictYUV->data[2], pictYUV->linesize[2], w / 2, h / 2);