樹莓派架設 RTMP 串流(Streaming)伺服器,傳送即時攝影機影像
這裡介紹使用樹莓派安裝 nginx 架設 RTMP 串流伺服器,傳送即時的攝影機影像。
樹莓派加上一個網路攝影機(webcam)之後,就可以用來打造一個即時的 live 影像串流伺服器,作為簡單的監控裝置,讓您透過電腦或是手機看到即時的攝影機畫面。
在本篇教學中所使用的裝置與規格為:
以下是架設 RTMP 串流(Streaming)伺服器的安裝過程。
安裝 nginx 伺服器
我們選用 nginx 再加上一個 nginx-rtmp-module 模組作為主要對外服務的伺服器,在自行編譯與安裝之前,我們先用 apt 裝一下系統套件厙中的 nginx,然後在將其移除:
sudo apt-get update sudo apt-get -y install nginx sudo apt-get -y remove nginx sudo apt-get clean
這樣做的目的是讓它自動把 nginx
相依的套件安裝好,並設定好系統的環境(例如 init 指令稿等),移除 nginx
套件之後,要清空 /etc/nginx/
下面的設定檔:
sudo rm -rf /etc/nginx/*
安裝編譯用的套件:
sudo apt-get install -y curl build-essential libpcre3-dev libpcre++-dev zlib1g-dev libcurl4-openssl-dev libssl-dev
建立系統上放置網頁的目錄:
sudo mkdir -p /var/www
建立編譯用的目錄:
mkdir -p ~/nginx_src cd ~/nginx_src
用 git
下載 nginx 與 nginx-rtmp-module 的原始碼:
git clone https://github.com/arut/nginx-rtmp-module.git git clone https://github.com/nginx/nginx.git
設定編譯引數:
cd nginx ./configure --prefix=/var/www --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_ssl_module --without-http_proxy_module --add-module=/home/pi/nginx_src/nginx-rtmp-module
這裡補充一點,從 nginx 的 git repository 下載的原始碼雖然是最新的,但是因為它是處於開發狀態的原始碼,並不保證一定可以使用,如果發現最新的原始碼有問題時,可以嘗試從 nginx 的官方網站下載打包好的原始碼,然後解壓縮:
wget http://nginx.org/download/nginx-1.9.3.tar.gz tar zxvf nginx-1.9.3.tar.gz
然後再進入解壓縮出來的目錄,設定編譯引數:
cd nginx-1.9.3/ ./configure --prefix=/var/www --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_ssl_module --without-http_proxy_module --add-module=/home/pi/nginx_src/nginx-rtmp-module
設定好編譯引數之後,就可以進行編譯與安裝 nginx 的動作:
make sudo make install
測試安裝好的 nginx 是否正常:
nginx -v
正常的話,會顯示 nginx 的版本:
nginx version: nginx/1.7.10
編輯 /etc/nginx/nginx.conf
設定檔,在檔案的最後加上下面這段 RTMP 的設定:
rtmp { server { listen 1935; ping 30s; notify_method get; application rtmp { live on; } } }
啟動 nginx 系統服務:
sudo service nginx start
看看是否有正常啟動,沒問錯誤訊息就代表成功了:
Starting nginx: nginx.
安裝 Strobe Media Playback
mkdir strobe_src cd strobe_src wget http://downloads.sourceforge.net/project/smp.adobe/Strobe%20Media%20Playback%201.6%20Release%20%28source%20and%20binaries%29/StrobeMediaPlayback_1.6.328-full.zip
解壓縮之後,將最新版的複製到 /var/www/html/strobe
:
unzip StrobeMediaPlayback_1.6.328-full.zip sudo cp -r for\ Flash\ Player\ 10.1 /var/www/html/strobe
建立 index.html
編輯 /var/www/html/index.html
,將內容改為:
<!DOCTYPE html> <html> <head> <title>Live Streaming</title> <!-- strobe --> <script type="text/javascript" src="strobe/lib/swfobject.js"></script> <script type="text/javascript"> var parameters = { src: "rtmp://{pi_address}/rtmp/live", autoPlay: false, controlBarAutoHide: false, playButtonOverlay: true, showVideoInfoOverlayOnStartUp: true, optimizeBuffering : false, initialBufferTime : 0.1, expandedBufferTime : 0.1, minContinuousPlayback : 0.1, poster: "images/poster.png" }; swfobject.embedSWF( "strobe/StrobeMediaPlayback.swf" , "StrobeMediaPlayback" , 1024 , 768 , "10.1.0" , "strobe/expressInstall.swf" , parameters , { allowFullScreen: "true" } , { name: "StrobeMediaPlayback" } ); </script> </head> <body> <div id="StrobeMediaPlayback"></div> </body> </html>
其中的 {pi_address}
要改為 SMTP 伺服器的 IP 位址(也就是樹莓派的 IP 位址)。
使用 avconv
製作影像串流
安裝 libav-tools
套件:
sudo apt-get install libav-tools
插上 USB 網路攝影機之後,執行:
avconv -f video4linux2 -r 24 -i /dev/video0 -f flv rtmp://localhost:1935/rtmp/live
這樣就可以開啟 http://{pi_address}/
觀看即時的影像串流了,這是我測試的畫面:
如果畫面變動比較大的時候,Frame rate 會稍微下降。
因為 avconv
是使用軟體來進行影片的編碼,所以 CPU 的覆載會很高,以樹莓派的硬體而言,處理速度很吃緊。
這是實測的影片,畫面有變動的時候,影像就會出現嚴重的延遲。
使用 GStreamer 製作影像串流
另一個產生串流的方式是使用 GStreamer,由於它可以使用樹莓派的硬體進行 H.264 編碼,所以產生的串流品質會好很多。首先安裝 GStreamer:
sudo apt-get install gstreamer1.0-tools
使用 gst-launch
擷取網路攝影機的影像,產生串流:
gst-launch-1.0 -v v4l2src ! 'video/x-raw, width=640, height=480, framerate=30/1' ! queue ! videoconvert ! omxh264enc ! h264parse ! flvmux ! rtmpsink location='rtmp://localhost/rtmp/live live=1'
這是測試的畫面:
CPU 的覆載輕很多。
如果您對於樹莓派的應用有興趣,建議您可以繼續閱讀物聯網的相關文章。