FFMPEG中分配图像内存以及初始化的函数用法

前面分析了ffmpeg中结构体AVFrame的使用方法,在网上看到一些相关的其他内容,整理以下。

一、ffmpeg中av_image_alloc()是这样定义的。此函数的功能是按照指定的宽、高、像素格式来分析图像内存。

参数说明:

  1. pointers[4]:保存图像通道的地址。如果是RGB,则前三个指针分别指向R,G,B的内存地址。第四个指针保留不用

  2. linesizes[4]:保存图像每个通道的内存对齐的步长,即一行的对齐内存的宽度,此值大小等于图像宽度。

  3. w: 要申请内存的图像宽度。

  4. h: 要申请内存的图像高度。

  5. pix_fmt: 要申请内存的图像的像素格式。

  6. align: 用于内存对齐的值。

  7. 返回值:所申请的内存空间的总大小。如果是负值,表示申请失败。

FFMPEG在使用AVFrame保存解码后的yuv图片和图片参数,其yuv存储格式是yuv420sp,先存y值,然后是uv值。那么有效的通道数只有2。但是如果解码后的yuv值有颜色空间的转换,比如rgb,那么图片数据的存储通道数是3。

二、另一种同样功能的函数调用方法

  1. int image_buf_size = av_image_get_buffer_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height, 1); //计算指定像素格式、图像宽、高所需要的对齐的内存大小

  2. out_buffer = (unsigned char *)av_malloc(image_buf_size); //分配指定大小的内存空间

av_image_get_buffer_size()函数的作用是通过指定像素格式、图像宽、图像高来计算所需的内存大小。

重点说明一个参数align:此参数是设定内存对齐的对齐数,也就是按多大的字节进行内存对齐。比如设置为1,表示按1字节对齐,那么得到的结果就是与实际的内存大小一样。再比如设置为4,表示按4字节对齐。也就是内存的起始地址必须是4的整倍数。

ffmpeg中关于av_image_fill_array()函数的定义:

av_image_fill_arrays()函数自身不具备内存申请的功能,此函数类似于格式化已经申请的内存,即通过av_malloc()函数申请的内存空间。

再者,av_image_fill_arrays()中参数具体说明:

  dst_data[4]:        [out]对申请的内存格式化为三个通道后,分别保存其地址

  dst_linesize[4]:        [out]格式化的内存的步长(即内存对齐后的宽度)

  *src:        [in]av_alloc()函数申请的内存地址。

 pix_fmt:    [in] 申请 src内存时的像素格式

width:        [in]申请src内存时指定的宽度

height:        [in]申请scr内存时指定的高度

align:        [in]申请src内存时指定的对齐字节数。

(3)调用方法总结

通过以上实例可以看到,(a)计算所需内存大小av_image_get_bufferz_size() --> (b) 按计算的内存大小申请所需内存 av_malloc()  --> (c) 对申请的内存进行格式化 av_image_fill_arrays();

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值