------------------------------------全系列文章目录------------------------------------
大致流程
- 在音频设备回调函数中解码了一帧音频帧,根据音频帧得到输入音频的通道数、采样样本格式和采样率参数。
- 根据输入音频参数和输出音频参数(在打开音频设备时已配置好),初始化重采样结构体SwrContext。
- 根据解码音频帧的采样数和输出音频的采样数(在打开音频设备时已配置好),使用配置好的SwrContext通过swr_convert函数进行重采样处理。
解码操作
-
函数avcodec_decode_audio4,用于将AVPacket.size大小的AVPacket.data解码至AVFrame中,注意AVPacke可能包含多帧数据,但解码时一次只返回一帧数据。
-
int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, const AVPacket *avpkt);
- AVCodecContext:描述该音频解码器上下文的结构体。
- AVFrame:用于存储解码的数据。
- int * got_frame_ptr:如果当前无法解码帧,则返回0;否则返回非0。
- AVPacket:待解码的数据包。
- 返回值:负数表示出现错误,否则为解码时消耗AVPacket的字节数。
重采样操作
-
因为待播放文件的参数可能与音频设备驱动支持的播放参数不同,所以在将解码出的PCM数据送去给音频设备播放前,先进行一次重采样处理,使得待播放的数据符合音频设备驱动支持的播放参数。
-
SwrContext结构体用于描述音频重采样处理,该结构体是不透明的,因此若想设置相关的成员变量,必须使用提供的API函数。
-
/* 用于申请一个SwrContext结构体 */ struct SwrContext *swr_alloc(void);
-
/* 如果需要会申请一个SwrContext结构体,并且设置或重置相关参数 */ 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:待设置或重置相关参数的结构体。
- out_ch_layout:(重采样)输出的通道布局。
- out_sample_fmt:(重采样)输出的样本格式。
- out_sample_rate:(重采样)输出的采样率。
- in_ch_layout:输入的通道布局。
- in_sample_fmt:输入的样本格式。
- in_sample_rate:输入的采样率。
- log_offset:日志记录的级别偏移。
- log_ctx:日志上下文,可为NULL。
- 返回值:设置或重置参数的SwrContext结构体。
-
/* 在设置完相关参数化,进行初始化,失败返回AVERROR */ int swr_init(struct SwrContext *s);
-
/* 释放指定的SwrContext结构体 */ void swr_free(struct SwrContext **s);
-
/* 该函数用于转换(重采样)音频 */ int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, const uint8_t **in, int in_count);
- SwrContext:设置了参数的重采样结构体。
- out:输出缓冲区。
- out_count:每个通道中可用的输出样本数。
- in:输入缓冲区。
- in_count:每个通道中可用的输入样本数。
- 返回值:每个通道输出的样本数,错误时为负值。