gpt4 book ai didi

c - 帧数据如何存储在 libav 中?

转载 作者:行者123 更新时间:2023-12-04 23:07:39 27 4
gpt4 key购买 nike

我正在尝试学习使用 libav。我遵循了 dranger.com 上的第一个教程,但有一次我有点困惑。

// Write pixel data
for(y=0; y<height; y++)
fwrite(pFrame->data[0]+y*pFrame->linesize[0], 1, width*3, pFile);
这段代码显然有效,但我不太明白为什么,特别是我不明白 pFrame->data 中的帧数据如何存储,是否取决于使用的格式/编解码器,为什么 pFrame->datapFrame->linesize总是在索引 0 处引用,以及为什么我们将 y 添加到 pFrame->data[0] .
在教程中它说

We're going to be kind of sketchy on the PPM format itself; trust us, it works.


我不确定是否将其写入 ppm 格式是导致此过程对我来说如此奇怪的原因。任何有关此代码为何如此以及 libav 如何存储帧数据的说明都将非常有帮助。一般来说,我对媒体编码/解码不是很熟悉,因此我想学习。

最佳答案

particularly I don't understand how the frame data in pFrame->data stored, whether or not it depends on the format/codec in use


是的,这取决于 pix_fmt值(value)。有些格式是平面的,有些则不是。

why pFrame->data and pFrame->linesize is always referenced at index 0,


如果查看结构,您会看到 data是一个指针数组/一个指向指针的指针。所以 pFrame->data[0]是指向第一个“平面”中数据的指针。一些格式,如 RGB,有一个单一平面,所有数据都存储在一个缓冲区中。 YUV 等其他格式对每个平面使用单独的缓冲区。例如 Y = pFrame->data[0], U = pFrame->data[1], pFrame->data[3]音频每个 channel 可以使用一个平面,等等。

and why we are adding y to pFrame->data[0].


因为该示例是从上到下逐行循环图像。
要获得指向任何行的第一个像素的指针,请将 linesize 乘以行号,然后将其添加到指针。

关于c - 帧数据如何存储在 libav 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62815203/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com