前言
虽说ffplay是一个简单的播放器,但是其实内部一点也不简单,其实笔者也不知道说它简单的理由是什么,是因为它只有一个点c文件???
ffplay内部细节繁多,想要深入分析不单单要掌握音视频的相关概念,还要掌握多线程等相关知识,但是不得不说ffplay确实是学习的播放器开发的一个最佳例子。
建议想要学习ffplay的童鞋们集成后边阅读边增加注释,多阅读几次,相信你每次阅读都会有不同的理解与收获...
本文使用的ffplay.c的版本是搭配ffmpeg5.0的版本。
ffplay代码大致架构
关于fplay的架构很难三言两语说得清楚,而且本人对它的理解也不是很深,加上行笔比较啰嗦,可能就更加描述不清了,因此笔者制作了一张图,这张图描述了ffplay的三大子线程工作内容,当然如果加上字幕的话有四个子线程。
图导出的可能有点模糊,再加上上传图床后不知道有没有更加模糊了,想要高清大图的可以后台留言,加v信索取。
上图只是简单地画出了ffplay的大体架构,不同版本的代码API名称可能有点不同,但是大致思路肯定是一致的。这个图也忽略了一些细节,比如解码线程与读取线程的同步处理等。
ffplay关键数据结构
1、VideoState
VideoState可以说是ffplay的内部管家了,几乎能拿到ffplay内部的所有变量以及相关状态。下面是笔者加了注释的的VideoState源码:
【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~
/**
* 统领全局的结构体,几乎能拿到ffplay内部所有的变量
*/
typedef struct V