介绍
我是李铁山,ffplay是基于ffmpeg的播放器,B站大名鼎鼎的ijkplayer也是基于此二次开发,因此很有学习价值。
这篇文章将会从main函数,自顶向下地剖析源码。
如果您对于源码感兴趣,可以查看ffplay的github地址https://github.com/FFmpeg/FFmpeg/blob/master/fftools/ffplay.c
解读源码
今天解读 ffplay.c 的最后几行代码,不多而且容易理解,哈哈。
is = stream_open(input_filename, file_iformat);
if (!is) {
av_log(NULL, AV_LOG_FATAL, "Failed to initialize VideoState!\n");
do_exit(NULL);
}
event_loop(is);
/* never returns */
return 0;
第一行代码是打开了流的操作,里面输入文件名与文件格式的参数。这个函数的实现还是挺复杂的,我给大家讲讲。
stream_open 的返回类型是 VideoState,内部实现 创建了一个空的 VideoState 变量,将文件名和文件格式的值传给它,接着初始化视频,字幕,音频的帧队列,再初始化视频,音频,字幕的包(packet)队列,接着再初始化视频,音频,字幕的时钟,应该是用来做同步的。最后给这个 VideoState 赋予其他属性,最后成功则返回这个 VideoState,否则返回 NULL。总体上,这个函数是实现音视频的帧,包和同步处理的。
接下来,如果 is 这个变量判断为 NULL,则意味音视频文件的处理失败,则打印失败信息,退出程序。
倒数第二行是 event_loop 函数,这个函数同样很复杂,是处理 GUI 发送的事件的。这内部是个无限循环,等待着用户事件的发生。比如用户操作窗口是,检测到拉伸大小,则窗口大小根据用户的拖动变化。
最后是 return 0,结束程序,返回 0。
好了,那么这个系列我们深度剖析了 ffplay.c 的 main 函数,从宏观上知道了音视频的处理过程。未来有好的想法,会写出文章分享给大家。感谢大家的时间与阅读。
如果您对之前的系列感兴趣,请查看