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()显示画面

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis 备份导出rdb_Redis数据迁移利器之redisshake

“当需要进行Redis实例或集群数据迁移时,我们可以采用导出/导入的方式进行数据迁移,但当需要做数据异地灾备或双活时,再使用传统的方式就不合适了,我们需要借助工具(如redis-port/redis-shake)来完成。”redis-shake介绍redis-sha…

线性结构常规操作(四)

定义存储结构(以单向链表为主) 对于链表的定义,通过结构体进行定义,包括两部分,一是数据域,另一个就是指针,用于指向下一个节点。 1,创建链表 定义链表: struct nodesq{int data;//数据域&a…

ffplay分析 (暂停 / 播放处理)

《ffplay的数据结构分析》 《ffplay分析(从启动到读取线程的操作)》 《ffplay分析(视频解码线程的操作)》 《ffplay分析(音频解码线程的操作)》 《ffplay 分析(音频从Frame(解码后)队列取数据到…

源码 状态机_[源码阅读] 阿里SOFA服务注册中心MetaServer(1)

[源码阅读] 阿里SOFA服务注册中心MetaServer(1)0x00 摘要0x01 服务注册中心1.1 服务注册中心简介1.2 SOFARegistry 总体架构1.3 为什么要分层0x02 MetaServer2.1简介2.2 问题0x03 代码结构0x04 启动运行4.1 集成部署4.2 独立部署0x05 总体逻辑5.1 程序主体5.2 配置0x06 启动6.1…

HttpService远程校验

今天学了下HttpService,和大家分享一下。HttpService是用来读取远程数据的一个对象,数据格式为XML。 我做了一个登陆校验的功能,主要是通过HttpService将服务器端的用户数据得到,然后在客户端判断输入的用户名和密码是否存在。 主…

免费开源FTP Server软件FileZilla Server

很多朋友在实际应用中都可能需要用到FTP Server类的软件,这类软件有很多,比较知名的有Serv-U、G6等,这里向大家介绍一下FileZilla Server,Windows平台下一款不错的FTP Server软件,而且是免费的、开源的。 S…

ffplay分析 (seek操作处理)

《ffplay的数据结构分析》 《ffplay分析(从启动到读取线程的操作)》 《ffplay分析(视频解码线程的操作)》 《ffplay分析(音频解码线程的操作)》 《ffplay 分析(音频从Frame(解码后)队列取数据到…

android 代码设置 键盘适应_硬核软件,能在电脑上控制iPhone和Android手机

在电脑上控制手机大概已经不是什么新鲜操作,小米、华为都为自家手机和电脑的联动推出了同屏操作之类的功能,此外也可以通过开源软件Scrcpy来在Windows或者macOS上实现对安卓手机的控制,这些基本都只针对安卓手机。近期,奇客君发现…

ijkplayer 消息循环处理过程分析

ijkplayer 消息循环处理过程分析简介一、消息队列初始化1、 initWithContentURLString函数2、 ijkmp_ios_create函数3、 ijkmp_create函数二、消息队列的消息循环处理函数启动1、prepareToPlay函数2、ijkmp_prepare_async函数3、ijkmp_prepare_async_l函数4、ijkmp_msg_loop函数…

json解析对应的value为null_徒手撸一个JSON解析器

Java大联盟致力于最高效的Java学习关注作者 | 田小波cnblogs.com/nullllun/p/8358146.html1、背景JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。相对于另一种数据交换格式 XML,JSON 有着诸多优点。比如易读性更好,占用空间更少等。在 …

平院Python习题

在读写文件之前,用于创建文件对象的函数是( A )。 A. open B. create C. file D.folder 解析: open(file, mode‘r’, buffering-1, encodingNone, errorsNone, newlineNone, close…

搭建srs服务器(rtmp)

搭建srs服务器(rtmp) 目录:1、下载srs源码(从码云上):2、 切换到srs.oschina:3、 这里使用3.0版本:4、 切换到trunk:5、 编译:6、 启动:7、查看日志输出&…

2560介绍_炒股高手收益翻10倍,只因妙用这一招2560战法,看了都不亏了

(本文由公众号越声研究(yslc927yj)整理,仅供参考,不构成操作建议。如自行操作,注意仓位控制和风险自负。)选股是每个刚入市的新股民需掌握的技巧,通过资金选股了解资金流向,善用工具轻松选股,同时多留意行业…

rtmp协议分析(三次握手)

RTMP详细分析(Message 消息,Chunk分块) librtmp分析(发送数据包处理) librtmp分析(接收数据包处理) RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应 用层的协…

合并文件夹中子目录_01 Linux之统计文件夹中文件个数以及目录个数

案例分析:今天遇到了一个需要统计路径下目录个数的问题如果一个一个的去数会很麻烦,找到了一篇文章刚好提到这个,于是我将方法整理了一下。该方法的链接:Linux统计文件夹中文件个数以及目录个数_SG匚hang的博客-CSDN博客_linux统计…

关于Makefile,Makefile.in,Makefile.am,Configure功能及相互关系的问题

目录makefile写法1. 简介2. 上路之前3. 一个简单的例子4.说明:4.1、autoscan4.2、 configure.scan4.3、aclocal4.4、autoconf4.5、Makefile.am4.6、 automake4.7、Makefilemakefile写法 在 Unix 上写程式的人大概都碰过 Makefile,尤其是用 C 来开发程式…

西安理工大学863(转载)

原创:https://blog.csdn.net/mzj15101229871/article/details/107613162 (博主总结的很完整,很厉害,本人为了查看方便,才转载的。本人只是个小白~) 第一章 绪论 考试大纲 1)了解数据元素、数…

原理简介_消息通信的利器MQTT协议简介及协议原理

- 没用过但是必须得知道系列 -前言:相比于 XMPP, MQTT 的简单轻量受到了不少工程师的喜爱,从物联网到传统的消息服务,简单可依赖的 MQTT 到底为何让人如此着迷呢?MQTT 协议-MQTT 协议简介及协议原理MQTT(Me…

rtmp协议分析(Message 消息,Chunk分块)

RTMP详细分析(三次握手) librtmp分析(发送数据包处理) librtmp分析(接收数据包处理) 目录1、Message(消息)2、Chunking(Message 分块)2.1、 Basic Header(基本的头信息)2.1.1、Basic Header为1个字节时2.1.…

将Sharepoint Server 2010部署到WINDOWS 7

首先祝CNBLOGS上的筒子们新年快乐。Sharepoint 2010 BETA版发布已经有段时间了,总是感觉MS的步伐要比我们这些追逐他的人快很多,不过确实他的每一次革新总给我们带来了惊喜。 前几天报名参加了SHAREPOINT 2010 DAY 活动(详情),等待着1月16日体…