RTSP協議轉換RTMP協議,直播網路攝像頭
RTSP協議也是廣泛使用的直播/點播流媒體協議,以前的專案裡實現了一個RTSP協議轉換RTMP直播協議的程式,為的是可以接收遠端裝置或伺服器的多路RTSP直播資料,實時轉換為RTMP直播協議,推送到NginxRtmp等RTMP伺服器,可以在PC上實現flash觀看RTSP直播源(比如IPCAM)的需求,也能通過Nginx的HLS協議轉換,在手機上觀看。實現的思路分享如下。
要點分析
首先,程式的主要目的,是從多路RTSP輸入源中提取AAC編碼的音訊和H.264編碼視訊資料,並生成RTMP資料包,然後組裝RTMP推送協議,併發往RTMP伺服器。在傳送的過程中,要求可以從RTSP資料來源切換到具有相同h.264和aac編碼的FLV檔案中,並不影響RTMP直播。因此,本程式的關鍵點有以下部分:
- RTSP直播流的讀取
- H.264和AAC編碼資料的分析、處理
- FLV檔案資料的提取及與RTSP直接的切換和銜接
- RTMP資料包封裝
- RTMP推送協議
有了關鍵點,就可以一項一項的去分析。
設計思路
根據上面分析的要點,首先要選擇RTSP直播協議的讀取。我們不需要從零做起,網路上有很多和RTSP相關的開源專案可以使用或借鑑,我選擇了Live555。(後來我也做了通過ffmpeg介面來讀取RTSP資料的專案,也很不錯,各有優缺點)
Live555是一個跨平臺的流媒體解決方案,主要支援RTSP協議,好像也支援SIP
H.264和AAC資料的分析處理,這個對於從沒做過相關專案開發的人來說,應該是一個難點,主要是相關概念的理解。好在我一直在做這塊,也比較好弄。
第4和第5點,可以參照我之前的文章“RTMP協議傳送H.264編碼及AAC編碼的音視訊直播”的技術方法,來加以實現。因此,主要需要處理的就是RTSP直播流資料的獲取,以及對其中H.264和AAC編碼資料的處理。
於是可以畫出大體結構如下:
邏輯與實現
1. 程式框架和模組說明
2. 主要介面
RtspCapture是我的程式裡管理RTSP直播資料流和分析處理的類,介面很重要,基本上這個設計就可以。(當然,全部程式碼是不會放上來的,有興趣的可以和我談,這裡只羅列關鍵的地方。)
他所使用的live555變數,這裡ourRTSPClient實際就是RTSPClient的簡單繼承
3.RtspCapture呼叫live555的主要流程
1. 首先,在RtspCapture建構函式初始化
2. 在StartRtsp函式中,建立RtspClient,併發送"describe"命令,開始獲取sdp。回撥函式就是continueAfterDESCRIBE。在這裡建立MediaSession,之後再發送"setup"命令,等,這些都可以在live555的例子以及網上的說明中看到。
3. 還有一個關鍵點,就是要在自己的執行緒迴圈中,呼叫live555 environment的事件迴圈,就像這樣
4. 對rtsp回撥h264資料的分析處理
這裡演示了,如何從rtsp回撥的h264資料中,提取sps和pps資訊。裡面的parse函式,是live555自帶的。
呼叫方式
合作請聯絡QQ。(轉載請註明作者和出處~)