音频播放器—解码和重采样

------------------------------------全系列文章目录------------------------------------

大致流程
  • 在音频设备回调函数中解码了一帧音频帧,根据音频帧得到输入音频的通道数、采样样本格式和采样率参数。
  • 根据输入音频参数和输出音频参数(在打开音频设备时已配置好),初始化重采样结构体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:每个通道中可用的输入样本数。
    • 返回值:每个通道输出的样本数,错误时为负值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值