本文共 1255 字,大约阅读时间需要 4 分钟。
其中有5篇介绍了简易播放器的实现SDL播放流程见另一篇博客
swr重采样结构体流程
所谓的重采样,就是改变音频的采样率、sample format、声道数等参数,使之按照我们期望的参数输出。SwrContext常用函数:1、申请A、只申请:struct SwrContext *swr_alloc(void);//此函数用于申请一个SwrContext结构体B、申请并设置参数: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并设置/重置常用的参数,参数包含了输入输出参数中sample rate(采样率)、sample format(采样格式)、channel layout等 2。初始化int swr_init(struct SwrContext *s);//当设置好相关的参数后,使用此函数来初始化SwrContext结构体 3、工作/转换 int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, const uint8_t **in , int in_count);//此函数便是将输入的音频按照定义的参数进行转换,并输出4、释放void swr_free(struct SwrContext **s);释放掉SwrContext结构体并将此结构体置为NULL;基本用法如下: 申请结构体(swr_alloc、swr_alloc_set_opts)—>设置相关参数—>初始化—>转换—->释放结构体
这篇博客只摘录部分细节:
代码背后的设计思路:1、设计一个多线程安全的队列,保存AVPacket,同时统计队列内已缓存的数据大小。(这个统计数据会用来后续设置要缓存的数据量)2、引入serial的概念,区别前后数据包是否连续3、设计了两类特殊的packet——flush_pkt和nullpkt,用于更细致的控制(类似用于多线程编程的事件模型——往队列中放入flush事件、放入null事件)
转载地址:http://jbhrn.baihongyu.com/