确定 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
我正在尝试使用以下代码行将视频帧的 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