ffplay 源码剖析 -1 框架分析

ffplay.c的意义

ffplay.c是FFmpeg源码⾃带的播放器,调⽤FFmpeg和SDL API实现⼀个⾮常有⽤的播放器。 例如哔哩哔哩著名开源项⽬ijkplayer也是基于ffplay.c进⾏⼆次开发。

ffplay框架分析(和前面800行代码写一个播放器逻辑很相似)

黄线框 表示不同的线程控制
在这里插入图片描述

初始化

初始化packet queque 
初始化frame queque
初始化clock
创建数据读取线程

线程划分

1 数据读取线程

打开媒体⽂件
打开对应码流的decoder以及初始化对应的audio、video、subtitle输出
创建decoder线程,audio、video和subtitle的解码线程独⽴
调⽤av_read_frame读取packet,并根据steam_index放⼊不同stream对应的packet队列

2 ⾳频解码(视频同 字幕同)

从packet queue读取packet,解出frame后放⼊frame queue

3 ⾳频播放(或者回调函数)

从frame queue读取frame进⾏播放

4 视频播放(ffplay⽬前是在main主线程进⾏视频播放)

从frame queue读取frame进⾏播放

5 字幕播放 (ffplay⽬前是在main主线程进⾏字幕播放)

从frame queue读取frame进⾏播放

6 响应控制 (播放/暂停/快进/快退等)(ffplay⽬前是在main主线程进⾏播放控制)

packet队列的设计

线程安全,⽀持互斥、等待、唤醒 
缓存数据⼤⼩ 
缓存包数 
队列播放可持续时间 
进队列/出队列等

frame队列的设计

线程安全,⽀持互斥、等待、唤醒 
缓存帧数 
⽀持读取数据⽽不出队列 
进出队列等

⾳视频同步

⾳频同步 
视频同步 
外部时钟同步

⾳频处理

⾳量调节 
静⾳
重采样

视频处理

图像格式转换YUV->RGB等 
图像缩放1280*720->800*480等

播放器控制

播放
暂停
停⽌
快进/快退 
逐帧
静⾳

猜你喜欢

转载自blog.csdn.net/qq_33329316/article/details/124165070