Jex’s Note

Raspberry Pi Camera RTSP 影像串流

什麼是 RTP/RTCP/RTSP/RTMP

  • RTP (Real-time Transport Protocol) 是一種傳遞音訊和視訊的協定, 主要應用在 UDP 上, 大多用在一對一傳播
  • RTCP (Real-time Transport Control Protocol) 為 RTP 提供 out-of-band 控制, 本身不傳輸數據, 但和RTP一起協作將 media data 打包和發送
  • RTSP (Real Time Streaming Protocol) 控制聲音及影像的多媒體串流協定, 運作跟 HTTP/1.1 類似, 支援 Multicast, 不強調時間同步等特性, 通常處理 RTP 及 RTCP 協定使用, 可選擇 TCP 或 UDP 傳送
  • RTMP (Real Time Messaging Protocol) 是 Adobe Flash 的多媒體串流協定

RTMP vs RTSP

  • 做的事情基本是一樣的, rtsp 是公開的 protocal, rtmp 是 adobe 的 protocal
  • rtsp on web: Realplayer / Quicktime player / VLC player
  • rtmp on web: flash (目前直播 live 幾乎都走 rtmp)
  • youtube 是 vp8 (一種 codec 格式)
  • camera 幾乎都是走 h.264
  • rtmp 可以轉輸出 vp8 格式, 都會很吃 cpu

WebRTC

WebRTC Google 推的協定, 主要應用在 Browser 上的影印串流 i.e. 視訊聊天

  • 並不適合用在 device, 因為要 porting 在 device 端太複雜及困難, 不過成功後可以提供 p2p 的路線可以省頻寬
  • 需要另外架設 signal server, stun server, turn server
  • A STUN server is used to get an external network address. (A -> stun server <- B (A 跟 B 報 public ip))
  • TURN servers are used to relay traffic if direct (peer to peer) connection fails.
  • webrtc port 到 device 裡, 推流就都是走 webrtc protocal, web 也是 webrtc 的 protocal, device 不能走 rtmp -> WebRTC
  • Just to reiterate: TURN is used to relay audio/video/data streaming between peers, not signaling data!
  • signal server 是讓 WebRTC client 媒合配對用的, 確定雙方要開始連接後再各自報位置給 stun server 打洞, 如果打不通就改用 relay (turn server, turn 有自已的 protocal)

什麼是 live555

是一套 C++ 的函式庫, 可以實作出 RTSP/RTP server, VLC 是基於此函式庫開發的

支援傳輸方式

  • RTP over UDP
  • RTP over RTSP
  • RTP/RTSP over HTTP
  • 等等..

支援的影音格式

  • H.264
  • MPEG4
  • MP3
  • 等等..

Install live555

Easiest way is first ensure you have the appropriate compiler:

sudo apt-get install build-essential

then make sure you don’t have the repository live555 libraries on your system:

sudo apt-get remove liblivemedia-dev

and finally download, build and install the libraries:

cd /tmp
wget http://www.live555.com/liveMedia/public/live555-latest.tar.gz
tar xvf live555-latest.tar.gz
cd live
./genMakefiles linux
make
sudo cp -r /tmp/live /usr/lib
make clean

啟動 RTSP server

將影音檔 (h.264, mp4 etc..) copy 到 /usr/lib/live/mediaServer

h.264 副檔名為 .264, mp4 副檔名為 .m4e

執行

cd /usr/lib/live/mediaServer
./live555MediaServer

安裝並打開 VLC 播放器, 選擇播放網路串流,

輸入 : rtsp://54.250.138.78:8554/akb.m4e

建議在 /usr/lib/live/mediaServer 建立 my_video 資料夾, 將影音與程式分開 (rtsp://54.250.138.78:8554/my_video/akb.m4e)

用 Raspberry Pi camera 播放即時影像

此方法太沒效率了, 不建議使用

啟動 RTSP server 及接收 Raspberry Pi 傳來的資料儲存成檔案:

cd /usr/lib/live/mediaServer/my_video
touch rpi.264
nc -l 8080 | pv -b > rpi.264

將 camera 的影像傳到遠端 server :

raspivid -t 999999 -h 180 -w 270 -o - | pv -b | nc 54.250.138.76 8080

VLC -> open network : rtsp://54.250.138.78:8554/my_video/rpi.264

原本想要做一個能讓很多人同時看即時影像的 server, 所以將 Raspberry Pi 的串流丟到外面的 server, 但效果不太好, 傳輸速率很慢, 即使不用 wifi 傳輸也一樣很慢, 大概過 10 幾秒才能看到影像 (這已經是將影像的畫質調到很低的狀態下)

Q & A

發生錯誤 : StreamParser internal error (149997 + 4 > 150000) Aborted (core dumped)

原因 : 傳送一幀非常大的 H.264 影像 (default 150000) 造成的

查到的解決方法 :

修改 /usr/lib/live/liveMedia/StreamParser.cpp,

找到 BANK_SIZE 建議將值設為 150000~300000 之間

改完要 compile :

cd /usr/lib/live
sudo make
  • 但我仍然還是一樣發生此 buffer 問題, 但播放 mp3 及 aac 沒問題
  • 此情況似乎是發生在 H.264 parsing 才有的問題, 或是 mp4 都有這問題, 試了很多 mp4 影片, 都還是一樣發生
  • 這邊下載.ts 影片是能播放的

其他

現在多數瀏覽器支援播放 H.264 影片但可惜沒有瀏覽器的 HTML5 播放器支援播放 RTSP 串流影片, 所以只能透過像 VLC 這種播放器來播放,

目前 RTMP 應該算是 live streaming 的通用解, 看來要擺脫 flash 還有很長一段路要走

比較可惜的還有 webm (vp8) 無法普及, 不然它的編解碼效率也很不錯, 重要的是它是開源的

市面上常見的 player 比較 :

  • Realplayer : 原生不支援 H.264 影片, 必須安裝 quicktime plugin 才能對 H.264 解碼
  • Quicktime player : 不支援 RTP/AVP/TCP 傳輸, RTP/AVP (UDP) 傳輸不包括 NAT 打洞, 因此唯一適合的傳輸是 HTTP tunneling
  • VLC player : RTP/AVP 傳輸也不支援 NAT 打洞, 但可以用 RTP/AVP/TCP 傳輸

ref: http://ubuntuforums.org/showthread.php?t=1324290 http://www.raspberrypi.org/phpBB3/viewtopic.php?&t=52071

Comments