任何人都可以帮助理解 AVFrame.linesize[] 吗?
Posted
技术标签:
【中文标题】任何人都可以帮助理解 AVFrame.linesize[] 吗?【英文标题】:Can anyone help in understanding AVFrame.linesize[]? 【发布时间】:2012-10-28 11:18:40 【问题描述】:我试图找出AVFrame.linesize[]
的每个单元格的含义,但没有找到。
据我了解,linesize[0]
是宽度,linesize[1]
是高度。
-
如果我是对的,其他单元格是什么意思?
为什么在
avcodec_decode_video2(codecCtxDecode, frameDecoded, &frameFinished, &packet);
之后只有linesize[0]有值,而其他单元格总是0?
更新
我认为 AVFrame.data[i] 和 AVFrame.linesize[i] 是行中特定颜色的数据和行的长度,对吗?
【问题讨论】:
【参考方案1】:对于平面数据,例如YUV420
,linesize[i]
包含i
-th 平面的步幅。
例如,对于框架 640x480
data[0]
包含指向 Y
组件的指针,data[1]
和 data[2]
包含指向 U
和 V
平面的指针。在这种情况下,linesize[0] == 640
、linesize[1] == linesize[2] == 320
(因为U
和V
平面小于Y
平面的一半)
在像素数据(RGB24
)的情况下,只有一个平面(data[0]
)和linesize[0] == width * channels
(640 * 3
为RGB24
)
【讨论】:
嗨,在avcodec_decode_video2(dc, yuvFrame, &got_picture, &h264packet);
之后,如果我打印linesize
,则与您所说的不同。为什么 linesize 这么大(一个大的 8 位数字)?
这是一个超级旧的,但它是一个巨大的 8 位数字的原因是因为它是一个指向数组的指针,而不是一个整数。
如果我有一个分辨率为500x500的YUV420p帧,linesize[0] == 512
怎么办?
@BenjaminCrawfordCtrl-Alt-Tut Y 平面中的每一行在前一行之后的 512 个字节开始,即使它包含 500 个有效字节
linesize[0] 可能大于宽度。也检查一下这个***.com/a/57666844/3871242【参考方案2】:
查看视频帧格式的说明:
YUV pixel formats Video Media Types - Image Stride您会看到格式分为两大类:打包和平面,具体取决于组件是分开保存还是交错保存。步幅对它们的含义略有不同,基本上它们是您需要跳过的字节数才能前进。
【讨论】:
以上是关于任何人都可以帮助理解 AVFrame.linesize[] 吗?的主要内容,如果未能解决你的问题,请参考以下文章