【问题标题】:Determining size of data[0] in AVFrame of FFMPEG确定 FFMPEG 的 AVFrame 中 data[0] 的大小
【发布时间】:2015-03-27 09:55:38
【问题描述】:

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

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

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

【问题讨论】:

  • 您是否尝试过它是否有效(即编译并获得预期的输出)?
  • 虽然程序正在编译但没有得到预期的输出
  • 那么这很可能不是正确的方法(假设您的代码中没有其他错误)。
  • 这对于非平面格式是正确的。对于平面格式(如 YUV),您需要对其他平面执行相同操作。

标签: c++ ffmpeg sizeof memcpy


【解决方案1】:

获取缓冲区大小:

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);

【讨论】:

    【解决方案2】:

    鉴于 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);
    

    【讨论】:

      【解决方案3】:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-19
        • 2017-02-12
        • 2015-09-24
        • 2010-11-06
        • 1970-01-01
        • 2015-05-29
        • 1970-01-01
        相关资源
        最近更新 更多