头文件<libswresample/swresample.h>
功能:
1)采样频率转换:对音频的采样频率转换,如将采样率从44.1K转换到48K,注意从高采样频率到低采样频率的音频转换是一个有损的过程。
2)声道格式转换:对音频的声道格式转换,将立体声转换为单声道。
3)样本格式转换:对音频的样本格式转换,还包括Packed和Planar包装格式之间相互转换。
音频重采样步骤:
1)创建重采样过程的上下文环境,SwrContext结构体
2)设置参数( 通道数、采样率、采样长度),将重采样的参数设置到SwrContext中:swr_alloc_set_opts()
3)SwrContext初始化:swr_init() //每次设置或修改SwrContext参数后都必须调用swr_init()
4)分配样本数据内存空间: av_sample_alloc()、 av_samples_alloc_array_and_samples()
5)开启重采样转换: swr_convert() 针对每一帧音频的处理
6)重采样转换完成后释放资源:swr_free()
1、swr_alloc_set_opts()
SwrContext *swr_alloc_set_opts(struct SwrContext *s,/*上下文结构体,若为NULL会自动分配一个*/
int64_t out_ch_layout,/*重采样声道layout*/
AVSampleFormat out_sample_fmt,/*重采样样本格式*/
int out_sample_rate,/*重采样的样本率/采样率*/
int64_t in_ch_layout,/*源声道layout*/
AVSampleFormat in_sample_fmt,/*源音频的样本格式*/
int in_sample_rate,/*源音频的样本率/采样率*/
int log_offset,/*日志 一般为NULL*/
void *log_ctx/*日志 一般为NULL*/
);
设置重采样参数,一般而言重采样后采样率最好大于重采样前的采样率(不然容易发生数据丢失出现杂音)。也可以通过 swr_alloc()函数创建SwrContext上下文结构,再调用AVOptions的API( av_opt_set_*)来设置具体的参数。
2、int swr_init()
int swr_init(struct SwrContext *s); // 每次设置或修改SwrContext参数后都必须调用swr_init()
3、swr_convert()
int swr_convert(struct SwrContext *s, /*上下文结构体*/
uint8_t **out, /*重采样后的数据*/
int out_count, /*重采样后单通道的样本数量(不是字节数)*/
const uint8_t **in , /*采样前的源数据*/
int in_count /*源单通道的样本数量*/
);
在调用swr_context转换之前需要分配内存空间用于保存重采样的输出数据,内存空间的大小跟通道个数、样本格式、样本个数有关。libavutil中提供了一些函数方便管理样本数据,例如av_samples_alloc()和av_samples_alloc_array_and_samples()函数用于分配存储音频数据的空间。
int av_samples_alloc(uint8_t **audio_data, /*对应frame的data数据,每个元素是指向一个通道的数据的指针*/
int *linesize, /*audio_data中每个元素的大小,对于frame的linsize*/
int nb_channels, /*通道个数*/
int nb_samples, /*每个通道的样本数*/
enum AVSampleFormat sample_fmt, /*音频格式*/
int align /*audio_data中对齐方式 (0:默认对齐方式, 1:无对齐*/
);
//返回值大于等于0表示分配成功