ffmpeg 使用ffplay 进行 hls 拉流 分析 1
生活随笔
收集整理的這篇文章主要介紹了
ffmpeg 使用ffplay 进行 hls 拉流 分析 1
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
ffmpeg 使用 ffplay 進(jìn)行 hls 拉流 分析 1
從使用ffplay 調(diào)用 http://192.168.1.100:8080/live/livestream.m3u8 開(kāi)始,進(jìn)入到ffmpeg 的分析使用的協(xié)議選擇相應(yīng)的解復(fù)用器的步驟。
其他協(xié)議或者文件方式的使用ffplay也是這個(gè)步驟流程的。
目錄:
- 一、流程圖:
- 二、代碼分析:
- 1、ffplay.c調(diào)用avformat_open_input()進(jìn)行打開(kāi)文件
- 2、進(jìn)入utils.c的avformat_open_input()前面這些是一些初始化操作 分配AVFormatContext、保存參數(shù)到AVDictionary、設(shè)置參數(shù)
- 3、utils.c的avformat_open_input()中調(diào)用init_input()進(jìn)行打開(kāi)文件和探測(cè)協(xié)議格式
- 4、utils.c的init_input()中調(diào)用av_probe_input_format2()會(huì)根據(jù)后綴名探測(cè)格式
- 5、format.c中av_probe_input_format2()調(diào)用av_probe_input_format3()
- 6、format.c中av_probe_input_format3()
- 7、遍歷時(shí)查找到hls時(shí)調(diào)用hls_probe()返回0。這次探測(cè)格式就失敗了
- 8、utils.c中init_input()中調(diào)用io_open()默認(rèn)打開(kāi)操作
- 9、io_open是在option.c中的avformat_get_context_defaults()綁定io_open_default()
- 10、option.c中的io_open_default()中調(diào)用ffio_open_whitelist()
- 11、aviobuf.c中ffio_open_whitelist()中調(diào)用ffurl_open_whitelist()
- 12、avio.c中ffurl_open_whitelist()調(diào)用ffurl_alloc()創(chuàng)建url上下文
- 13、avio.c中ffurl_alloc()調(diào)用url_find_protocol()查找協(xié)議
- 14、avio.c中url_find_protocol根據(jù)url(文件名)查找協(xié)議
- 15、avio.c中ffurl_alloc()調(diào)用url_alloc_for_protocol()根據(jù)協(xié)議創(chuàng)建上下文
- 16、avio.c中url_alloc_for_protocol()創(chuàng)建協(xié)議上下文,進(jìn)行一系列初始化操作
- 17、avio.c中的ffurl_open_whitelist()創(chuàng)建url上下文后,調(diào)用ffurl_connect()進(jìn)行連接
- 18、avio.c中的ffurl_connect()根據(jù)不同的協(xié)議進(jìn)行打開(kāi)url操作
- 19、 得到連接上的URLContext,返回到ffio_open_whitelist() 再調(diào)用ffio_fdopen()創(chuàng)建ffio_fdopen(),創(chuàng)建AVIOContext
- 20、 ffio_fdopen()調(diào)用avio_alloc_context()創(chuàng)建AVIOContext,和一些初始化操作
- 21、 avio_alloc_context()再調(diào)用ffio_init_context()初始化
- 22、ffio_init_context()初始化,io_read_packet(),io_write_packet這些函數(shù)就是封裝了調(diào)用URLProtocol的url_read(),url_write()。
- 23、經(jīng)過(guò)獲取HTTP 協(xié)議上下文再創(chuàng)建AVIOContext后,返回到utils.c的init_input() 調(diào)用av_probe_input_buffer2()來(lái)讀取數(shù)據(jù)
- 24、 init_input()中調(diào)用avio_read()讀取數(shù)據(jù)。 avio_read()中又封裝了幾層
- 25、 avio_read()返回后就得到m3u8文件數(shù)據(jù)再調(diào)用av_probe_input_format2()就可以得到是使用ff_hls_demuxer解復(fù)用器
- 26、 從init_input()返回到avformat_open_input()調(diào)用解復(fù)用器的read_header()
- 27、 hls_read_header()中第一次調(diào)用parse_playlist()解析m3u8中的播放列表
- 28、 parse_playlist()判斷兩次不同的調(diào)用時(shí)處理
- 29、parse_playlist()接著讀取一行判斷m3u8標(biāo)志和保存之前分片
- 30、 parse_playlist()接著循環(huán)一行行讀取處理
- 31、 parse_playlist() 中判斷是否嵌套m3u8做不同處理
- 32、 parse_playlist()最后處理之前的分片
- 33、返回hls_read_header()判斷是否執(zhí)行第二次parse_playlist()
- 34、 hls_read_header()中選擇開(kāi)始的分片
- 35、 hls_read_header()最后開(kāi)啟每個(gè)播放列表的解復(fù)用器
- 三、關(guān)于使用參數(shù)指定輸入格式時(shí)的分析:
- 1、ffplay.c中
- opt_format()處理指定格式參數(shù)
- 2、format.c 中av_find_input_format()根據(jù)指定格式查找解復(fù)用器
- 3、allformat.c中av_demuxe_iterate遍歷所有解復(fù)用器
一、流程圖:
二、代碼分析:
1、ffplay.c調(diào)用avformat_open_input()進(jìn)行打開(kāi)文件
2、進(jìn)入utils.c的avformat_open_input()前面這些是一些初始化操作 分配AVFormatContext、保存參數(shù)到AVDictionary、設(shè)置參數(shù)
3、utils.c的avformat_open_input()中調(diào)用init_input()進(jìn)行打開(kāi)文件和探測(cè)協(xié)議格式
4、utils.c的init_input()中調(diào)用av_probe_input_format2()會(huì)根據(jù)后綴名探測(cè)格式
5、format.c中av_probe_input_format2()調(diào)用av_probe_input_format3()
6、format.c中av_probe_input_format3()
7、遍歷時(shí)查找到hls時(shí)調(diào)用hls_probe()返回0。這次探測(cè)格式就失敗了
8、utils.c中init_input()中調(diào)用io_open()默認(rèn)打開(kāi)操作
9、io_open是在option.c中的avformat_get_context_defaults()綁定io_open_default()
10、option.c中的io_open_default()中調(diào)用ffio_open_whitelist()
11、aviobuf.c中ffio_open_whitelist()中調(diào)用ffurl_open_whitelist()
12、avio.c中ffurl_open_whitelist()調(diào)用ffurl_alloc()創(chuàng)建url上下文
13、avio.c中ffurl_alloc()調(diào)用url_find_protocol()查找協(xié)議
14、avio.c中url_find_protocol根據(jù)url(文件名)查找協(xié)議
得到的是ff_http_protocol
15、avio.c中ffurl_alloc()調(diào)用url_alloc_for_protocol()根據(jù)協(xié)議創(chuàng)建上下文
16、avio.c中url_alloc_for_protocol()創(chuàng)建協(xié)議上下文,進(jìn)行一系列初始化操作
17、avio.c中的ffurl_open_whitelist()創(chuàng)建url上下文后,調(diào)用ffurl_connect()進(jìn)行連接
18、avio.c中的ffurl_connect()根據(jù)不同的協(xié)議進(jìn)行打開(kāi)url操作
19、 得到連接上的URLContext,返回到ffio_open_whitelist() 再調(diào)用ffio_fdopen()創(chuàng)建ffio_fdopen(),創(chuàng)建AVIOContext
20、 ffio_fdopen()調(diào)用avio_alloc_context()創(chuàng)建AVIOContext,和一些初始化操作
21、 avio_alloc_context()再調(diào)用ffio_init_context()初始化
22、ffio_init_context()初始化,io_read_packet(),io_write_packet這些函數(shù)就是封裝了調(diào)用URLProtocol的url_read(),url_write()。
23、經(jīng)過(guò)獲取HTTP 協(xié)議上下文再創(chuàng)建AVIOContext后,返回到utils.c的init_input() 調(diào)用av_probe_input_buffer2()來(lái)讀取數(shù)據(jù)
24、 init_input()中調(diào)用avio_read()讀取數(shù)據(jù)。 avio_read()中又封裝了幾層
25、 avio_read()返回后就得到m3u8文件數(shù)據(jù)再調(diào)用av_probe_input_format2()就可以得到是使用ff_hls_demuxer解復(fù)用器
26、 從init_input()返回到avformat_open_input()調(diào)用解復(fù)用器的read_header()
27、 hls_read_header()中第一次調(diào)用parse_playlist()解析m3u8中的播放列表
28、 parse_playlist()判斷兩次不同的調(diào)用時(shí)處理
29、parse_playlist()接著讀取一行判斷m3u8標(biāo)志和保存之前分片
30、 parse_playlist()接著循環(huán)一行行讀取處理
31、 parse_playlist() 中判斷是否嵌套m3u8做不同處理
32、 parse_playlist()最后處理之前的分片
33、返回hls_read_header()判斷是否執(zhí)行第二次parse_playlist()
34、 hls_read_header()中選擇開(kāi)始的分片
35、 hls_read_header()最后開(kāi)啟每個(gè)播放列表的解復(fù)用器
三、關(guān)于使用參數(shù)指定輸入格式時(shí)的分析:
1、ffplay.c中
opt_format()處理指定格式參數(shù)
2、format.c 中av_find_input_format()根據(jù)指定格式查找解復(fù)用器
3、allformat.c中av_demuxe_iterate遍歷所有解復(fù)用器
總結(jié)
以上是生活随笔為你收集整理的ffmpeg 使用ffplay 进行 hls 拉流 分析 1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 我选激光电视,国产的哪家好啊?
- 下一篇: 不用开QQ!不用开别的软件! 就是DNF