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.pswp.cn/news/378926.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378926.shtml
英文地址,請注明出處:http://en.pswp.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…