ffplay分析 (视频从Frame(解码后)队列取数据到SDL输出)
《ffplay的数据结构分析》
《ffplay分析(从启动到读取线程的操作)》
《ffplay分析(视频解码线程的操作)》
《ffplay分析(音频解码线程的操作)》
《ffplay 分析(音频从Frame(解码后)队列取数据到SDL输出)》
《ffplay分析 (音视频同步:主时钟为音频)》
《ffplay分析 (暂停 / 播放处理)》
《ffplay分析 (seek操作处理)》
《ffplay源码(版本:ffmpeg-4.2.1)》
ffplay分析 (视频从解码后队列取数据到SDL输出)
- 一、分析:
- 1、main():在main()函数开始时有创建SDL窗口的处理
- 2、read_thread():开启读取线程后,在read_thread()读取数据线程中设置视频流时调用set_default_window_size()设置显示窗口的默认大小和渲染区域大小
- 3、set_default_window_size():判断命令行是否有指定宽高没有就使用帧宽高,作为窗口宽高调用calculate_display_rect()计算渲染区域
- 4、calculate_display_rect():使用像素比例计算实际宽高比
- 5、calculate_display_rect():首先使用高度为基准计算渲染区域,如果宽度大于实际窗口再以宽度为基准重新计算
- 6、calculate_display_rect():计算保存返回上层的渲染区域参数
- 7、event_loop():SDL的事件循环调用了refresh_loop_wait_event()进行更新显示和获取SDL事件(在主线程更新,event_loop()在主线程调用)
- 8、refresh_loop_wait_event():调用SDL_PumpEvents()、SDL_PeepEvents()、获取SDL事件。如果没有事件才进入while更新画面,否则返回上一层处理相应事件。
- 9、refresh_loop_wait_event():调用usleep()等待同步和设置remaining_time默认等待时间
- 10、refresh_loop_wait_event():调用video_refresh()进行视频更新
- 11、video_refresh():判断是否是实时流操作
- 12、video_refresh():判断是否是音频流显示操作
- 13、video_refresh():视频流显示操作,如果没有数据就什么不做
- 14、video_refresh():获取上一帧显示的帧和将要显示的一帧,用来计算同步时间操作
- 15、video_refresh():判断将要显示的一帧的序列与现在解码的不同就直接抛弃,重新获取
- 16、video_refresh():判断是否是新的播放序列,重置is->frame_timer
- 17、video_refresh():判断是否暂停,直接保持显示
- 18、video_refresh():计算上一帧持续显示的时长
- 19、video_refresh():根据计算得到的delay判断是否继续显示上一帧还是往下走继续更新
- 20、video_refresh():根据is->frame_timer用于下一轮的操作
- 21、video_refresh():更新当前的视频时钟
- 22、video_refresh():判断是否进行丢帧处理
- 23、video_refresh():调用frame_queue_next()移动到下一帧
- 24、video_refresh():调用video_display()真正开始渲染画面的操作
- 25、video_display():判断是视频流调用video_image_display()显示
- 26、video_image_display():获取将要显示的这一帧![在这里插入图片描述](https://img-blog.csdnimg.cn/20210128164947276.png)
- 27、video_image_display():调用calculate_display_rect()根据窗口比例计算渲染区域(图像)的宽高,调用upload_texture()将frame的yuv更新到is->vid_texture(SDL_Texture)
- 28、video_display():video_image_display()结束后,返回到video_display()最终调用SDL_RenderPresent()显示画面
一、分析:
1、main():在main()函数开始时有创建SDL窗口的处理
2、read_thread():开启读取线程后,在read_thread()读取数据线程中设置视频流时调用set_default_window_size()设置显示窗口的默认大小和渲染区域大小
3、set_default_window_size():判断命令行是否有指定宽高没有就使用帧宽高,作为窗口宽高调用calculate_display_rect()计算渲染区域
4、calculate_display_rect():使用像素比例计算实际宽高比
5、calculate_display_rect():首先使用高度为基准计算渲染区域,如果宽度大于实际窗口再以宽度为基准重新计算
6、calculate_display_rect():计算保存返回上层的渲染区域参数
7、event_loop():SDL的事件循环调用了refresh_loop_wait_event()进行更新显示和获取SDL事件(在主线程更新,event_loop()在主线程调用)
8、refresh_loop_wait_event():调用SDL_PumpEvents()、SDL_PeepEvents()、获取SDL事件。如果没有事件才进入while更新画面,否则返回上一层处理相应事件。
9、refresh_loop_wait_event():调用usleep()等待同步和设置remaining_time默认等待时间
10、refresh_loop_wait_event():调用video_refresh()进行视频更新
11、video_refresh():判断是否是实时流操作
12、video_refresh():判断是否是音频流显示操作
13、video_refresh():视频流显示操作,如果没有数据就什么不做
14、video_refresh():获取上一帧显示的帧和将要显示的一帧,用来计算同步时间操作
15、video_refresh():判断将要显示的一帧的序列与现在解码的不同就直接抛弃,重新获取
16、video_refresh():判断是否是新的播放序列,重置is->frame_timer
17、video_refresh():判断是否暂停,直接保持显示
18、video_refresh():计算上一帧持续显示的时长
19、video_refresh():根据计算得到的delay判断是否继续显示上一帧还是往下走继续更新
20、video_refresh():根据is->frame_timer用于下一轮的操作
21、video_refresh():更新当前的视频时钟
22、video_refresh():判断是否进行丢帧处理
23、video_refresh():调用frame_queue_next()移动到下一帧
24、video_refresh():调用video_display()真正开始渲染画面的操作
25、video_display():判断是视频流调用video_image_display()显示
26、video_image_display():获取将要显示的这一帧
27、video_image_display():调用calculate_display_rect()根据窗口比例计算渲染区域(图像)的宽高,调用upload_texture()将frame的yuv更新到is->vid_texture(SDL_Texture)
28、video_display():video_image_display()结束后,返回到video_display()最终调用SDL_RenderPresent()显示画面
ffplay分析 (视频从Frame(解码后)队列取数据到SDL输出)相关推荐
- ffplay 分析(音频从Frame(解码后)队列取数据到SDL输出)
<ffplay的数据结构分析> <ffplay分析(从启动到读取线程的操作)> <ffplay分析(视频解码线程的操作)> <ffplay分析(音频解码线程的 ...
- 模拟web访问有登录且有验证码的登录后抓取数据
模拟web访问有登录且有验证码的登录后抓取数据 1 取验证码 1 在窗体上放一个picturebox (imgValidate)存放获取的验证码图片, 2 用浏览器的开发者工具firefox (f12 ...
- python登录网站后爬取数据_需要登陆网站后才能获取数据的页面爬取
本文转载自以下链接:https://www.makcyun.top/web_scraping_withpython8.html 目的是万一博主网站无法访问到的话自己需要学习的东西可就不存在了. 本文需 ...
- python登录网站后爬取数据_用 Python 登录主流网站,我们的数据爬取少不了它
不论是自然语言处理还是计算机视觉,做机器学习算法总会存在数据不足的情况,而这个时候就需要我们用爬虫获取一些额外数据.这个项目介绍了如何用 Python 登录各大网站,并用简单的爬虫获取一些有用数据,目 ...
- python登录网站后爬取数据_如何用 Python 登录主流网站,爬取一些需要的数据
最近收集了一些网站的登陆方式和爬虫程序,有的通过 selenium 登录,有的则通过抓包直接模拟登录.作者希望该项目能帮助初学者学习各大网站的模拟登陆方式,并爬取一些需要的数据. 作者表示模拟登陆基本 ...
- python登录网页后抓取数据_Python抓取网页数据的终极办法
Pandas库有一种内置的方法,可以从名为read_html()的html页面中提取表格数据: https://pandas.pydata.org/import pandas as pdtables ...
- python登录网站后爬取数据_快速爬取登录网站数据
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 部分网站需要登录才能允许访问,因此爬虫需要获取登录cookie,然后通过爬虫代理使用该cookie进行数据采集.本示例按照以上流程进行实现如下: 1 模拟 ...
- ffplay分析 (音视频同步:主时钟为音频)
<ffplay的数据结构分析> <ffplay分析(从启动到读取线程的操作)> <ffplay分析(视频解码线程的操作)> <ffplay分析(音频解码线程的 ...
- ffplay分析(从启动到读取数据线程插入到字幕、音频、视频解码前的队列操作)
<ffplay的数据结构分析> <ffplay分析(视频解码线程的操作)> <ffplay分析(音频解码线程的操作)> <ffplay 分析(音频从Frame ...
最新文章
- LeetCode每日一题:回文链表(No.234)
- Windows下RStudio环境安装
- Spring Cloud Config采用Git存储时两种常用的配置策略
- 【推导】【数学期望】Gym - 101237D - Short Enough Task
- count() * ,1,字段 三兄弟
- 轻松访问 Android 系统源码与下载
- antd 日期时间选择_Excel最全时间类函数总结,有必要收藏一下哦
- mysql数据库对象管理_MySQL管理与优化(15):优化数据库对象
- 【CFD学习】yplus,y+,边界层理论,壁面第一层网格
- [操作系统] FAT文件系统概述
- 简单JAVA版本淘宝客程序上线
- 如何测身高未来身高计算机,第2课 预测身高——编程解决问题的基本步骤
- revit附加模块 sat_revit附加模块怎么弄?如何解决Revit附加模块加载失败问题
- Postgresql逻辑复制报错could not start WAL streaming: ERROR: replication slot “x“is active for PID xxx
- appium调用了click函数的无反应
- Angular8简单方式实现表格固定表头和冻结列
- ABP实践(5)-abp前端vue框架之IView实现三级菜单(博友需要特此分享)
- 报名 | 相约杭州,我们来聊聊区块链技术与行业应用落地
- 【1024】写给最好的你-程序员
- 支付宝技术专家李战斌:安防视频行为分析系统的技术演进及应用场景 | 2018FMI人工智能与大数据高峰论坛(深圳站)
热门文章
- antd listView中onEndReached()失效
- WebUploader点击上传文件选择框会延迟几秒才会显示
- 解析PHP跳出循环的方法以及continue、break、exit的区别介绍
- php mongodb
- 使用搜索栏过滤collectionView(按照首字母)
- (Android Studio)添加文本框
- VS2008下QT开发环境搭建
- python 怎么算l2范数_数学推导+纯Python实现机器学习算法13:Lasso回归
- edger多组差异性分析_简单使用DESeq2/EdgeR做差异分析
- python polar函数_Python可视化很简单,可是你会吗?python绘制饼图、极线图和气泡图,让我来教教你吧,一文教会!!!...