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是数字一个一个挨个按即可 常用的特殊符号如下: 平方&…

echo 12345678 | base64 产生的结果跟12345678真正的base64编码不对

echo "12345678" | base64 产生的结果跟"12345678"真正的base64编码不对 弄了好久才搞清楚,echo 命令是带换行符的,改成echo -n "12345678" | base64就没问题了转载于:https://www.cnblogs.com/senix/archive/2013/01/30/…

[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#? 在上一教程( 如何…

read/fread write/fwrite 的区别

fread就是通过read来实现的,fread是C语言的库,而read是系统调用。 差别在read每次读的数据是调用者要求的大小,比如调用者要求读取10个字节数据,read就会从内核缓冲区(操作系统开辟的一段空间用来存储磁盘上的数据&am…

如何在子网中访问上层网络的计算机文件夹

场景 公司路由器A,直接接外部网线,内部ip192.168.11.1,lan口又接了路由器A1,IP为192.168.11.2,A1的lan端口接了一台电脑A,Ip为192.168.0.2,接了另外一个路由A2,Ip为192.168.11.3&…

基于Web的套打方案分析

应用web化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为基于web的应用,客户端的规则很简单,容易学习,容易维护,容易发布。但对程序员来说,因为浏览器的局限…

day1-Linux操作系统基础

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

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

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

我和乘子交替方向法admm_找到最大和交替子序列

我和乘子交替方向法admmProblem statement: 问题陈述: Given a sequence of numbers, you have to find the maximum sum alternating subsequence and print the value. A sequence is an alternating sequence when it will be maintain like (increasing) ->…

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…

缓冲文件系统(fopen/fread/fwrite)和非缓冲文件系统(open/read/write)

open:系统调用,返回的是文件描述符,即文件句柄,是文件在文件描述副表里的索引。 fopen:C语言库函数,返回的是一个指向文件结构的指针。fopen是ANSI C标准中的C语言库函数,在不同的操作系统中应…

java 继承示例_Java中的继承类型以及示例

java 继承示例Prerequisite: Inheritance and its implementation in Java 先决条件: 继承及其在Java中的实现 Java中的继承类型 (Type of inheritance in Java) In Java programming, there are following types of the inheritances, 在Java编程中,有…

基于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…