保存原始YUV420P帧FFmpeg / Libav

时间:2016-03-11 14:09:31

标签: ffmpeg yuv libav

之前我成功打开,解码并保存了.mp4文件中的帧。原始框架采用YUV420P格式,我使用RGB24函数转换为sws_scale()并将其保存到.ppm文件中。我现在要做的是将原始解码帧保留在YUV420P中,或将我得到的帧转换为YUV420P,以确保它们位于YUV420P。但问题是我不知道应该使用哪种类型的文件,我猜.yuv?另一个问题是我也不知道如何保存YUV420P数据。

我过去常常在RGB24中保存.ppm

for (y = 0; y < height; y++)
{
fwrite(frame->data[0] + y*frame->linesize[0], 1, width * 3, pf);
}

由于我只使用了1架飞机,因此工作正常。但YUV420P使用3个平面(Y,Cb,Cr)。我试图做的是首先保存Y分量,然后保存Cb / Cr。

for (y = 0; y < height; y++)
{
    fwrite(frame->data[0] + y*frame->linesize[0], 1, width, pf);
}

for (y = 0; y < height / 2; y++)
{
    fwrite(frame->data[1] + y*frame->linesize[1], 1, width, pf);
    fwrite(frame->data[2] + y*frame->linesize[2], 1, width, pf);
}

但是你可以猜到这根本不起作用。实际上它确实如此,但它只保存Y分量。有人能引导我走向正确的方向吗?

修改 我已经像你说的那样改变了我的saveFrame()函数,但是我使用的是平面的交错色度写法。但是,我仍然只得到Y分量图片(黑白色)。

fprintf(pf, "P5\n%d %d\n255\n", width, height);

for (y = 0; y < height; y++)
{
    fwrite(frame->data[0] + y*frame->linesize[0], 1, width, pf);
}

for (y = 0; y < height / 2; y++)
{
    fwrite(frame->data[1] + y*frame->linesize[1], 1, width / 2, pf);
}

for (y = 0; y < height / 2; y++)
{
    fwrite(frame->data[2] + y*frame->linesize[2], 1, width / 2, pf);
}

1 个答案:

答案 0 :(得分:1)

您的色度代码错误:

for (y = 0; y < height / 2; y++)
{
    fwrite(frame->data[1] + y*frame->linesize[1], 1, width / 2, pf);
    fwrite(frame->data[2] + y*frame->linesize[2], 1, width / 2, pf);
}

我还声称height / 2width / 2是错误的,因为你应该向上舍入而不是向下,但这是相对较小的。