1 简述
AVSWResample它是一个音频处理库, 能够实现音频的重采样,样本格式转换,以及音频混流等等,要想使用这个库,需先获得SwrContext 结构体, 这可以通过swr_alloc()或者 swr_alloc_set_opts() 。 在swr_alloc_set_opts()中,包含两步,第一步调用swr_alloc(),第二步通过av_opt_set_int()等AVOption 函数去设置lswr 库。而swr_alloc() 没有去初始化lswr 库, 所以需要通过AVOption API 去设置lswr 库。通过AVOption 设置完lswr 库之后,必须调用swr_init()函数,这样lswr库才能生效,若重新设置,也需调用。
2 使用流程
大体上分为三步:初始化, 转换, 退出。
2.1 初始化
第一种方法, 通过如下一支API 的调用搞定,将如何转换的参数一并设下去。
struct SwrContext *swr_alloc_set_opts(struct SwrContext *s,
int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate,
int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate,
int log_offset, void *log_ctx)
第二种方法:
step 1:SwrContext *swr_alloc(void);// 申请swr_alloc() 结构体
step 2: 通过av_opt_set_int()去设置lswr 库如何转换
step 3:int swr_init(struct SwrContext *s) ;// 通过调用init函数去使设置生效。与之对应的是swr_close()只是将SwrContext 设置的值清空, 通过swr_init() 右可恢复。
2.2 转换
swr_convert(struct SwrContext *s, uint8_t *out_arg[SWR_CH_MAX], int out_count,const uint8_t *in_arg [SWR_CH_MAX], int in_count)
//如果输出的buff 不够,那么输入的数据将会被缓存。输入参数in_count/out_count 可以为0 , 可以通过这样设置去flush 最后几个sample。
2.3 退出
void swr_free(SwrContext **ss). // 调用这一支API 即可
3 AVSwresample 库相关API
lswr 还有很多高级用法,这需要等大家去探究,以下列出AVSwresample 相关API。
函数名 | 作用 |
const AVClass * swr_get_class (void) | Get the AVClass for SwrContext. |
struct SwrContext * swr_alloc (void) | Allocate SwrContext. |
int swr_init (struct SwrContext *s) | 设置用户参数后初始化上下文。 |
int swr_is_initialized (struct SwrContext *s) | 检查swr上下文是否已经初始化 |
struct SwrContext * swr_alloc_set_opts (struct SwrContext *s, int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate, int log_offset, void *log_ctx) | 如果需要,分配swrcontext并设置/重置公共参数 |
void swr_free (struct SwrContext **s) | 释放给定的swrcontext并将指针设置为null |
void swr_close (struct SwrContext *s) | 关闭上下文,以便swr_is_initialized()返回0。 |
int swr_convert (struct SwrContext *s, uint8_t **out, int out_count, const uint8_t **in, int in_count) | 核心API ,转换音频 |
int64_t swr_next_pts (struct SwrContext *s, int64_t pts) | 核心API,从输入时间戳到输出时间戳的下一个转换以1/(in _ sample _ rate * out _ sample _ rate)为单位。 |
int swr_set_compensation (struct SwrContext *s, int sample_delta, int compensation_distance) | 激活重采样补偿 |
int swr_set_channel_mapping (struct SwrContext *s, const int *channel_map) | 设置自定义的输入通道映射 |
int swr_build_matrix (uint64_t in_layout, uint64_t out_layout, double center_mix_level, double surround_mix_level, double lfe_mix_level, double rematrix_maxval, double rematrix_volume, double *matrix, int stride, enum AVMatrixEncoding matrix_encoding, void *log_ctx) | 生成通道混合矩阵 |
int swr_set_matrix (struct SwrContext *s, const double *matrix, int stride) | 设置自定义混音矩阵 |
int swr_drop_output (struct SwrContext *s, int count) | 删除指定数量的输出样本 |
int swr_inject_silence (struct SwrContext *s, int count) | 注入指定数量的静音样本 |
int64_t swr_get_delay (struct SwrContext *s, int64_t base) | 获取下一个输入样本相对于下一个输出样本将经历的延迟 |
int swr_get_out_samples (struct SwrContext *s, int in_samples) | 如果使用输入样本的in_samples调用,则查找下一个swr_convert调用将输出的样本数的上限。更多... |
unsigned swresample_version (void) | 返回libswresample_version_int常量 |
const char * swresample_configuration (void) | 返回swr构建时配置。 |
const char * swresample_license (void) | 返回swr许可证。 |
int swr_convert_frame (SwrContext *swr, AVFrame *output, const AVFrame *input) | 转换输入avframe中的样本,并将它们写入输出avframe |
int swr_config_frame (SwrContext *swr, const AVFrame *out, const AVFrame *in) | 使用avframes提供的信息配置或重新配置swrcontext |