我是李铁山,ffplay是基于ffmpeg的播放器,B站大名鼎鼎的ijkplayer也是基于此二次开发,因此很有学习价值。
这篇文章是我深入解析ffplay的首篇,将会从main函数,自顶向下地剖析源码。
如果您对于源码感兴趣,可以查看ffplay的github地址https://github.com/FFmpeg/FFmpeg/blob/master/fftools/ffplay.c
那么我们接下来开始。ffplay.c的main函数也就100行代码,之后几篇我会深入解析其中用到的函数。
int main(int argc, char **argv)
{
int flags, ret;
VideoState *is;
init_dynload();
av_log_set_flags(AV_LOG_SKIP_REPEATED);
parse_loglevel(argc, argv, options);
首先,我们可以看到有三个变量,flags,ret和一个结构体VideoState,VideoState是一个很长的结构体,估计是用来记录视频一大堆信息的。
然后,开始就有三个函数。
init_dynload 是 fftools 中另外一个包的函数,作用是删除搜索路径中的工作目录,起到一个安全手段的作用。
第二个函数 av_log_set_flags 是 libavutils/log.c 中的函数,AV_LOG_SKIP_REPEATED 定义:
/**
* Skip repeated messages, this requires the user app to use av_log() instead of
* (f)printf as the 2 would otherwise interfere and lead to
* "Last message repeated x times" messages below (f)printf messages with some
* bad luck.
* Also to receive the last, "last repeated" line if any, the user app must
* call av_log(NULL, AV_LOG_QUIET, "%s", ""); at the end
*/
#define AV_LOG_SKIP_REPEATED 1
因此看来,这个函数的作用是避免重复的信息,应该是起到前期规范的作用。
第三个函数 parse_loglevel ,我看这个函数的源码还是挺复杂的,但大致功能是在用户输入的命令行中找到 loglevel 的选项,应该是解析输入命令用的。
好了,今天就解析 ffplay.c 的 main 函数前几行代码,做个总结,前三行代码主要用于输入命令的解析,第一个函数用来清除搜索路径的目录,第二个函数用来避免重复信息,第三个函数用来找到 -loglevel的指令。
欲知后事如何,请听下回分解。