ffplay是ffmpeg自带的播放器,调用ffmpeg和SDL API实现的一个非常具有参考价值的播放器,就连著名的B站开源项目ijkplayer也是在ffplay.c上进行二次开发,ffplay实现了播放器大体上的功能,掌握其原理对于做播放器开发非常有意义。
ffplay框架分析
黄线框 表示不同的线程控制
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
初始化
初始化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等
播放器控制
播放
暂停
停止
快进/快退
逐帧
静音
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
本文含有隐藏内容,请 开通VIP 后查看