0. 前言
這段時間在搭建一個IPCamera項目服務器。視頻點對點通話,客戶端會查看設備端的音視頻實時流。為了省流量,是通過P2P進行穿透。但是由于NAT設備的原因和IPV4的枯竭。有些設備是無法進行點對點傳輸實時流。所以需要進行服務器轉發。這里為了快速實現原型,同時參考現在主流的流媒體協議。發現很多使用的是RTMP協議。
下圖是總體設計圖,為了整合多平臺,會自建RTMP流媒體服務器和使用云廠商SaaS的RTMP流媒體服務。但是由于有時候會傳輸一些非流媒體數據,需要傳輸一些二進制文件,所以會需要自定義媒體轉發服務。
以下是我實際項目中,用到的架構實現流程圖。
1. 客戶端A無法進行P2P穿透,請求業務服務器要進行轉發。 2. 業務服務器根據客戶端A,請求類型,返回對應的轉發服務器地址和對應的房間號RoomID/Token等信息 3. 上述請求類型,可以是請求自建RTMP流媒體服務,購買于云廠商RTMP流媒體服務或者自定義協議媒體轉發服務 4. 客戶端A得到業務服務器返回的媒體服務器地址和RoomID/Token 5. 通過信令服務器或者MQTT服務器,把對應的媒體服務器地址和RoomID/Token告訴另一端客戶端B 6. 客戶端A和客戶端B同時進入相同房間Room,客戶端A進行推流,客戶端B進行拉流 7. 其他媒體信息,如編解碼格式,清晰度,播放,暫停,拍照等命令,通過上述信令或MQTT服務器進行命令控制
1. 編譯Nginx
RTMP流媒體服務器,現成的開源方案有很多,有SRS,Red5,wowoza,FMS等,我這里使用的是Nginx的rtmp插件實現實時流轉發。
下載 nginx-rtmp-module https://github.com/arut/nginx-rtmp-module
重新編譯nginx
--prefix=/opt/nginx --with-stream --with-http_ssl_module --with-stream_ssl_module --with-debug --add-module=../nginx-rtmp-module
2. 配置Nginx.conf
基本的nginx配置,這里就不進行介紹了,需要了解的可以參考我其他博客,里面有介紹。這里只介紹rtmp段的定義。
rtmp{ server{ listen 8081; access_log logs/rtmp_access.log; on_connect http://127.0.0.1:8080/v1/rtmp/on_connect; application rtmp { live on; notify_method get; on_play http://127.0.0.1:8080/v1/rtmp/on_play; on_publish http://127.0.0.1:8080/v1/rtmp/on_publish; on_done http://127.0.0.1:8080/v1/rtmp/on_done; on_play_done http://127.0.0.1:8080/v1/rtmp/on_play_done; on_publish_done http://127.0.0.1:8080/v1/rtmp/on_publish_done; on_record_done http://127.0.0.1:8080/v1/rtmp/on_record_done; on_update http://127.0.0.1:8080/v1/rtmp/on_update; notify_update_timeout 10s; } application vod { play /opt/openresty/video; } }}
新聞熱點
疑難解答