C语言 使用ffmpeg libavfilter提取亮度数据,特别是PIX_FMT_YUV420P类型



这属于ffmpeg 0.7(是的,我知道它是旧的,但数据访问应该是类似的)。

我正在写一个libavfilter来从每帧提取亮度数据。在draw_slice()函数中,我可以访问AVFilterLink结构,这反过来又让我访问具有uint8_t *data[]指针的AVFilterBufferRef结构。对于PIX_FMT_YUV420P类型,我认为data[0]、data[1]、data[2]分别指Y、V通道。

我的问题是,指针指向数据[0](亮度平面),我如何解释数据?pixfmt.h头文件声明:

PIX_FMT_YUV420P,///& lt;平面YUV 4:2:0, 12bpp, (1cr &每2x2个Y个样本Cb个样本)

这是否意味着我必须每2个字节解释亮度平面数据?此外,指针指向的值的数据类型究竟是什么- int, float等?

Thanks in advance

是data[0]为亮度。它是每像素8位(一个字节)。但是你必须看着线前进。

查看循环中的每个像素:

uint8_t pixval;
for(int y = 0 ; y < height; ++y )
{
    for(int x = 0 ; x < width; ++x )
    {
        pixval = data[0][x+(y*stride)];
    }
}

(显然,您可以优化它)

U和V平面的分辨率是Y平面的四分之一(高度和宽度各占一半)。所以每个字节是4像素(2宽2高)。

最新更新