ffmpeg----FFplay简易播放器的实现

令狐掌门的博客-ffplay源码分析
叶余的博客–音视频开发 1已看过
其中有5篇介绍了简易播放器的实现

SDL播放流程见另一篇博客

2、FFmpeg简易播放器的实现2-视频播放
3、FFmpeg简易播放器的实现3-音频播放

SDL 开发实战(七): SDL 多线程与锁机制
SDL线程函数
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)—>设置相关参数—>初始化—>转换—->释放结构体

4、FFmpeg简易播放器的实现4-音视频播放
5、FFmpeg简易播放器的实现5-音视频同步

这篇博客只摘录部分细节:

代码背后的设计思路:
1、设计一个多线程安全的队列,保存AVPacket,同时统计队列内已缓存的数据大小。(这个统计数据会用来后续设置要缓存的数据量)
2、引入serial的概念,区别前后数据包是否连续
3、设计了两类特殊的packet——flush_pkt和nullpkt,用于更细致的控制(类似用于多线程编程的事件模型——往队列中放入flush事件、放入null事件)

你可能感兴趣的:(ffmpeg)