一、Mjpg-Streamer開源庫
由於開發實時視頻推送系統,可能會涉及到流媒體服務器的實現,但是通過“MJPG-streamer”開源工具可以快捷地實現。“MJPG-streamer”是成熟的輕量級的視頻服務器軟件,可以利用它獲取攝像頭畫面然后發布在實時視頻服務器。MJPG-streamer采用模塊化的設計思路,包括輸入模塊和輸出模塊,輸入模塊定義了輸入來源,比如攝像頭、文件等等,MJPG-streamer然后將視頻通過輸出模塊輸出,比如有http等網絡輸出,也有文件的本地輸出[8]。
本文采用支持UVC協議的雙目攝像頭作為圖像數據的輸入來源,選用http協議推送視頻流,所以涉及的組件有output_http輸出組件和input_uvc輸入組件。通過MJPG-streamer,可以方便地將pcDuino上雙目攝像頭的視頻通過http協議推送。
二、實現與測試
使用MJPG-streamer庫開發實時圖像傳輸系統方便高效,其安裝命令如下:
sudo apt-get install cmake libjpeg8-dev -f sudo mkdir -p /home/workspace/mjpg-streamer cd /home/workspace/mjpg-streamer sudo git clone https://github.com/jacksonliam/mjpg-streamer.git cd mjpg-streamer/mjpg-streamer-experimental/ sudo make && sudo make install
安裝完畢可以使用命令:
mjpg_streamer -i "input_uvc.so -d /dev/video0 -y -r 1280x480 -f 10" -o "output_http.so -p 8090 -w /var/www/mjpg_streamer"
mjpg_streamer安裝后可作為系統服務啟動,同時配置輸入輸出參數才能正常工作。在上述命令上涉及以下命令:
-i "input_uvc.so -d /dev/video0 -y -r 1280x480 -f 10"部分是輸入參數,
- so表示使用input_uvc.so作為輸入模塊
- -d /dev/video0 定義了訪問的攝像頭的設備路徑為/dev/video0。
- -r 1280x480 定義了攝像頭的分辨率為1280x480
- -f 定義了實時視頻的幀率為每秒10幀
- -y 表示啟用mjpg_streamer的YUV模式。由於mjpg_streamer處理的視頻數據格式為MJPEG,而本設計采用的攝像頭是YUV格式,啟用mjpg_streamer的YUV模式就是為了兼容攝像頭的視頻流格式。
-o "output_http.so -p 8090 -w /var/www/mjpg_streamer"部分是輸出參數,
- so表示使用output_http.so作為輸出模塊
- -p定義了http輸出端口為8090
- -w 定義了http服務的根目錄
在命令行中啟動后如下:
啟動mjpg_streamer視頻服務器后,可以在Chrome瀏覽器中輸入智能車的IP和服務端口測試。mjpg_streamer默認視頻端口是8090,當然也可以在啟動參數進行設置。
假設智能車IP為192.168.137.2,則可訪問http://192.168.137.2:8090/?action=stream訪問動態的視頻流,訪問http://192.168.137.2:8090/?action=snapshot訪問靜態的抓拍圖片。
當在瀏覽器訪問上面的URL時,瀏覽器實際上渲染的頁面源代碼是:
<img src=”http://192.168.137.2:8090/?action=snapshot ”/>
<img src=”http://192.168.137.2:8090/?action=stream”/>
也就是說瀏覽器使用了img圖片標簽顯示雙目攝像頭視頻,值得注意的是即使是當action參數為stream時,這個img標簽竟然可以持續地、動態地拉取和顯示來自與服務器的視頻流,這是一件很有趣的現象:
當然,使用img標簽顯示動態視頻流並不是在所有瀏覽器都得到支持,例如IE就不行。
為了研究img標簽顯示視頻流問題,可使用Chrome調試工具“審查元素”對這個HTTP請求進行分析:
依上圖所示,根據這個HTTP請求的響應頭,可以知道其文件擴展名Content-Type(Mime-Type)為multipart/x-mixed-replace。
HTTP超文本協議中,HTTP請求的響應消息由狀態行、消息報頭、正文組成 [10] ,其中消息報頭是一些描述響應數據的描述性信息,包括服務器信息、狀態碼、緩存控制策略等等,其中包括的Content-Type(Mime-Type)是為了告知瀏覽器當前傳輸數據的數據格式、類型。
Web服務器在響應客戶端的HTTP請求時,返回的數據使用MIME報文格式進行封裝。一般來說,一個HTTP響應只能包含一個數據塊,但是,MIME有一種特殊的MIME類型:“multipart/mixed”, 這種MIME類型可用一個HTTP響應數據塊來表示多個數據塊。其中 multipart/x-mixed-replace MIME類型就是 “multipart/mixed”中的一種,其中 “replace”表示每一個新數據塊都會代替前一個數據塊,這告訴瀏覽器,這種類型的新數據塊不是追加到舊數據塊后面,而是替代它[15]。本文中瀏覽器中img標簽顯示視頻流也正是這個原因,它意味着視頻圖片幀會被不斷刷新,最后形成連貫的視頻。
https://wangbaiyuan.cn/5-of-binocular-camera-pcduino-real-time-image-transmission-platform-of-smart-car.html



