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

本文详细介绍了FFmpeg中的音频采样格式及其相关函数,包括平面与打包格式的区别、如何获取不同格式的名称和值、计算每种格式下样本所占字节数等实用功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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_U8AV_SAMPLE_FMT_S16AV_SAMPLE_FMT_S32
  AV_SAMPLE_FMT_FLTAV_SAMPLE_FMT_DBLAV_SAMPLE_FMT_U8PAV_SAMPLE_FMT_S16P
  AV_SAMPLE_FMT_S32PAV_SAMPLE_FMT_FLTPAV_SAMPLE_FMT_DBLPAV_SAMPLE_FMT_S64
  AV_SAMPLE_FMT_S64PAV_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 *bufint 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_channelsint 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 *bufint nb_channelsint 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_channelsint 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_channelsint nb_samples, enum AVSampleFormat sample_fmt, int align)
分配数据指针数组,nb_samples样本的样本缓冲区,并填充数据指针并相应地进行排序。

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


int  av_samples_copy (uint8_t **dst, uint8_t *const *srcint 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 offsetint nb_samples, int nb_channels, enum AVSampleFormat sample_fmt)
用静音填充音频缓冲区。

参数:audio_data:数组指针数组

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

   nb_samples:要填充的样品数量

   nb_channels:音频通道数

   sample_fmt:音频样本格式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值