ffmpeg 使用ffplay 进行 hls 拉流 分析 1

ffmpeg 使用 ffplay 进行 hls 拉流 分析 1
从使用ffplay 调用 http://192.168.1.100:8080/live/livestream.m3u8 开始,进入到ffmpeg 的分析使用的协议选择相应的解复用器的步骤。
其他协议或者文件方式的使用ffplay也是这个步骤流程的。

目录:

  • 一、流程图:
  • 二、代码分析:
    • 1、ffplay.c调用avformat_open_input()进行打开文件
    • 2、进入utils.c的avformat_open_input()前面这些是一些初始化操作 分配AVFormatContext、保存参数到AVDictionary、设置参数
    • 3、utils.c的avformat_open_input()中调用init_input()进行打开文件和探测协议格式
    • 4、utils.c的init_input()中调用av_probe_input_format2()会根据后缀名探测格式
    • 5、format.c中av_probe_input_format2()调用av_probe_input_format3()
    • 6、format.c中av_probe_input_format3()
    • 7、遍历时查找到hls时调用hls_probe()返回0。这次探测格式就失败了
    • 8、utils.c中init_input()中调用io_open()默认打开操作
    • 9、io_open是在option.c中的avformat_get_context_defaults()绑定io_open_default()
    • 10、option.c中的io_open_default()中调用ffio_open_whitelist()
    • 11、aviobuf.c中ffio_open_whitelist()中调用ffurl_open_whitelist()
    • 12、avio.c中ffurl_open_whitelist()调用ffurl_alloc()创建url上下文
    • 13、avio.c中ffurl_alloc()调用url_find_protocol()查找协议
    • 14、avio.c中url_find_protocol根据url(文件名)查找协议
    • 15、avio.c中ffurl_alloc()调用url_alloc_for_protocol()根据协议创建上下文
    • 16、avio.c中url_alloc_for_protocol()创建协议上下文,进行一系列初始化操作
    • 17、avio.c中的ffurl_open_whitelist()创建url上下文后,调用ffurl_connect()进行连接
    • 18、avio.c中的ffurl_connect()根据不同的协议进行打开url操作
    • 19、 得到连接上的URLContext,返回到ffio_open_whitelist() 再调用ffio_fdopen()创建ffio_fdopen(),创建AVIOContext
    • 20、 ffio_fdopen()调用avio_alloc_context()创建AVIOContext,和一些初始化操作
    • 21、 avio_alloc_context()再调用ffio_init_context()初始化
    • 22、ffio_init_context()初始化,io_read_packet(),io_write_packet这些函数就是封装了调用URLProtocol的url_read(),url_write()。
    • 23、经过获取HTTP 协议上下文再创建AVIOContext后,返回到utils.c的init_input() 调用av_probe_input_buffer2()来读取数据
    • 24、 init_input()中调用avio_read()读取数据。 avio_read()中又封装了几层
    • 25、 avio_read()返回后就得到m3u8文件数据再调用av_probe_input_format2()就可以得到是使用ff_hls_demuxer解复用器
    • 26、 从init_input()返回到avformat_open_input()调用解复用器的read_header()
    • 27、 hls_read_header()中第一次调用parse_playlist()解析m3u8中的播放列表
    • 28、 parse_playlist()判断两次不同的调用时处理
    • 29、parse_playlist()接着读取一行判断m3u8标志和保存之前分片
    • 30、 parse_playlist()接着循环一行行读取处理
    • 31、 parse_playlist() 中判断是否嵌套m3u8做不同处理
    • 32、 parse_playlist()最后处理之前的分片
    • 33、返回hls_read_header()判断是否执行第二次parse_playlist()
    • 34、 hls_read_header()中选择开始的分片
    • 35、 hls_read_header()最后开启每个播放列表的解复用器
  • 三、关于使用参数指定输入格式时的分析:
    • 1、ffplay.c中
    • opt_format()处理指定格式参数
    • 2、format.c 中av_find_input_format()根据指定格式查找解复用器
    • 3、allformat.c中av_demuxe_iterate遍历所有解复用器

一、流程图:

在这里插入图片描述

二、代码分析:

1、ffplay.c调用avformat_open_input()进行打开文件

在这里插入图片描述

2、进入utils.c的avformat_open_input()前面这些是一些初始化操作 分配AVFormatContext、保存参数到AVDictionary、设置参数

在这里插入图片描述

3、utils.c的avformat_open_input()中调用init_input()进行打开文件和探测协议格式

在这里插入图片描述

4、utils.c的init_input()中调用av_probe_input_format2()会根据后缀名探测格式

在这里插入图片描述

5、format.c中av_probe_input_format2()调用av_probe_input_format3()

在这里插入图片描述

6、format.c中av_probe_input_format3()

在这里插入图片描述
在这里插入图片描述

7、遍历时查找到hls时调用hls_probe()返回0。这次探测格式就失败了

在这里插入图片描述
在这里插入图片描述

8、utils.c中init_input()中调用io_open()默认打开操作

在这里插入图片描述

9、io_open是在option.c中的avformat_get_context_defaults()绑定io_open_default()

在这里插入图片描述

10、option.c中的io_open_default()中调用ffio_open_whitelist()

在这里插入图片描述

11、aviobuf.c中ffio_open_whitelist()中调用ffurl_open_whitelist()

在这里插入图片描述

12、avio.c中ffurl_open_whitelist()调用ffurl_alloc()创建url上下文

在这里插入图片描述

13、avio.c中ffurl_alloc()调用url_find_protocol()查找协议

在这里插入图片描述

14、avio.c中url_find_protocol根据url(文件名)查找协议

在这里插入图片描述
得到的是ff_http_protocol
在这里插入图片描述

15、avio.c中ffurl_alloc()调用url_alloc_for_protocol()根据协议创建上下文

在这里插入图片描述

16、avio.c中url_alloc_for_protocol()创建协议上下文,进行一系列初始化操作

在这里插入图片描述

17、avio.c中的ffurl_open_whitelist()创建url上下文后,调用ffurl_connect()进行连接

在这里插入图片描述

18、avio.c中的ffurl_connect()根据不同的协议进行打开url操作

在这里插入图片描述

19、 得到连接上的URLContext,返回到ffio_open_whitelist() 再调用ffio_fdopen()创建ffio_fdopen(),创建AVIOContext

在这里插入图片描述

20、 ffio_fdopen()调用avio_alloc_context()创建AVIOContext,和一些初始化操作

在这里插入图片描述

21、 avio_alloc_context()再调用ffio_init_context()初始化

在这里插入图片描述

22、ffio_init_context()初始化,io_read_packet(),io_write_packet这些函数就是封装了调用URLProtocol的url_read(),url_write()。

在这里插入图片描述

23、经过获取HTTP 协议上下文再创建AVIOContext后,返回到utils.c的init_input() 调用av_probe_input_buffer2()来读取数据

在这里插入图片描述

24、 init_input()中调用avio_read()读取数据。 avio_read()中又封装了几层

在这里插入图片描述

25、 avio_read()返回后就得到m3u8文件数据再调用av_probe_input_format2()就可以得到是使用ff_hls_demuxer解复用器

在这里插入图片描述

26、 从init_input()返回到avformat_open_input()调用解复用器的read_header()

在这里插入图片描述

27、 hls_read_header()中第一次调用parse_playlist()解析m3u8中的播放列表

在这里插入图片描述

28、 parse_playlist()判断两次不同的调用时处理

在这里插入图片描述

29、parse_playlist()接着读取一行判断m3u8标志和保存之前分片

在这里插入图片描述

30、 parse_playlist()接着循环一行行读取处理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

31、 parse_playlist() 中判断是否嵌套m3u8做不同处理

在这里插入图片描述
在这里插入图片描述

32、 parse_playlist()最后处理之前的分片

在这里插入图片描述

33、返回hls_read_header()判断是否执行第二次parse_playlist()

在这里插入图片描述

34、 hls_read_header()中选择开始的分片

在这里插入图片描述

35、 hls_read_header()最后开启每个播放列表的解复用器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、关于使用参数指定输入格式时的分析:

1、ffplay.c中

在这里插入图片描述

opt_format()处理指定格式参数

在这里插入图片描述

2、format.c 中av_find_input_format()根据指定格式查找解复用器

在这里插入图片描述

3、allformat.c中av_demuxe_iterate遍历所有解复用器

在这里插入图片描述

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

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

相关文章

搜狗输入法输出特殊符号快捷键

https://www.petefreitag.com/cheatsheets/ascii-codes/ 参考上个编码网站大全 详细步骤为:alt长按 + 编码数字 例如:平方的编码为178-----长按alt178 即可,178是数字一个一个挨个按即可 常用的特殊符号如下: 平方&…

[BuildRelease Management]CC.NET架构

一 CC.NET的操作流程 1) 等待Trigger的唤醒; 2)从Source Control System查询上次build以后的修改列表; 3)如果任何修改被发现或是Trigger触发类型为 force the build : 3.1)为build产生一个label number&a…

python 入门到实践期末考试常出现的考试内容_Python编程入门到实践—列表篇(一)...

一、列表是什么?列表由一系列按特定顺序排列的元素组成。可以创建包含字母表中所有字母、数字0-9或所有家庭成员姓名的列表;也可以将任何东西加入列表中,其中的元素之间可以没有任何关系。列表通常包含多个元素,给列表指定一个表示…

c#中将集合写入文本_在C#中将记录插入MySQL数据库

c#中将集合写入文本In the last tutorial (how to connect with MySQL database in C#?), we learned about making the connection with MySQL database in C#. Here, in this tutorial, we will learn how to insert the records in MySQL database in C#? 在上一教程( 如何…

day1-Linux操作系统基础

该专栏所有内容笔记均来自传智播客培训班 1.什么是操作系统(operate system OS) 小议:承上启下作用,向下可以控制硬件,向上能够支持软件的运行。一个可以控制硬件的软件。 小明找小红聊天,小明打开QQ&…

关闭浏览器 清空session_跨境网络小知识之Session

跨境小伙伴们大家好,上一篇为大家介绍了Cookie,今天就为大家介绍下连接cookie的另一端Session,交互过程中,二者缺一不可。与Cookie相对,Session是存储在服务端的,他们之间是通过一个叫做sessionID的东东建立…

Dojo学习笔记(一):Hello Dojo!

欢迎来到Dojo世界!在这篇文章中你将会学习到如何加载Dojo以及探索Dojo的一些核心功能。你还会了解Dojo的基于AMD的模块架构,探索如何加载额外的模块来增加功能到您的Web站点或应用程序,并找出在出错的时如何得到帮助。让我们开始吧 开始学习D…

转:我眼中的Visual Studio 2010架构工具

来自:http://www.cnblogs.com/wayfarer/archive/2010/07/30/1788398.html我眼中的Visual Studio 2010架构工具影响架构质量的是构建体系架构的思想、原则、实践与架构师的经验,绝不是工具。即使是最优秀的架构工具,也不可能像倚天宝剑一般——…

VMware创建Ubuntu操作系统到网络配置详细流程

一、创建虚拟机 Ubuntu下载链接 1,看个人需求了,有更高的版本,下载Ubuntu镜像 2,VMware官网随便下载即可 3,创建新的虚拟机 4,自定义 5,默认即可 6,稍后安装操作系统 7&#xf…

djiango配置mysql_数据库MySQL相关环境配置以及数据库与Go的连接

Linux下安装好MySQL后,Windows安装可视化工具navicatLinux下MySQL与Windows下navicat进行连接:安装的过程很是揪心,各种查网站、大致把坑都写了出来:1、在Linux下的mysql语句中,mysql> select host,user,authentication_string…

基于HtmlParser的网络爬虫

一、 目标 获取网页中的超链接及链接名,如从http://www.hao123.com/开始,抓取所有hao123链接到的超链接,再以获取到的链接网页为目标,获取它所链接到的网页。 二、环境及开发工具 环境:Java 工具:MyEclip…

VMware下Ubuntu无法全屏显示问题

一、运行Ubuntu的时候无法全屏显示,如图所示下载VMware Tools 二、之后将下载的文件拷贝到home文件夹下 三、解压该压缩包 由于该压缩包是.tar.gz结尾的故压缩命令:tar -zxvf VMwareTools-10.2.5-8068393.tar.gz,当然各版本有可能不一样&am…

AMQP RabbitMQ

转载:http://blog.ftofficer.com/2010/03/translation-rabbitmq-python-rabbits-and-warrens/官方介绍:http://www.rabbitmq.com/erlang-client-user-guide.html开始吧AMQP当中有四个概念非常重要:虚拟主机(virtual host&#xff…

fsync与fflush的关系和区别

read/write/fsync与fread/fwrite/fflush的关系和区别 read/write/fsync: linux底层操作; 内核调用, 涉及到进程上下文的切换,即用户态到核心态的转换,这是个比较消耗性能的操作。 fread/fwrite/fflush:…

数据库系统数据库管理系统_数据库管理系统介绍

数据库系统数据库管理系统数据库 (Database) A database is a collection of related data. In database any user can efficiently access the data which users want to retrieve. It can be anything from a simple collection of roll numbers, names, addresses and phone…

srs配置文件分析

配置文件中的每一项都是一个SrsConfDirective对象。 例子:vhost 1、 整个vhost 是一个SrsConfDirective对象。 1.1、名字:std::string name vhost 1.2、参数:std::vectorstd::string args第0个值 defaultVhost 1.3、子SrsConfDirective&a…

寄存器(CPU工作原理)03 - 零基础入门学习汇编语言08

第二章:寄存器(CPU工作原理)03 让编程改变世界 Change the world by program 物理地址 CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。 我们将这个唯一的地址称为物理地址。 16位结构的CPU…

Anaconda下安装OpenCV和Tensorflow(最简洁高效的方法)

安装Tensorflow 1,打开Anaconda Navigator 2,手动创建tensorflow环境,这个和你的python版本号一致哈(方法一第一步之后,输入python即可查看当前的版本) 3,手动搜索并下载添加 4,…

使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符

我们经常会碰到需要fork子进程的情况,而且子进程很可能会继续exec新的程序。这就不得不提到子进程中无用文件描述符的问题! fork函数的使用本不是这里讨论的话题,但必须提一下的是:子进程以写时复制(COW,C…

Anaconda中下载速度贼慢?

清华镜像 大致步骤如下: 1,windsR输入cmd,打开命令终端页面 输入conda config --set show_channel_urls yes 2,在相应的C盘目录下会生成.condarc文件 3,用记事本或者notepad打开进行替换 channels:- defaults show_c…