《ffplay的数据结构分析》
《ffplay分析(视频解码线程的操作)》
《ffplay分析(音频解码线程的操作)》
《ffplay 分析(音频从Frame(解码后)队列取数据到SDL输出)》
《ffplay分析 (视频从Frame(解码后)队列取数据到SDL输出)》
《ffplay分析 (音视频同步:主时钟为音频)》
《ffplay分析 (暂停 / 播放处理)》
《ffplay分析 (seek操作处理)》
ffplay从启动到读取线程的操作分析(版本:ffmpeg-4.2.1)
- 一、分析:
- 1、main():初始化ffmpeg
- 2、main():ffplay 命令行参数的解析处理
- 3、main():SDL初始化
- 4、main():解码器的冲刷Packet初始化
- 5、main():SDL创建窗口
- 6、main():打开各种流并且启动读取数据线程
- 7、stream_open():分配VideoState保存文件名
- 8、stream_open():初始化Frame队列(解码后)/Packet队列(解码前),初始化用于控制读取线程休眠的条件变量
- 9、stream_open():初始化时钟、初始化音量
- 10:stream_open():启动读取数据线程
- 11:read_thread():初始化各个流的默认索引值、初始化ffmpeg读取中断回调函数
- 12、read_thread():打开文件操作(avformat_open_input()、avformat_find_stream_info())
- 13、read_thread():处理是否指定播放的起始时间和是否是实时流数据
- 14、read_thread():设置各个流的流索引
- 15、read_thread():设置显示窗口宽高
- 16、read_thread():打开各个流操作
- 17、read_thread():实时流判断设置缓冲区不限制
- 18、read_thread():循环读取数据(判断是否请求退出、是否暂停网络流操作)
- 19、read_thread():循环读取数据(判断是否有seek操作)
- 20、read_thread():循环读取数据(判断video是不是attachments_pic)
- 21、read_thread():循环读取数据(判断队列是否已经有足够的数据)
- 22、read_thread():循环读取数据(判断是否已经播放完毕)
- 23、read_thread():循环读取数据(执行av_read_frame()读取帧数据)
- 24、read_thread():循环读取数据(判断帧是否在播放范围内,插入到相应的Packet(解码前)队列)
- 25、read_thread():循环读取数据(线程退出处理)
一、分析:
1、main():初始化ffmpeg
2、main():ffplay 命令行参数的解析处理
3、main():SDL初始化
4、main():解码器的冲刷Packet初始化
5、main():SDL创建窗口
6、main():打开各种流并且启动读取数据线程
7、stream_open():分配VideoState保存文件名
8、stream_open():初始化Frame队列(解码后)/Packet队列(解码前),初始化用于控制读取线程休眠的条件变量
9、stream_open():初始化时钟、初始化音量
10:stream_open():启动读取数据线程
11:read_thread():初始化各个流的默认索引值、初始化ffmpeg读取中断回调函数
12、read_thread():打开文件操作(avformat_open_input()、avformat_find_stream_info())