FFMPEG 之 AVSwresample

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值