日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/1 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ffmpeg 使用ffplay 进行 hls 拉流 分析 1 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ffmpeg 使用 ffplay 進(jìn)行 hls 拉流 分析 1
從使用ffplay 調(diào)用 http://192.168.1.100:8080/live/livestream.m3u8 開始,進(jìn)入到ffmpeg 的分析使用的協(xié)議選擇相應(yīng)的解復(fù)用器的步驟。
其他協(xié)議或者文件方式的使用ffplay也是這個(gè)步驟流程的。

目錄:

  • 一、流程圖:
  • 二、代碼分析:
    • 1、ffplay.c調(diào)用avformat_open_input()進(jìn)行打開文件
    • 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)行打開文件和探測協(xié)議格式
    • 4、utils.c的init_input()中調(diào)用av_probe_input_format2()會(huì)根據(jù)后綴名探測格式
    • 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。這次探測格式就失敗了
    • 8、utils.c中init_input()中調(diào)用io_open()默認(rèn)打開操作
    • 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)行打開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)過獲取HTTP 協(xié)議上下文再創(chuàng)建AVIOContext后,返回到utils.c的init_input() 調(diào)用av_probe_input_buffer2()來讀取數(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()中選擇開始的分片
    • 35、 hls_read_header()最后開啟每個(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)行打開文件

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)行打開文件和探測協(xié)議格式

4、utils.c的init_input()中調(diào)用av_probe_input_format2()會(huì)根據(jù)后綴名探測格式

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。這次探測格式就失敗了


8、utils.c中init_input()中調(diào)用io_open()默認(rèn)打開操作

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)行打開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)過獲取HTTP 協(xié)議上下文再創(chuàng)建AVIOContext后,返回到utils.c的init_input() 調(diào)用av_probe_input_buffer2()來讀取數(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()中選擇開始的分片

35、 hls_read_header()最后開啟每個(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的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。