main入口函数分析

news2024/12/29 10:09:49

在开始讲解之前,分享一些阅读 项目代码的经验。无论学习哪方面的知识,都是需要正反馈才能继续学下去。在学习开源项目的时候,如果不掌握一些比较好的方法,会比较难拿到正反馈,或者要坚持学习很久才能拿到正反馈。

我个人学习开源项目的方法如下:

1,配置好项目的调试环境。

调试环境 优先选择 clionvs2019qt creator,次要选择 gdbWinDbg

调试器是你攻克开源项目的神兵利器,调试器 会把 所有 数据结构的变换,逻辑流转,完完整整地呈现在你的面前,特别是 一些 集成开发环境,变量,内存,寄存器的观察会更加容易方便。

2,找到项目的一个最简单的场景去切入分析。

一个庞大的开源项目,通常会有非常多的逻辑分支,流程流转,也有非常多的场景应用。撒胡椒面 式地阅读代码,会容易迷失在错综复杂的代码逻辑里面,拿到正反馈的时间越来越长。

对于一个庞大的项目,一个比较有效的方法是找到一个简单的场景,一条直线地追踪下去,那些旁路侧枝,不会跑进去的条件,就不要浪费时间去看。

等理解完一个简单的场景之后,再回去看那些有点关联的 旁路侧枝,就会更容易看懂。

本章节 采用 clion 来调试 FFplay 的代码,推荐阅读《用Ubuntu18与clion调试FFmpeg》


本章分析 FFplay 播放器,也是采用一个最简单的场景切入去分析,也就是简简单单播放一个视频文件,命令如下:

juren-5s.mp4 的下载地地址:GitHub

ffplay -i juren-5s.mp4

上面的命令中,我没有用其他的命令参数,例如设置窗口大小,硬件加速,滤镜,等等这些参数。因为在此时此刻,这些多余参数,就是旁路侧枝

我们只需先搞懂,ffplay 是怎么 从 mp4 文件读取数据,又是如何解码,如何播放的。下面正式开始:


ffplay.c 里面main() 入口函数的流程图如下:

 代码如下:


上面的流程 分两部分讲,非重点函数 跟 重点函数。

非重点函数如下:

1,init_dynload(),设置动态库加载规则,这是一个安全函数,在 Windows 系统,默认会从当前目录加载 DLL,这容易被攻击。这个函数就是把当前目录的路径从加载规则里面去掉,里面调的是 SetDllDirectory("")

2,show_banner(),打印 ffplay 这个软件的 版权,版本之类的信息。可以删掉他,让控制台更简洁。


重点函数如下:

1,parse_options(),解析命令行参数,虽然这是一个重点函数,但是为了力求简单,我会一笔带过。本文只用到 一个 -i 参数,所以这个函数在这里的作用就是设置 input_filename 全局变量。在 《parse_options函数分析》会详细讲解 命令行解析。

2,SDL_CreateWindow(),创建 SDL 窗口,具体请看 SDL官方文档。

3,stream_open(),这个函数是重中之重,上图中可以看到,可能会有 4 个线程从 stream_open() 里面诞生。先来讲一下这 4 个线程的作用。

read_thread() :从 网络或者硬盘里面读取 AVPacket,读取到之后放进去 PacketQueue 队列。

audio_thread() :从 PacketQueue audioq 队列拿 AVPacket,然后丢给解码器解码,解码出来 AVFrame 之后,再把 AVFrame 丢到 FrameQueue 队列。

video_thread() :从 PacketQueue videoq 队列拿 AVPacket,然后丢给解码器解码,解码出来 AVFrame 之后,再把 AVFrame 丢到 FrameQueue 队列。

subtitle_thread() :字幕线程,由于 ffplay 的字幕播放有点不完善,不必关注。

上面的 4 个线程 不一定会创建,如果 mp4 文件里面没有音频流,就不会创建 audio_thread() 线程,其他的线程 类推。

这 4 个线程之间的关系如下:


read_thread 是生产者,而 audio_thread 跟 video_thread 是消费者。


最后一个重点函数是 event_loop(),这个函数是一个死循环,主要的任务就是不断 处理键盘按键事件 跟 播放视频帧。推荐阅读 《event_loop函数分析》。

至此,ffplay.c 的 main() 函数就讲解完毕了,由于 FFplay 播放器的函数封装都做得不错,所以 main 函数看起来是非常简洁的。主要功能都在各个子函数里面完成。


推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:

Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

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

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

相关文章

JAVA毕业设计——基于Springboot的动漫论坛系统(源代码+数据库+ppt文档)

github代码地址 https://github.com/ynwynw/cartoonForum-public 毕业设计所有选题地址 https://github.com/ynwynw/allProject #动漫论坛系统 #java web #java #毕业设计 #课程设计 #JPa #Springboot #mysql #源代码 基于Springboot的动漫论坛系统(源代码数据库ppt文档)040 …

Python文件操作注意事项

今天继续给大家介绍Python相关知识,本文主要内容是Python文件操作注意事项。 一、文件操作流程注意事项 在文章Python文件操作详解(一)中,我们讲解过,文件操作的流程是打开文件——操作文件——关闭文件。如果我们在…

设计用于汽车和车身SPC58NH92C3RMI0X\SPC560B50L1B4E0X微控制器

SPC560B50x系列 32 位微控制器是集成汽车应用控制器的最新成就。它属于一个不断扩大的以汽车为中心的产品家族,旨在解决下一波汽车内部的车身电子应用。该汽车控制器系列的先进且经济高效的主机处理器核心符合 Power Architecture 嵌入式类别,仅实现 VLE…

Qt扫盲-QRadioButton理论总结

QRadioButton理论总结1. 简介2. 自动排外3. 信号槽4. 外观&快捷键1. 简介 QRadioButton是一个选项按钮,可以打开(选中)或关闭(未选中)。单选按钮通常为用户提供”众多”选项之一。在一组单选按钮中,一…

黑客隔空盗密码,你的账户安全吗?

一、NFC卡防互动,怎样才能更安全? 想知道黑客如何破解你的设备,盗取你的信息吗?这一黑科技设备将向你展示黑客是如何隔空盗取你银行卡的账号密码的。 模拟黑客使用一张RFID读卡器,近距离靠近你的银行卡时,…

java毕设_第172期ssm高校毕业生就业满意度调查统计系统_计算机毕业设计

java毕设_第172期ssm高校毕业生就业满意度调查统计系统_计算机毕业设计 【源码请到下载专栏下载】 今天分享的项目是《ssm高校毕业生就业满意度调查统计系统》 该项目分为2个角色,管理员和用户。 用户可以浏览前台,包含功能有:进行问卷提交、 就业咨询、试题列表进行…

Mentor-dft 学习笔记 day40-Saving Timing Patterns(1)

Timeplate Examples 例如,移位周期40ns,占空比为50%,timeplate所示: timeplate tp_shift force_pi 0; measure_po 5; pulse_clock 10 20; period 40; end;拉伸的timeplate可用于将时钟脉冲延迟40ns,同时保持相同的20…

计算机研究生就业方向之运营商(移动,联通,电信)

我一直跟学生们说你考计算机的研究生之前一定要想好你想干什么,如果你只是转码,那么你不一定要考研,至少以下几个职位研究生是没有啥优势的: 1,软件测试工程师(培训一下就行) 2,前…

[附源码]Nodejs计算机毕业设计基于Java网络游戏后台管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

HackTheBox Precious CVE-2022-25765利用,YAML反序列化攻击提权

靶机网址: https://app.hackthebox.com/machines/Precious枚举 使用nmap枚举靶机 nmap -sC -sV 10.10.11.189发现域名,我们本地DNS解析一下 echo "10.10.11.189 precious.htb" >> /etc/hosts然后访问网站 CVE-2022-25765利用 他的功…

网络流量分析帮助企业提升OA应用性能(一)

需求简介 某外高桥公司的OA系统是其重要的业务系统,OA系统负责人表示,部分用户反馈,访问OA系统时比较慢。需要通过分析系统看一下实际情况。 信息部已对企业领导定义了独立的组,本次要主动分析OA使用体验快慢。如果OA系统存在访…

mybatis入门02:Mybatis核心文件配置

目录 2.1 MyBatis核心配置文件层级关系 2.2MyBatis常用配置解析 1.environments标签 2.mapper标签 3.properties标签 4.typeAlisases标签 2.3 Mybatis相应的API 1.SqlSessionFactory工厂构造器SqlSessionFactoryBuilder 2.SqlSession工厂对象SqlSessionFactory 3.SqlSe…

实时监控网络流量,精准辨别网络性能瓶颈

网络流量反映网络运作状态,是辨别网络运行是否正常的关键指标,通过对网络流量进行监测不仅能反映交换机、路由器等设备的工作状态,更能体现整个网络资源的运行性能。同时,用户在网络中的行为可以通过其承载的流量动态来展现&#…

使用个从版gitee时向远程库push修改后内容时报remote: error: File: xxx 129.03 MB, exceeds 100.00 MB

1、报错时截图如下(我以下所有命令都是在Git Bash中执行的): 这是先前git push报的提示,明显说LFS(即large file system,此处大文件应该就是指过超过100M的单一文件)仅仅针对企业版gitee用户才…

.Net 7 CLR和ILC编译函数过程

楔子 由于甲方的需求,随着研究深入,发现CLR编译函数与ILC编译是两种不同的截然方式,除了JIT部分编译一样,其它部分貌似完全不一。 本篇来梳理这些东西。QQ:676817308。wx公众号:江湖评谈 示例: 作为例子…

OH----基于RK3568的AB分区功能,bsp部分

1、背景: OH master 主线 ,RK3568平台添加AB分区功能,uboot部分完成对ab分区标志位的读取解析,并加载和进入对应的分区,如: kernel_a 或者 kernel_b 2、环境: rk3568 Uboot代码下载&#xff…

股票L2接口和L1接口有什么差距?

股票L2数据的主要特点是能看到资金流向和十档买卖盘,比L1数据更加清晰和全面。 但是就现在的股票市场而言,也不能全部听信L2数据。 很多数据也是庄家做出来的,就是为了给散户看,所以全面分析基本面和技术面才是最重要的。 而且…

[附源码]计算机毕业设计个人博客系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…

【CSS】多行文字保持垂直居中,移动端布局,grid布局,居中总结

❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录多行文字垂直居中方法一方法2方法3方法四移动端布局viewport标签典型的手机网页设计grid布局grid…

基于C语言+SQL Server2008实现(控制台)图书管理系统【100010024】

第1章 概述 1.1项目背景 随着科技的发展,尤其是计算机技术的迅猛发展,图书馆管理的问题从以往的人工管理,到现在的电脑化,系统化,是对图书馆管理方法的质的飞跃,这些技术不仅让图书馆管理变得更加方便、快…