mjpg-streamer框架分析
mjpg-streamer程框架圖如下所示:
程序運(yùn)行起來后,主進(jìn)程根據(jù)傳入的參數(shù)設(shè)置的輸入輸出通道打開對(duì)應(yīng)的輸入輸出動(dòng)態(tài)鏈接庫(kù),并依次調(diào)用以下函數(shù)
1、輸入---倉(cāng)庫(kù)-----輸出(mjpg-streamer.h)
(1)global結(jié)構(gòu)體
stop為停止標(biāo)志位,置1時(shí)程序停止運(yùn)行;
db和db_update分別為互斥鎖和條件變量,兩者用于線程同步,當(dāng)輸入通道把數(shù)據(jù)放入倉(cāng)庫(kù)后,通知輸出通道來取數(shù)據(jù)
倉(cāng)庫(kù)對(duì)應(yīng)的是buf指針,倉(cāng)庫(kù)的大小是size.
輸出對(duì)應(yīng)的是output結(jié)構(gòu)體(輸出插件)
outcnt表示當(dāng)前輸出通道中有幾種方式
(2)mjpg-streamer-r63文件
???????.so文件是插件,可能是輸入插件(前面帶有input字樣),也可能是輸出插件(前面帶有output插件)。?
運(yùn)行mjpg_streamer時(shí)通過命令行mjpg_streamer -i "input_uvc.so -f 10 -r 320*240" -o "output_http.so -w www"指定輸入輸出通道
???????由于用的是USB攝像頭來采集數(shù)據(jù),因此選擇input_uvc.so輸入插件作為輸入渠道(如上所示,通過-i指定哪一個(gè)插件作為輸入渠道)。
??????由于我們要用的是網(wǎng)頁(yè)顯示,因而選擇output_http.so輸出插件作為輸出渠道。(如上圖所示,通過-o選項(xiàng)指定哪一個(gè)插件作為輸出渠道)
(3)主函數(shù)通過解析命令行-i "input_uvc.so -f 10 -r 320*240“ ,打開對(duì)應(yīng)的input_uvc.so動(dòng)態(tài)鏈接庫(kù)
通過dlopen函數(shù)打開動(dòng)態(tài)鏈接庫(kù)
(4)?主函數(shù)通過解析命令行-o "output_http.so -w www" ,打開對(duì)應(yīng)的out_http.so動(dòng)態(tài)鏈接庫(kù)
2、輸入插件和輸出插件所做的工作
(1)輸入插件1(input_uvc.c文件)
input結(jié)構(gòu)體
(2)輸入插件2
init函數(shù)
主要執(zhí)行init_videoIn函數(shù)
傳入?yún)?shù)寬度width ,高度height,幀率fps,格式format
init_videoIn所做工作:①調(diào)用init_v4l2函數(shù)(通過V4L2提供的一系列的ioctl來設(shè)置攝像頭的分辨率,幀率,以及攝像頭的輸出格式,并分配緩沖區(qū)然后映射到應(yīng)用程序空間videoIn->mem[i]);②分配一個(gè)臨時(shí)緩沖區(qū)videoIn->tmpbuffer,用于接收攝像頭數(shù)據(jù)(攝像頭數(shù)據(jù)流向?yàn)?#xff1a;videoIn->mem[i]? ? ?----->? videoIn->tmpbuffer? ? ?----->? globals->buf(我們所說的倉(cāng)庫(kù)) ---------->輸出通道取出數(shù)據(jù)外發(fā))
run函數(shù)
主要執(zhí)行創(chuàng)建線程函數(shù)參數(shù)里面的cam_thread函數(shù)
所做工作:調(diào)用uvcGrab函數(shù)(該函數(shù)把一幀數(shù)據(jù)從拷貝videoIn->mem[i]?里拷貝到videoIn->tmpbuffer)獲取一幀數(shù)據(jù)
判斷獲得數(shù)據(jù)的格式,如果輸入數(shù)據(jù)格式是MJPEG格式,直接把它拷貝到 global結(jié)構(gòu)體的buf里面(也就是放入倉(cāng)庫(kù));如果是YUV格式,要把YUV格式數(shù)據(jù)轉(zhuǎn)變成MJPEG格式的數(shù)據(jù)再拷貝到global結(jié)構(gòu)體的buf里面(也就是放入倉(cāng)庫(kù)globals->buf)
stop函數(shù)
做一些清理工作
?
(3)輸出插件1
output結(jié)構(gòu)體
?
(4)輸出插件2
init函數(shù)
socket編程以及用socket來模擬http協(xié)議,因此做socket的一些初始化工作,如端口號(hào)
run函數(shù)
從倉(cāng)庫(kù)中取出數(shù)據(jù),存到一個(gè)緩沖區(qū)中,然后通過write函數(shù)將數(shù)據(jù)發(fā)送出去,供手機(jī)或其他設(shè)備接收
stop函數(shù)
做一些清理工作
?
本文參考鏈接:
https://blog.csdn.net/qingkongyeyue/article/details/52400036
https://blog.csdn.net/qingkongyeyue/article/details/52401514
https://blog.csdn.net/qingkongyeyue/article/details/52824165
總結(jié)
以上是生活随笔為你收集整理的mjpg-streamer框架分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。