FFMPEG学习【libavutil】:音频相关(三)

ffmpeg里av_samples_fill_arrays,av_samples_alloc,av_samples_alloc_array_and_samples函数的作用 int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align) { uint8_t *buf; int size = av_samples_get_buffer_size(NULL, nb_channels, nb_samples, . 阅读详情

一、Audio sample formats

音频采样格式列举和相关便利功能。



一)、枚举

音频采样格式

1、由样本格式描述的数据始终是本机端序列。 样本值可以由本机C类型表示,因此即使是常见的原始音频数据格式,也缺少签名的24位采样格式。

2、浮点格式基于满量程范围[-1.0,1.0]。 超出该范围的任何值都超出了完整的音量。

3、在av_samples_fill_arrays()和FFmpeg其他位置(如libavcodec中的AVFrame)中使用的数据布局如下所示:

 对于平面样本格式,每个音频通道位于单独的数据平面中,并且linesize是单个平面的缓冲区大小(以字节为单位)。 所有数据平面的大小必须相同。 对于压缩样本格式,仅使用第一个数据平面,并且每个通道的采样交错。 在这种情况下,linesize是1平面的缓冲区大小(以字节为单位)。

enum   AVSampleFormat { 
  AV_SAMPLE_FMT_NONE = -1, AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32, 
  AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8P, AV_SAMPLE_FMT_S16P, 
  AV_SAMPLE_FMT_S32P, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_DBLP, AV_SAMPLE_FMT_S64, 
  AV_SAMPLE_FMT_S64P, AV_SAMPLE_FMT_NB 
}

Enumerator
AV_SAMPLE_FMT_NONE   
AV_SAMPLE_FMT_U8 

unsigned 8 bits

AV_SAMPLE_FMT_S16 

signed 16 bits

AV_SAMPLE_FMT_S32 

signed 32 bits

AV_SAMPLE_FMT_FLT 

float

AV_SAMPLE_FMT_DBL 

double

AV_SAMPLE_FMT_U8P 

unsigned 8 bits, planar

AV_SAMPLE_FMT_S16P 

signed 16 bits, planar

AV_SAMPLE_FMT_S32P 

signed 32 bits, planar

AV_SAMPLE_FMT_FLTP 

float, planar

AV_SAMPLE_FMT_DBLP 

double, planar

AV_SAMPLE_FMT_S64 

signed 64 bits

AV_SAMPLE_FMT_S64P 

signed 64 bits, planar

AV_SAMPLE_FMT_NB 

Number of sample formats. DO NOT USE if linking dynamically.



二)、函数

const char *  av_get_sample_fmt_name (enum AVSampleFormat sample_fmt)
返回sample_fmt的名称,如果sample_fmt无法识别,则返回NULL。


enum AVSampleFormat  av_get_sample_fmt (const char *name)
返回与名称相对应的示例格式,或者错误地返回AV_SAMPLE_FMT_NONE。


enum AVSampleFormat  av_get_alt_sample_fmt (enum AVSampleFormat sample_fmt, int planar)
返回给定样本格式的平面< - >打包替代形式,或者错误地返回AV_SAMPLE_FMT_NONE。

如果传递的sample_fmt已经处于请求的平面/打包格式,则返回的格式与输入相同。


enum AVSampleFormat  av_get_packed_sample_fmt (enum AVSampleFormat sample_fmt)
获取给定样品格式的打包替代形式。

如果传递的sample_fmt已经是打包格式,则返回的格式与输入相同。

返回:给定样品格式的包装替代形式或AV_SAMPLE_FMT_NONE错误。


enum AVSampleFormat  av_get_planar_sample_fmt (enum AVSampleFormat sample_fmt)
获取给定样本格式的平面替代形式。

如果传递的sample_fmt已经是平面格式,返回的格式与输入相同。

返回:给定样本格式的平面替代形式或AV_SAMPLE_FMT_NONE错误。


char *  av_get_sample_fmt_string (char *buf, int buf_size, enum AVSampleFormat sample_fmt)
使用sample_fmt生成与样本格式对应的字符串,如果sample_fmt为负,则生成标题。

参数:buf:缓冲区在哪里写字符串

   buf_size:buf的大小

   sample_fmt:打印相应信息字符串的样本格式的编号,或打印相应标题的负值。

返回:指向已填充缓冲区的指针,如果sample_fmt未知或其他错误则为NULL


int  av_get_bytes_per_sample (enum AVSampleFormat sample_fmt)
返回每个样本的字节数。

参数:sample_fmt:示例格式

返回:每个样本的字节数或零(如果未知的给定样本格式)


int  av_sample_fmt_is_planar (enum AVSampleFormat sample_fmt)
检查样品格式是否平面。

参数:sample_fmt:样本格式进行检查

返回:1如果采样格式是平面的,如果是交错则为0


int  av_samples_get_buffer_size (int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align)
获取给定音频参数所需的缓冲区大小。

参数:linesize:计算的linesize,可能为NULL

   channels:渠道数量

   nb_samples:他在单个通道中的样本数

   sample_fmt:示例格式

   align:缓冲区大小对齐(0 =默认,1 =无对齐)

返回:所需缓冲区大小或失败时的负错误代码



二、Samples manipulation

操作音频样本的函数

一)、函数

int  av_samples_fill_arrays (uint8_t **audio_data, int *linesize, const uint8_t *buf, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align)
填写平面数据指针,并使用样本格式sample_fmt对样本进行换行。

audio_data数组用样本数据平面的指针填充:对于平面,设置缓冲区内每个通道的数据的起始点,以便打包,仅设置整个缓冲区的起始点。

linesize指向的值设置为每个通道的平面布局的数据缓冲区的对齐大小,或者设置为用于打包布局的所有通道的缓冲区的对齐大小。

buf中的缓冲区必须足够大以包含所有样本(使用av_samples_get_buffer_size()计算其最小大小),否则audio_data指针将指向无效数据。

查看:枚举AVSampleFormat AVSampleFormat的文档描述了数据布局。

参数:audio_data:数组将填充每个通道的指针

   linesize:计算的linesize,可能为NULL

   buf:指向包含样本的缓冲区的指针

   nb_channels:渠道数量

   nb_samples:单个通道中的采样数

   sample_fmt:采样格式

   align:缓冲区大小对齐(0 =默认,1 =无对齐)

返回:> = 0成功或失败的负错误代码

Todo:在下一个凸块成功的情况下返回缓冲区所需的最小大小(以字节为单位)


int  av_samples_alloc (uint8_t **audio_data, int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align)
为nb_samples样本分配样本缓冲区,并相应填充数据指针和linesize。

分配的采样缓冲区可以通过使用av_freep(&audio_data [0])来释放。分配的数据将被初始化为静音。

查看:枚举AVSampleFormat AVSampleFormat的文档描述了数据布局。

参数:audio_data:数组将填充每个通道的指针

   linesize:音频缓冲区的对齐大小可能为NULL

   nb_channels:音频通道数

   sample_fmt:每个通道的采样数

   align:缓冲区大小对齐(0 =默认,1 =无对齐)

返回:> = 0成功或失败的负错误代码


int  av_samples_alloc_array_and_samples (uint8_t ***audio_data, int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align)
分配数据指针数组,nb_samples样本的样本缓冲区,并填充数据指针并相应地进行排序。

这与av_samples_alloc()相同,但也分配数据指针数组。


int  av_samples_copy (uint8_t **dst, uint8_t *const *src, int dst_offset, int src_offset, int nb_samples, int nb_channels, enum AVSampleFormat sample_fmt)
将样本从src复制到dst。

参数:dst:指向数据计划的目标数组

   src:源数组指向数据计划

   dst_offset:将数据写入dst的样本中的偏移量

   src_offset:从src读取数据的样本中的偏移量

   nb_samples:要复制的样本数

   nb_channels:音频通道数

   sample_fmt:音频采样格式


int  av_samples_set_silence (uint8_t **audio_data, int offset, int nb_samples, int nb_channels, enum AVSampleFormat sample_fmt)
用静音填充音频缓冲区。

参数:audio_data:数组指针数组

   offset:在开始填充的样品中的偏移量

   nb_samples:要填充的样品数量

   nb_channels:音频通道数

   sample_fmt:音频样本格式

音频编码流程 ----- PCM编码为AAC格式 确保帧数据可写,尽可能避免数据复制.如果帧可写,则不执行任何操作,如果不可写,则分配新缓冲区并复制数据.返回: 成功时为 0,错误时为负 AVERROR.这个函数就是将你输入的一帧数据写入AVFrame格式输出,便于后面编码send,recvice使用。 阅读详情

相关推荐

FFmpeg源码分析:音频采样格式相关API

FFmpeg针对音频采样格式的获取与处理,封装有专门工具类。音频采样格式枚举类型与相关API,位于libavutil模块的samplefmt.h,包括获取采样格式名字、获取采样格式类型、获取每个采样所占字节、获取采样数所需缓冲区大小、填充采样数组、分配采样缓冲区、拷贝采样数据、填充采样数据为静音。

徐福记456 3万+

使用FFmpeg将S16格式音频数据重采样为FLTP格式

代码对一些数据没做判断,仅仅是做个备忘!请谨慎参考! #include <libavutil/opt.h> #include <libavutil/samplefmt.h> #include <libswresample/swresample.h> #include <stdio.h> #include "libavcodec/avcodec.h" #include "libavutil/imgutils.h" #include "libswresamp

Silencer 3012

使用FFMPEG实现音频播放器

使用FFMPEG实现音频播放器导言因为公司项目的原因,要学习如何使用FFMPEG进行音频播放,折腾一圈发现,使用FFMPEG还真不是一件简单的事,更为可惜的是,当年在这方面的杰出人物—雷霄骅的英逝,这方面的文档愈发稀少,而FFMPEG相关代码不断更新,整理此文,算是对他的一种缅怀吧。FFMPEG简介 Q:FFMPEG是什么? A:FFMPEG是一个多媒体框架 Q:FFMPEG

Brust Link 5253

FFmpeg学习(三)-- libavutil 代码组成

FFmpeg libavutil

云梦居 3714

ffmpeg源码简析(十一)libavformat,libavcodec,libavutil

libavformatavformat.h 文件 定义识别文件格式和媒体类型库使用的宏、数据结构和函数,通常这些宏、数据结构和函数在此模块内相 对全局有效allformat.c 文件 简单的注册/初始化函数,把相应的协议,文件格式,解码器等用相应的链表串起来便于查找。cutils.c 文件 文件格式分析模块使用的两个工具类函数,都是对字符串的操作。file.c 把 file 当做类似

WangShuo的专栏 2357

ffmpeg自学路(三)ffmpeg各项库说明,及build.sh的shell相关命令说明

一,ffmpeg各项库对应的功能说明

u014436704的专栏 981

FFmpeg 头文件完美翻译之 libavutil 模块

众所周知,FFmpeg 的代码开发上手难度较高,源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发,需要借助它的头文件,FFmpeg 把很多代码库教程都写在头文件里面。因此,熟读头文件的内容很重要,为此,我对 FFmpeg 6.x 版本的头文件进行了翻译,方便大家阅读理解。相信我,通读一遍头文件的注释后,你的 FFmpeg 的代码库开发技能将更上一层。本文适用于有 FFmpeg 代码库开发基础,但想深入熟练使用的同学。同时也可以参考我的Github 仓库。

Leon_Chenl的博客 963

FFmpeg学习 总体介绍

前言 前面文章学习ijk后,之后开始对FFmpeg进行学习。 FFmpeg是很优秀的音视频库,将会进行深入学习。本文介绍FFmpeg大概模块、结构体和基本使用,之后在遇到具体函数会对具体函数进行分析。 模块介绍 libavformat 该模块下实现了目前绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、TS等文件格式;RTMP、RTSP、HLS等网络协议封装格式。 FFmpeg可以在编译时按需选择要支持哪些封装格式。 另外也可以增加自己定制的封装格式,只需添加自己的封装处理模块muxer、dem

baiiu 721

FFMPEG学习【libavutil】:音频相关(一)

一、音频FIFO缓冲区 一)、函数 void  av_audio_fifo_free (AVAudioFifo *af) 释放AVAudioFifo。 AVAudioFifo *  av_audio_fifo_alloc (enum AVSampleFormat sample_fmt, int channels

一世豁然的专栏 2786

AV_SAMPLE_FMT_FLTP转为AV_SAMPLE_FMT_S16P(ffmpeg)

AV_SAMPLE_FMT_FLTP转为AV_SAMPLE_FMT_S16P(ffmpeg),在使用ffmpeg解码aac的时候,如果使用avcodec_decode_audio4函数解码,那么解码出来的会是AV_SAMPLE_FMT_FLTP 格式的数据( float, 4bit , planar), 如果我们希望得到16bit的数据(如AV_SAMPLE_FMT_S16P数据),那么我们需要转换一下: 解決方式: 將 samples 由 32bits 转为16bits. 参考 ffmpeg samplefmt.h 若 sample 是 AV_SAMPLE_FMT_FLTP,則 sample 會是 float 格式,且值域为 [-1.0, 1.0] 若 sample 是 AV_SAMPLE_FMT_S16, 則 sample 會是 int16 格式,且值域为 [-32767, +32767]

达梦数据库JDBC连接池断开自动重连设置

一、场景 在网络状况不是非常良好,经常会出现暂时性的拥塞或者断开的情况,而且当我们重启数据库时也会发生类似的情况。所以需要配置中间件的连接池来实现连接测试以及自动重连,通过重新配置连接池,成功解决了这个问题。下面会给出一份数据源配置参数详单和一份推荐的数据源配置项。 二、连接池配置参数 1. initialSize:连接池启动时创建的初始化连接数量 2. maxActive:连接池中可同时连接的最大的连接数 3. maxIdle:连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负

lilv1989的博客 7235

FFmpeg从入门到牛掰(六):音频转码讲解

转载请注明出处:https://blog.youkuaiyun.com/impingo 项目地址:https://github.com/im-pingo/pingos 音频转码讲解描述系列目录串讲 描述 本篇文章主要介绍ffmpeg中音频解码、重采样以及编码的API接口。前面的文章已经用三章分别介绍了在这过程中使用到的API函数,这篇文章将会把之前提到的API串起来讲解。 系列目录 FFmpeg从入门到牛掰(...

impingo的博客 1951

NX二次开发(python)-坯料尺寸(一)

一般在产品制造过程中,往往要判断一个模型在出模方向上的最小包容盒尺寸,在NX中可以用坯料尺寸命令实现,当然也有相应的代码实现,这或许可以帮助我们实现一些产品的坯料尺寸批量输出,节省人力。

dasfanfan的博客 816

python安装ffmpeg包操作方法

步骤1. Anaconada 环境 步骤2. 以下两者方法均失败的情况下用步骤3 pip install FFmpeg conda install FFmpeg 步骤3. 采用镜像方式安装 conda install -c https://conda.anaconda.org/menpo ffmpeg 步骤4. 安装conda-forge conda-forge是编译的f...

5792

声音事件检测metric:PSDS

这项工作为多声道声音事件检测(SED)系统的性能评估定义了一个新的框架,它克服了传统的collar-based事件决定、事件F-cores和事件错误率的限制。拟议的框架引入了对事件检测的定义,该定义对标签的主观性更为稳健。它还采用了多声道接收器操作特性(ROC)曲线,以提供比F1分数更全面的系统性能洞察力,并建议将这些曲线简化为单一的多声道声音检测分数(PSDS),这允许系统独立于操作点(OPs)进行比较。所提出的方法还能更好地了解不同声音类别的数据偏差和分类稳定性。

Maestro_T的博客 2728

VH6501干扰仪的使用

触发模式方法备注External Trigger(外部触发)使用VH6501的I/O口作为触发源Frame Trigger(报文触发)设定被干扰报文的触发位置,并发送干扰位序列/报文software Trigger(软件触发)配置好干扰序列后直接发送Error Frame Trigger(错误帧触发)基于错误帧标识位为触发条件触发干扰Direction Trigger(发送方向触发)根据TX/RX发送/接收方作为触发条件Inverted Trigger(反向触发)

帮助100万人颠覆负面潜意识,实现人生蜕变,培养1万名潜意识开发导师 9051

FFmpeg 学习(一):FFmpeg 简介

它提供了录制、转换以及流化音视频的完整解决方案。如果您之前没有阅读FFmpeg代码的经验,建议优先阅读libavformat、libavcodec以及libavutil下面的代码,它们提供了音视频开发的最基本功能,应用范围也是最广的。链接:https://zhuanlan.zhihu.com/p/568800000。链接:https://zhuanlan.zhihu.com/p/568800000。商业转载请联系作者获得授权,非商业转载请注明出处。商业转载请联系作者获得授权,非商业转载请注明出处。

yinshipin007的博客 3764

HBuilderx连接微信开发者工具

系列文章目录 文章目录系列文章目录前言一、环境1.HBuilerx 工具2.微信开发者工具二、关联微信开发者工具1.HBuilderx新建项目2.关联微信开发者工具3.运行微信小程序出现异常解决方法3.最终效果总结 前言 使用HBuilderx工具关联微信开发者工具,进行小程序开发 提示:以下是本篇文章正文内容,下面案例可供参考 一、环境 1.HBuilerx 工具 HBuilderx 2.微信开发者工具 微信开发者工具 二、关联微信开发者工具 1.HBuilderx新建项目 2.关联微信开发者工具

拥有必珍惜 3075

FFMPEG学习【libavutil】:音频相关(二)

一、Audio channel layouts 一)、宏 #define  AV_CH_LAYOUT_MONO   (AV_CH_FRONT_CENTER) #define  AV_CH_LAYOUT_STEREO   (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT)

一世豁然的专栏 1695

大模型之Spring AI实战系列(二):Spring Boot + OpenAI 打造聊天应用全攻略

本篇文章是《Spring AI实战》专栏的第一篇开发入门文章,我们将借助一个完整的OpenAI聊天应用示例,详细介绍如何运用Spring Boot和Spring AI快速搭建一个支持OpenAI API的聊天服务,全面涵盖基础对话、流式对话、多提供商配置等核心功能。

寻道AI,探索AI无限可能! 6866

基于YOLO26深度学习框架的人脸识别门禁系统的算法研究实现方法

本文研究了基于YOLO26深度学习框架的人脸识别门禁系统实现方法。系统采用YOLO26目标检测算法,通过CSPDarknet53主干网络、特征金字塔结构和注意力机制实现高效人脸检测。研究内容包括数据预处理、模型训练优化和身份验证等关键技术,使用迁移学习策略和CIoU损失函数提升检测精度。该系统可应用于智能安防场景,具有实时性强、识别准确的特点,为门禁管理提供了智能化解决方案。

一键难忘的博客 766

ffmpeg库简介

ffmpeg下有7个library,分别是: libavutil libswscale libswresample libavcodec libavformat libavdevice libavfilter libavutil:(通用工具库) libavutil十一个实用的工具库用于辅助可移植的多媒体编程。它包含安全的可移植的字符串函数,随机数生成器,数据结构,附加的数学函数,密码学和多媒体相关功能(例如像素和样本格式的枚举)。它不是 libavcodec 和 libavformat 都需要的代码库

依依妖妖的林少的博客 2680

UNet改进(6):基于注意力机制的多尺度医学图像分割方法

本文提出了一种集成多尺度注意力机制的UNet改进模型UNetWithAttention,用于提升医学图像分割性能。该模型在标准UNet架构基础上,设计了并行3×3、5×5、7×7卷积核的多尺度注意力模块,通过特征拼接和Sigmoid激活生成注意力权重,实现了对不同尺寸病变的自适应关注。模型采用分离式设计,将特征提取与特征选择解耦,在编码器-解码器各阶段嵌入注意力模块。实验表明,该方法在视网膜血管分割和肺结节检测任务中优于标准UNet,Dice系数和IOU分别提升2.6%和4.1%,同时保持计算效率。

2501_91516851的博客 1324

ffmpeg音频重采样代码抽取

本篇博文针对的是ffmpeg4.0.1版本进行 ffmpeg解压缩之后会有一个doc目录,此目录中有示例程序,就在doc/examples。 要想编译examples中的测试程序,可以先编译整个ffmpeg(生成主要的库,如:libavcodec.a libavdevice.a libavfilter.a libavformat.a libavutil.a libswresample.a...

weixin_43138570的博客 949

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

FFmpeg命令处理音视频

此处:-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持,-vframes 设置转换多少桢(frame)的视频,示例命令是获取第一秒第一帧的截图。libavdevice: 是一个包含输入和输出设备的库,用于抓取和渲染许多常见的多媒体输入/输出软件框架,包括 Video4Linux、Video4Linux2、VfW 和 ALSA。-vf scale 指定使用简单过滤器 scale,iw/2:-1 中的 iw 指定按整型取视频的宽度。-b:a 指定音频码率。

u010609022的专栏 1382

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: FFMPEG学习【libavutil】:音频相关(二)
下一篇: FFMPEG学习【libswresample】
一世豁然
博客等级 码龄15年 1276粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值