2013年4月5日 星期五

Raspberry PI : Webcam + MJPG-streamer 變 Webcam Streamer

2013年4月5日 星期五
除了用上回提過的 montion 來將 Webcam 抓到的畫面顯示在網頁中以外,MJPG-streamer 也是不錯的方案。當我們將程式編譯完以後,會有好幾個 output_xxx.so 的 plugins ,利用這些,我們可以將影像用不同的方式來輸出,例如:使用 output_http.so plugin 可以將 Webcam 的 JPEG 影像以單張單張儲存或是多張組合成以 Motion JPEG Video (MJPG) 編碼的 stream ,這樣子,使用者可以透過網頁瀏覽器,或是使用類似 VLC 的 clients 來觀看串流;而如果使 output_file.so 這個 plugin ,則可以在擷取到 Webcam 的 JPEG 影像後交由指定的 script 來處理,把影像檔案儲存起來......。底下就來看看如何在 Raspberry PI 中以 MJPG-streamer 來架設 stream server。
因為 MJPG-streamer 在 Raspberry PI 中並沒有已編譯好的 package ,所以我們只好自己抓 source 來編譯。

準備編譯環境

首先要準備好編譯所需的環境,登入 Raspberry PI 以後,執行底下的安裝指令安裝一些必要的 packages:

sudo apt-get update
sudo apt-get install subversion
sudo apt-get install libjpeg8-dev
sudo apt-get install imagemagick


抓 source 並編譯

接著我們利用 SVN 將  MJPG-streamer 的 source 抓回來,執行底下的指令:
svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer

source 抓回來後,切換到裡面並開始進行編譯,依序執行底下的指令:

cd mjpg-streamer/mjpg-streamer
make

如果編譯成功,目錄中應該會多出類似:mjpg_streamer , input_uvc.so , output_http.so ......,其中的 mjpg_streamer 是主程式,而那些 input_xxxx.so 、output_xxxx.so 則是輸出、輸入的 plugins。有了這些檔案,我們就可以將 Webcam 插入 Raspberry PI 的 USB 插槽中來測試了。


進行測試

將 Webcam 插入 USB 以後,我們可以利用「lsusb」這個指令來查看 Raspberry PI 是否抓到硬體了,類似底下的訊息:

Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 007: ID 0c45:6310 Microdia Sonix USB 2.0 Camera

最後一行 (Device 007) 是我的 Webcam。

接著我們在剛剛編譯程式的目錄中執行底下的指令:
./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"
如果出現的訊息是像我這樣:

MJPG Streamer Version: svn rev: 3:172
 i: Using V4L2 device.: /dev/video0
 i: Desired Resolution: 640 x 480
 i: Frames Per Second.: 5
 i: Format............: MJPEG
Unable to set format: 1196444237 res: 640x480
 Init v4L2 failed !! exit fatal
 i: init_VideoIn failed

有類似「Unable to set format: 1196444237 res: 640x480」這行的訊息,表示 Webcam 不支援輸出 MJPEG 的格式,那就在指令裡加個「-y」的參數,讓它改用 YUYV 的格式。指令變成:
./mjpg_streamer -i "./input_uvc.so -y" -o "./output_http.so -w ./www"

如果 stream server 正常啟動的話,應該會在最後面看到底下的訊息:

 o: www-folder-path...: ./www/
 o: HTTP TCP port.....: 8080
 o: username:password.: disabled
 o: commands..........: enabled

如何看 Webcam 抓到的影像呢?我們可以利用由 MJPG-streamer output_http.so plugin 所提供的 HTTP server ,用網頁瀏覽器來當 client,以底下的網址觀看 Demo 的網站(假設 Raspberry PI 的 IP 為 192.168.2.1):
http://192.168.2.1:8080/
在這個 MJPG-streamer Demo Pages 中,我們可以看到它示範靜態影像的顯示、stream、Java、Javscript ...... 的語法,可以依需求選用。

另外,我們也可以用類似 VLC 這種有支援 Motion JPEG Video (MJPG) 編碼的播放器來看,觀看的網址如下:
http://192.168.2.1:8080/?action=stream

服務啟動了卻看不到影像

如果 streamer server 好像啟動了,卻仍然看不到影像,只好像我一樣,把解析度降低。
先按「Ctrl + C」中止服務程式,然後再加入「-r」的參數,例如,將啟動指令改為:
./mjpg_streamer -i "./input_uvc.so -y  -r QSIF -f 15" -o "./output_http.so -w ./www"

這樣,影像解析度變為 160x120 (QSIF) ,程式回應的訊息如下:

MJPG Streamer Version: svn rev: 3:172
 i: Using V4L2 device.: /dev/video0
 i: Desired Resolution: 160 x 120
 i: Frames Per Second.: 15
 i: Format............: YUV
 i: JPEG Quality......: 80

-r 的參數後面可以使用底下的關鍵字:

  • QSIF
  • QCIF
  • CGA
  • QVGA
  • CIF
  • VGA
  • SVGA
  • XGA
  • SXGA

也可以使用數字來自訂解析度: ??? x ??? (例如:240x200),基本上如果影像出不來,可以改變 -r 和 -f ,將數字減小一點試試。


其它參數

輸入的 plugin  input_uvc.so 除了前面提過的 -y 、-r 參數以外,還有其它可設定,例如:

  • -d : 用來指定要使用哪一個 Webcam,預設是使用 /dev/video0
  • -f : 用來設定每秒鐘要抓多少 frames,預設是 5 frames/sec。
  • -q : 用來設定 JPEG 的品質(百分比),預設是 80。

輸出的 plugin 除了前面指令中用的 -w 參數以外,還可以使用底下的參數來自訂組態:

  • -w : 指定 MJPG-streamer HTTP server 網頁儲存的目錄名稱。
  • -p : 指定 HTTP server 要在哪一個 TCP port 提供服務,預設為 8080
  • -c : 設定 client 連線時要經過帳號密碼驗證過才可以觀看影像,例如 -c abc:123 
  • -n : 不包含讓 client 透過 HTTP 來控制 Webcam 參數的功能。


相關文章



9 則留言:

  1. 满天都是用motion做的,终于有人分享用mjpeg streamer做的了,多谢

    回覆刪除
  2. 您好, 請問在有接樹莓派的案子嗎?

    回覆刪除
    回覆
    1. 您好:
      抱歉,電腦方面並不是我的工作,Raspberry PI 純屬興趣,玩一玩而已。

      刪除
  3. 先生你好
    照著你的流程我成功的啟動CAMERA
    但出現
    o: www-folder-path...: ./www/
    o: HTTP TCP port.....: 8080
    o: username:password.: disabled
    o: commands..........: enabled
    這樣就不能繼續打指令只能ctrl+C
    但我想要同時開著攝影機又能同時打指令
    還是說有什麼指令能關掉網路攝影機

    回覆刪除
    回覆
    1. 您可以開別的 console 來 login , 再繼續下指令進行別的操作, 或者是在原本的指令後加個 & 讓它變成背景執行。我的話, 會用前者。

      刪除
    2. 請問如果解析度不管更改多少,當我進入stream頁面,它就會顯示頁面錯誤的訊息,是什麼原因

      刪除
  4. 請問我要如何將 Webcam 抓到的畫面從網頁上傳到opencv做處理

    回覆刪除
  5. 請問,有辦法在同一個port啟動二台webcam?利用變數切換觀看畫面

    回覆刪除

 
雄::gsyan © 2009. Design by Pocket