音视频从入门到精通——FFmpeg之av_image_get_buffer_size函数

这篇具有很好参考价值的文章主要介绍了音视频从入门到精通——FFmpeg之av_image_get_buffer_size函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FFmpeg之av_image_get_buffer_size函数

/**
 * Return the size in bytes of the amount of data required to store an
 * image with the given parameters.
 * 返回使用给定参数存储图像所需数据量的字节大小
 *
 * @param pix_fmt  the pixel format of the image 图像的像素格式
 * @param width    the width of the image in pixels 以像素为单位的图像宽度
 * @param height   the height of the image in pixels 图像的高度(像素)
 * @param align    the assumed linesize alignment 假定的线宽对齐
 * @return the buffer size in bytes, a negative error code in case of failure
 * 缓冲区大小(以字节为单位),出现故障时为负错误代码
 */
int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align);

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

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

ffmpeg的ffmpeg中的align

ffmpeg之所以给了这个参数让⼈设置,应该就是为了兼容各个硬件平台,因为不是所有的硬件平台都能访 问任意地址上的任意数据的, 某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常

以ffmpeg的av_image_get_buffer_size为例,你能准确说出下⾯的结果吗,如果可以,那么证明你确实 理解了ffmpeg中的对⻬了。

值得注意的是yuv的计算,以w*h的yuv420p为例,
他是分三个平⾯存储三个分量的,⽽u和v的计算是⼀致 的,
也就是说计算出了u即可得到v;
对于y来说,它有w⾏h列,因此需要计算w⾏的对⻬后字节数再乘以h;
对于u来说,它有w/2h/2列(这是因为每4个y共享⼀组uv),
因此需要计算w/2⾏的对⻬后字节数再乘以 h/2
v的计算与u的⼀模⼀样,最后将这个三个数相加即可

例如310的图⽚,每个像素点占2个字节,对⻬数align为4,那么⾏数是多少呢,从条件可知,每⾏3 个像素点,每个像素点占2字节,那么每⾏就是6字节,⽽对⻬数是4,6不是4的整数倍,因此6需要补 2个字节凑成8,8就是4的整数倍了,那么我们就知道每⾏在内存中实际占⽤了8个字节,后两个字节是 为了对⻬补上的,总共有10⾏,那么这张图⽚在实际内存中就占⽤了810=80个字节,⽽不是60个字 节了

本来这张图⽚只需要60个字节,为何要⽤80个字节来存储呢,这是因为cpu并不能从任意地址开始读 取数据,如果不对⻬,那么可能需要多次读取才能读到完整数据,因此对⻬主要是为了提升性能,典型的空间换取时间

ffmpeg的linesize

linesize其实就是我们上⽂提及到的⾏字节数,在我们解码出数据后,经常会遇到这个linesize,既然我们知 道了align的概念,就该明⽩这个linesize就是为了让你取出真实的数据的 解码后的数据中可能是经过对⻬的,既然有对⻬,那就是数据⾥加多了⼀些为了对⻬⽽多余的字节,如果 我们想最后显示视频数据,那么这些多余的数据势必要进⾏剔除掉,那么怎么剔除呢,linesize就是来帮你 ⼲这事的,有了它,你就可以一行一行⽐较,然后把每⾏最后为了对⻬⽽补的字节删除,还原出视频的真 实数据

av_image_alloc函数

/**
 * Allocate an image with size w and h and pixel format pix_fmt, and
 * fill pointers and linesizes accordingly.
 * 分配具有大小w和h以及像素格式pix_fmt的图像,并相应地填充指针和线条大小
 * 
 * The allocated image buffer has to be freed by using
 * av_freep(&pointers[0]).
 * 必须释放分配的图像缓冲区使用av_freep
 *
 * @param align the value to use for buffer size alignment 
 * 用于缓冲区大小对齐的值
 * 
 * @return the size in bytes required for the image buffer, a negative
 * error code in case of failure
 * 图像缓冲区所需的字节大小,出现故障时为负错误代码
 */
int av_image_alloc(uint8_t *pointers[4], int linesizes[4],
                   int w, int h, enum AVPixelFormat pix_fmt, int align);

av_image_fill_arrays函数

/**
  Setup the data pointers and linesizes based on the specified image
  parameters and the provided array.
  根据指定的图像参数和提供的数组设置数据指针和行大小
 
  The fields of the given image are filled in by using the src
  address which points to the image data buffer. Depending on the
  specified pixel format, one or multiple image data pointers and
  line sizes will be set.  If a planar format is specified, several
  pointers will be set pointing to the different picture planes and
  the line sizes of the different planes will be stored in the
  lines_sizes array. Call with src == NULL to get the required
  size for the src buffer.

给定图像的字段是使用指向图像数据缓冲区的src地址填充的。
根据指定的像素格式,将设置一个或多个图像数据指针和线条大小。
如果指定了平面格式,将设置多个指向不同图片平面的指针,
不同平面的线条大小将存储在lines_sizes数组中。
使用src==NULL调用以获取src缓冲区所需的大小
 
 
  To allocate the buffer and fill in the dst_data and dst_linesize in
  one call, use av_image_alloc().
要在一次调用中分配缓冲区并填写dst_data和dst_linesize,请使用av_image_alloc
 
  @param dst_data      data pointers to be filled in
  @param dst_linesize  linesizes for the image in dst_data to be filled in
  @param src           buffer which will contain or contains the actual image data, can be NULL
  @param pix_fmt       the pixel format of the image
  @param width         the width of the image in pixels
  @param height        the height of the image in pixels
  @param align         the value used in src for linesize alignment
  @return the size in bytes required for src, a negative error code
  in case of failure
 */
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);

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

参考

av_image_get_buffer_size
FFmpeg简单分析系列----内存对齐简要说明文章来源地址https://www.toymoban.com/news/detail-413945.html

到了这里,关于音视频从入门到精通——FFmpeg之av_image_get_buffer_size函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 音视频 ffmpeg命令提取音视频数据

    保留封装格式 提取视频 提取音频 推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核) https://xxetb.xet.tech/s/VsFMs

    2024年02月10日
    浏览(60)
  • 【FFmpeg】音视频录制 ① ( 查询系统中 ffmpeg 可录制的音视频输入设备 | 使用 ffmpeg 命令录制音视频数据 | 录制视频数据命令 |录制音频数据| 同时录制音频和视频数据命令 )

    在 Windows 系统中 , 使用 ffmpeg 命令 录制 音视频 , 需要先获取 系统的 音视频设备 信息 , 录制 音视频 本质上是从 系统音视频设备 中获取数据 ; 执行 命令 , 可以获取 系统中 ffmpeg 可用的 DirectShow 音视频输入设备 ; 命令参数解析 : -list_devices true : 列出所有 ffmpeg 的 指定类型的可

    2024年04月25日
    浏览(89)
  • 音视频 ffmpeg视频裁剪

    将输入视频帧的宽度和高度从x和y值表示的位置裁剪到指定的宽度和高度;x和y是输出的左上角坐标,协调系统的中心是输入视频帧的左上角。 如果使用了可选的keep_aspect参数,将会改变输出SAR(样本宽比)以补偿新的DAR(显示长宽比) 推荐一个零声学院项目课,个人觉得老师讲得不

    2024年02月10日
    浏览(50)
  • 音视频 ffmpeg命令视频录制(Windows)

    先安装dshow软件 Screen Capturer Recorder, 项目地址:https://sourceforge.net/projects/screencapturer/files/ 然后查看可用设备名字:ffmpeg -list_devices true -f dshow -i dummy 录制视频(默认参数) 录制声音(默认参数) 同时录制声音和视频(默认参数) 查看视频录制的可选参数 查看视频录制的可

    2024年02月10日
    浏览(69)
  • [一]ffmpeg音视频解码

    (1)下载FFmpeg源码(v3.3.6) 下载地址( http://www.ffmpeg.org/download.html#releases ) (2)下载NDK(r14b) 下载地址( https://developer.android.google.cn/ndk/downloads/index.html) (3)编写Android编译脚本 (1)用ftp上传到Ubuntu中 (2)解压Ffmpeg(tar -zxvf ffmpeg-3.3.6.tar.gz) (3)解压NDK(unzip andro

    2024年01月19日
    浏览(221)
  • ffmpeg解决bilibili下载的音视频分离问题,将音视频一键合成

    1:到FFmpeg下载安装包,我安装的是windows 下载打包文件 2:解压文件到本地 以下为解压后的文件视图 3:点击进去第一个bin文件,复制该目录,安装到本地环境变量中 然后点击确定进行保存设置 4:ctrl+r打开运行,输入cmd打开命令窗口,输入ffmpeg -version查看版本 安装成功 将所

    2024年02月11日
    浏览(45)
  • ffmpeg系列学习——FFmpeg的音视频处理

    1.音视频的采样率、采样位深度和声道数 音频和视频的采样率、采样位深度和声道数是媒体文件中的重要参数,它们会直接影响到音视频的质量和文件大小。下面对它们进行详细解释: 采样率 采样率指音频每秒钟采样的次数,用赫兹(Hz)表示。采样率越高,音频的还原度越

    2024年02月04日
    浏览(59)
  • 音视频 ffmpeg命令图片与视频互转

    截取一张图片 转换视频为图片(每帧一张图): 图片转换为视频: 从视频中生成GIF图片 将 GIF 转化为 视频 推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核) https://xxetb.xet.tech/s/VsFMs

    2024年02月10日
    浏览(52)
  • 音视频项目—基于FFmpeg和SDL的音视频播放器解析(三)

    介绍 在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本文,可参考我的前一篇文章音视频项目—基于FFmpeg和SDL的音视

    2024年02月05日
    浏览(66)
  • Android音视频: 引入FFmpeg

    本文你可以了解到 本文将介绍如何将上一篇文章编译出来的  FFmpeg so  库,引入到  Android  工程中,并验证  so  是否可以正常使用。 一、开启 Android 原生 C/C++ 支持 在过去,通常使用  makefile  的方式在项目中引入  C/C++  代码支持,随着  Android Studio  的普及, makefile  的

    2024年02月02日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包