什麼是 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
- 等等..
支援的影音格式
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 幾秒才能看到影像 (這已經是將影像的畫質調到很低的狀態下)
Troubleshootings
發生錯誤 : 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