确定 FFMPEG 的 AVFrame 中数据 [0] 的大小

Determining size of data[0] in AVFrame of FFMPEG

我正在尝试使用以下代码行将视频帧的 AVFrame->data[0] 分配给 uint8_t* 缓冲区:

size_t sizeOfFrameData = mpAVFrameInput->linesize[0] * mpAVFrameInput->height;
        
memcpy(mFrameData, mpAVFrameInput->data[0], sizeOfFrameData);

我想知道这是否是将帧数据复制到 FFMPEG 中的 uint8_t* 变量的正确方法?

获取缓冲区大小:

int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height);

要复制像素数据:

int avpicture_layout(const AVPicture *src, enum AVPixelFormat pix_fmt,
                     int width, int height,
                     unsigned char *dest, int dest_size);

鉴于 avpicture_get_size() 已弃用,这可以通过以下方式实现:

int numBytes = av_image_get_buffer_size(
    enum AVPixelFormat
    int width,
    int height,
    int align
    );

请注意,通常使用 32 的对齐值,我看到帖子使用 1 位可能会导致帧失真;

但是可以使用以下方式填充帧缓冲区数据(即没有大小信息):

int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4],
                         const uint8_t *src,
                         enum AVPixelFormat pix_fmt, int width, int height, int align);

avpicture_* API 现已弃用。相反,使用 av_image_fill_plane_sizes 来获取每个平面的大小(data[0] 数组的大小)。

int av_image_fill_plane_sizes   (
size_t  size[4],
enum AVPixelFormat  pix_fmt,
int     height,
const ptrdiff_t     linesizes[4] 
)   

请注意,linesizes 应先转换为 ptrdiff_t (long long*)

您可以在这里找到更多信息:https://www.ffmpeg.org/doxygen/trunk/group__lavu__picture.html