1. 程式人生 > >mjpg-streamer學習筆記2----框架分析

mjpg-streamer學習筆記2----框架分析

1、輸入---倉庫-----輸出(mjpg-streamer.h)

(1)global結構體

輸入對應的是input結構體(輸入外掛)

倉庫對應的是buf指標,倉庫的大小是size.

輸出對應的是output結構體(輸出外掛)

outcnt表示當前輸出通道中有幾種方式


(2)mjpg-streamer-r63檔案

       .so檔案是外掛,可能是輸入外掛(前面帶有input字樣),也可能是輸出外掛(前面帶有output外掛)。 

mjpg_streamer -i "input_uvc.so -f 10 -r 320*240" -o "output_http.so -w www"

       由於用的是USB攝像頭來採集資料,因此選擇input_uvc.so輸入外掛作為輸入渠道(如上所示,通過-i指定哪一個外掛作為輸入渠道)。

      由於我們要用的是網頁顯示,因而選擇output_http.so輸出外掛作為輸出渠道。(如上圖所示,通過-o選項指定哪一個外掛作為輸出渠道)


(3)-i "input_uvc.so“ 命令列對應的操作函式操作

通過dlopen函式開啟動態連結庫


(4) -o "output_http.so“命令列對應的操作函式操作


2、輸入外掛和輸出外掛所做的工作

(1)輸入外掛1(input_uvc.c檔案)

input結構體


(2)輸入外掛2

init函式

主要執行init_videoIn函式

  • 傳入引數

寬度width ,高度height,幀率fps,格式format


  • 所做工作
呼叫init_v4l2函式(通過一系列的ioctl來完成設定攝像頭的解析度,幀率,以及攝像頭的輸出格式),分配一個臨時緩衝區



run函式

主要執行建立執行緒函式引數裡面的cam_thread函式


  • 所做工作
呼叫uvcGrab函式獲取一幀資料


判斷獲得資料的格式

如果輸入資料格式是MJPEG格式,直接把它拷貝到 global結構體的buf裡面(也就是放入倉庫);如果是YUV格式,要把YUV格式資料轉變成MJPEG格式的資料再拷貝到global結構體的buf裡面(也就是放入倉庫)


stop函式

做一些清理工作


(3)輸出外掛1

output結構體


(4)輸出外掛2

init函式

  • 所做工作
socket程式設計以及用socket來模擬http協議,因此做socket的一些初始化工作,如埠號

run函式

從倉庫中取出資料,存到一個緩衝區中,然後通過write函式將資料傳送出去,供手機或其他裝置接收

stop函式

做一些清理工作