1. 程式人生 > 實用技巧 >雙目攝像頭的實時影象傳輸-Pcduino平臺下的智慧小車

雙目攝像頭的實時影象傳輸-Pcduino平臺下的智慧小車

一、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