任何人都可以帮助理解 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】:

对于平面数据,例如YUV420linesize[i] 包含i-th 平面的步幅。

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

在像素数据(RGB24)的情况下,只有一个平面(data[0])和linesize[0] == width * channels640 * 3RGB24

【讨论】:

嗨,在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[] 吗?的主要内容,如果未能解决你的问题,请参考以下文章

我的约束破坏日志没有任何意义,有人可以帮助我理解吗?

更好地理解 javascript 预编译

任何人都可以帮助以下链接修改光标

任何人都可以帮助 jquery 中的功能吗?

任何人都可以帮助我宽度颤振吗?

实际上我正在学习 Laravel,我需要一些高级资源。任何人都可以帮助我[关闭]