我正在尝试使用 libav 将 RGB 图像数据的向量(源自 .png 图像)转换为 YUV420p 格式。
在 libav 示例代码中,以下内容用于创建虚拟图像:
/* prepare a dummy image */
static void fill_yuv_image(AVFrame *pict, int frame_index, int width, int height)
{
int x, y, i;
i = frame_index;
/* Y */
for(y=0;y<height;y++) {
for(x=0;x<width;x++) {
pict->data[0][y * pict->linesize[0] + x] = x + y + i * 3;
}
}
/* Cb and Cr */
for(y=0;y<height/2;y++) {
for(x=0;x<width/2;x++) {
pict->data[1][y * pict->linesize[1] + x] = 128 + y + i * 2;
pict->data[2][y * pict->linesize[2] + x] = 64 + x + i * 5;
}
}
}
我不清楚这里的一些事情:
首先,我是否需要重新排列输入向量中的 RGB 数据,使其适合编码为 YUV420p?
其次,我知道每个像素都有一个 Y 值,而 Cb 和 Cr 值用于四个 (2x2) 像素。我不明白的是 RGB 数据是如何“减少”到 Cb 和 Cr 值的——有没有一个例子说明如何在任何地方做到这一点?