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

来源:互联网 发布:微信支付域名申请步骤 编辑:程序博客网 时间:2024/05/21 11:10

一、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 
}

EnumeratorAV_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:音频样本格式