如何在不指定像素格式的情况下从AVFrame.data[]和AVFrame.linesize[]中获取原始帧数据?

15

我大概了解到frame.data[]的解释方式取决于视频的像素格式(RGB或YUV)。但是有没有一种通用的方法可以获取帧中的所有像素数据?我只想计算帧数据的哈希值,而不需要将其解释为显示图像。

根据AVFrame.h:

uint8_t* AVFrame::data[AV_NUM_DATA_POINTERS]

指向图片/通道平面的指针。

int AVFrame::linesize[AV_NUM_DATA_POINTERS]

对于视频,每个图像线的字节数大小。

这是否意味着如果我只从data[i]提取linesize[i]字节,那么我就能获得有关帧的完整像素信息?

2个回答

15

linesize[i] 包含第 i 个平面的步长。

要获取整个缓冲区,请使用来自 avcodec.h 的函数。

/**
 * Copy pixel data from an AVPicture into a buffer, always assume a
 * linesize alignment of 1. */   
int avpicture_layout(const AVPicture* src, enum AVPixelFormat pix_fmt,
                 int width, int height,
                 unsigned char *dest, int dest_size);
int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height);

计算所需的缓冲区大小。


谢谢,这就是我想要的 :D 顺便问一下,plane 是指一个色道,比如 R/G/B 还是 Y/U/V?我试着搜索了一下定义,但是用这些关键词没有得到太多信息。 - vivienlwt
为什么我们可以手动复制,而不使用avpicture_layout,例如for(垂直线数[]){内存复制到缓冲区并将缓冲区指针增加linesize}就能完成任务? - nmxprime
我认为你可以在这里将AVFrame强制转换为AVPicture,因为AVFrame包含与AVPicture相同的字段。另请参阅严格别名规则:https://dev59.com/43VD5IYBdhLWcg3wE3Ro - Ciro Santilli OurBigBook.com

1

avpicture_* API已经被弃用。现在你可以使用av_image_copy_to_buffer()av_image_get_buffer_size()来获取图像缓冲区。

你还可以通过使用AVFrame::data[]来避免创建新的缓冲区内存,每个数组/平面的大小可以从av_image_fill_plane_sizes()中获取。只有当你清楚地了解像素格式时才这样做。

更多信息请参考:https://www.ffmpeg.org/doxygen/trunk/group__lavu__picture.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接