之前我成功打开,解码并保存了.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);
}
答案 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 / 2
或width / 2
是错误的,因为你应该向上舍入而不是向下,但这是相对较小的。