学习ffplay也有一段时间了,打算写几篇文章记录一下。
ffplay版本:4.1
ffplay源码只有3000多行,但是其中包含了音视频播放,前进/后退,暂停/继续,切换音视频流,逐帧播放等功能,可以说比较全面了。
ffplay总的简略流程图如下所示:
(1)在steam_open()函数中,创建了一个线程read_thread()。在这个线程中,循环调用av_read_frame(),获取packet放入packet队列中。如果队列满了,则线程等待,等待视频或音频解码线程消耗pakcet,发出信号,然后read_thread线程继续读取packet。
ffplay创建了三个packet队列:视频packet队列,音频packet队列、字幕packet队列。pakcet队列,用的是链表构造的。
(2)在stream_component_open函数中创建了一个视频解码线程video_thread,一个音频解码线程audio_thread()。video_thread线程从视频packet队列中循环读取packet,解码后,将得到的frame存入视频frame队列。如果队列满了,则线程等待,等待frame被播放消耗,然后线程继续。音频线程一样。
ffplay中创建了三个frame队列:视频frame队列,音频frame队列,字幕frame队列。frame