一個好的轉發模塊,首先要低延遲!其次足夠穩定、靈活、有狀態反饋機制、資源占用低,跨平台,最好以接口形式提供,便於第三方系統集成。
以Windows平台為例,我們的考慮的點如下
1. 拉流:通過RTSP直播播放SDK的數據回調接口,拿到音視頻數據;
2. 轉推:通過RTMP直播推送SDK的編碼后數據輸入接口,把回調上來的數據,傳給RTMP直播推送模塊,實現RTSP數據流到RTMP服務器的轉發;
3. 錄像:如果需要錄像,借助RTSP直播播放SDK,拉到音視頻數據后,直接存儲MP4文件即可;
4. 快照:如果需要實時快照,拉流后,解碼調用播放端快照接口,生成快照,因為快照涉及到video數據解碼,如無必要,可不必開啟,不然會額外消耗性能。
5. 拉流預覽:如需預覽拉流數據,只要調用播放端的播放接口,即可實現拉流數據預覽;
6. 數據轉AAC后轉發:考慮到好多監控設備出來的音頻可能是PCMA/PCMU的,如需要更通用的音頻格式,可以轉AAC后,在通過RTMP推送;
7. 轉推RTMP實時靜音:只需要在傳audio數據的地方,加個判斷即可;
8. 拉流速度反饋:通過RTSP播放端的實時碼率反饋event,拿到實時帶寬占用即可;
9. 整體網絡狀態反饋:考慮到有些攝像頭可能會臨時或異常關閉,RTMP服務器亦是,可以通過推拉流的event回調狀態,查看那整體網絡情況,如此界定:是拉不到流,還是推不到RTMP服務器。
系統設計架構圖
Windows轉發demo分析
大牛直播SDK的轉發demo,Windows平台,對應C++ demo工程:WIN-RelaySDK-CPP-Demo,如需下載demo源碼,參看 Github
1. 拉流:拉流和播放有些類似,但不需要播放(也就是說不要解碼,資源消耗非常低),在做過基礎的參數配置之后(對應demo里面OpenPullHandle()),設置音視頻數據回調,然后調用StartPullStream()即可:
1.1 基礎參數設置:
1.2 設置音視頻數據回調:
1.3 開始拉流:
拉流整體代碼如下:
2. 停止拉流:
停止拉流流程比較簡單,先判斷是否在拉流狀態,如果拉流,調用StopPullStream() 即可,如沒有預覽畫面,調用Close()接口關閉拉流實例。
3. 拉流端預覽:
拉流端預覽,說白了就是播放拉流數據,流程比較簡單,demo調用如下,如不需要播放聲音,調用SetMute(),實時打開/關閉即可:
4. 拉流端關閉預覽:
5. 開始推流到RTMP服務器:
推流的流程,如之前所述,調用RTMP推送模塊,然后數據源傳編碼后的音視頻數據即可,下圖的demo源碼,同時展示了,RTSP流獲取到后,轉推RTMP的時候,數據解密的處理:
6. 傳遞轉推RTMP數據:
7. 關閉實時RTMP轉推
以上就是RTSP或RTMP流轉RTMP推送的流程,感興趣的開發者,可做設計參考。