2015年4月22日 星期三

如何使用樹莓派相機,製作即時影像傳輸

網路上有許多樹莓派相機圖傳的教學,這裏參考這篇 「Raspberry Pi Camera」,文章中還有影片,教你如何安裝樹莓派相機。

首先,在樹莓派上,更新軟體
sudo apt-get update
sudo apt-get upgrade

啟用樹莓派相機
sudo raspi-config

影像接收端

接收端使用Windows 系統來接收影像,在該篇文章中提到,需下載 Netcat 及 MPlayer 軟體:
Download Netcat - 接收來自樹莓派的影像串流
Download MPlayer  - 播放影像串流

執行接收端程式
nc.exe -L -p 5002 | mplayer.exe -fps 50 -cache 4096 -cache-min 5 -nosound -

-fps: 每秒播放 frame 數量,此處設定為 50。 
-cache: 影像串流緩衝大小,這裏設定為 4096K
-cache-min: 接收影像串流時,會先將影像暫存在 cache 中,這裏設定為 5,表示緩衝達 5% 時,才開始播放影片,預設為 20% 。
-nosound: 因為沒有聲音,關閉聲音選項避免多餘的處理。

MPlayer 詳細的參數說明可參考這邊 MPlayer Doc

執行後,程式開始等待串流輸入











畫面上「Cache fill」就是代表已緩衝容量


影像傳送端

在樹莓派端,啟動錄影及影像傳送,指令如下:
raspivid --nopreview -w 800 -h 600 -fps 25 -b 1000000 -t 99999 -o - | nc 192.168.1.116 5002

其中 IP 的部份需換成接收端的 IP 位置,其餘參數說明如下:
--nopreview: 若不加此參數,會在樹莓派上彈出一個視窗播放影片。
-w, -h: 影像的寬度、高度。
-fps: 錄影時每秒 frame 數量,這裏設定為接收端的一半。
-b: bitrate傳輸率,這裏設定為 1000000 代表1M bits / 每秒,這個值越小,影像品質越低,影像容量越小,傳輸速度越快。
-t: 錄影時間,設定一個很大的數字。

重點來了,執行時必須先啟動接收端程式,再執行樹莓派影像傳送
為什麼呢? 因為當你先執行影像傳輸,再啟動接收端程式時,假設這兩個動作相隔 5 秒,由於已經錄了 5 秒了,接收端播放的影像,就會至少延遲 5 秒。

影像傳輸時,接收端會先將影像暫存在 cache 中,這裏設定 cache-min 為 5%,表示串流影像在 cache 中緩存達 5% 時開始播放,這時因為已經有 5% 的影像在 cache 中,因此播放的影像並不是即時影像。

因此將傳送端的 fps 設定為 25,接收端的 fps 設定為 50,使得接收端以快動作的方式播放,很快就會把 5% 的影像收完,再來,就會收到即時的影像,因此 cache-min 這個值也不能太高。
















以此設定值來測試,影像延遲大約 0.3 秒。

有一篇文章談到如何將樹莓派影像,傳送至Android裝置
Android and Raspberry Pi Camera low/no latency via gstreamer

2 則留言:

  1. 我的Android版本是4.4.4,預設的「影片」App 好像能播,不過我不會用。
    我是另外安裝 MX Player,可支援格式比預設 App 多且部分格式支援硬解(依手機硬體不同),也能播放網路串流。

    回覆刪除
  2. 串流傳送端我使用
    raspivid -o - -t 0 -w 640 -h 480 -n | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8088/}' :demux=h264
    接收端使用
    mplayer.exe rtsp://樹莓派IP:8088/

    回覆刪除