有人可以帮忙理解AVFrame.linesize[]吗?

29

我试图找到AVFrame.linesize[]的每个单元格的含义,但没有找到。

据我所知,linesize [0]是宽度,linesize [1]是高度。

  1. 如果我理解正确,其他单元格表示什么?
  2. 为什么在avcodec_decode_video2(codecCtxDecode,frameDecoded,& frameFinished,&packet);之后只有linesize [0]有值,而其他单元格总是为0?

更新

我认为AVFrame.data [i]AVFrame.linesize [i]是一行中特定颜色的数据和长度,我的理解是否正确?

2个回答

44

对于平面数据,如YUV420linesize[i]包含第i个平面的步幅。

例如,对于帧640x480data[0] 包含指向Y分量的指针,data[1]data[2]包含指向UV平面的指针。 在这种情况下,linesize[0] == 640linesize[1] == linesize[2] == 320(因为UV平面小于Y平面的一半)

对于像素数据(RGB24),只有一个平面(data [0]),linesize[0] == width * channels (对于RGB24640 * 3


你好,经过avcodec_decode_video2(dc, yuvFrame, &got_picture, &h264packet);之后,如果我打印linesize,它并不像你所说的那样。为什么linesize这么大(一个8位数)? - nmxprime
2
这段代码非常老,但它是一个指向数组的指针,而不是整数,所以它是一个巨大的8位数字。 - Matt Wolfe
2
如果我有一个分辨率为500x500的YUV420p帧,为什么linesize[0] == 512 - Benjamin Crawford Ctrl-Alt-Tut
1
@BenjaminCrawfordCtrl-Alt-Tut 每个 Y 平面中的下一行始于前一个偶数行的 512 字节之后,即使它只包含 500 个有效字节。 - pogorskiy
linesize[0] 可能大于宽度。也请检查此链接 https://stackoverflow.com/a/57666844/3871242 - Minnie
显示剩余2条评论

13

请查看视频帧格式的描述:

您会发现,这些格式被分成两大组:紧凑型和平面型,具体取决于组件是分开还是交错保存。对于这两种格式,步幅的含义略有不同,基本上它们是您需要跳过的字节数,以便按行前进。


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