天天看點

視訊直播系統方案RTSP協定轉換RTMP直播協定

視訊直播系統方案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直播。是以,本程式的關鍵點有以下部分:

  1. RTSP直播流的讀取
  2. H.264和AAC編碼資料的分析、處理
  3. FLV檔案資料的提取及與RTSP直接的切換和銜接
  4. RTMP資料包封裝
  5. RTMP推送協定

  有了關鍵點,就可以一項一項的去分析。

設計思路

  根據上面分析的要點,首先要選擇RTSP直播協定的讀取。我們不需要從零做起,網絡上有很多和RTSP相關的開源項目可以使用或借鑒,我選擇了Live555。(後來我也做了通過ffmpeg接口來讀取RTSP資料的項目,也很不錯,各有優缺點)

  Live555是一個跨平台的流媒體解決方案,主要支援RTSP協定,好像也支援SIP(這個也是我馬上研究的重點,之後會寫文章研究SIP相關的技術實作)。Live555實作了RTSP包括伺服器-用戶端的整套結構,是很知名的一個開源項目。網上有很多關于Live555學習和使用的文章,我就不具體介紹了。

  H.264和AAC資料的分析處理,這個對于從沒做過相關項目開發的人來說,應該是一個難點,主要是相關概念的了解。好在我一直在做這塊,也比較好弄。

  第4和第5點,可以參照我之前的文章“RTMP協定發送H.264編碼及AAC編碼的音視訊,實作攝像頭直播”的技術方法,來加以實作。是以,主要需要處理的就是RTSP直播流資料的擷取,以及對其中H.264和AAC編碼資料的處理。

  于是可以畫出大體結構如下:

  

視訊直播系統方案RTSP協定轉換RTMP直播協定

邏輯與實作

1. 程式架構和子產品說明

視訊直播系統方案RTSP協定轉換RTMP直播協定

2. 主要接口

視訊直播系統方案RTSP協定轉換RTMP直播協定

RtspCapture是我的程式裡管理RTSP直播資料流和分析處理的類,接口很重要,基本上這個設計就可以。(當然,全部代碼是不會放上來的,有興趣的可以和我談,這裡隻羅列關鍵的地方。)

視訊直播系統方案RTSP協定轉換RTMP直播協定

  他所使用的live555變量,這裡ourRTSPClient實際就是RTSPClient的簡單繼承

視訊直播系統方案RTSP協定轉換RTMP直播協定

3.RtspCapture調用live555的主要流程

  1. 首先,在RtspCapture構造函數初始化

視訊直播系統方案RTSP協定轉換RTMP直播協定

  2. 在StartRtsp函數中,建立RtspClient,并發送"describe"指令,開始擷取sdp。回調函數就是continueAfterDESCRIBE。在這裡建立MediaSession,之後再發送"setup"指令,等,這些都可以在live555的例子以及網上的說明中看到。

視訊直播系統方案RTSP協定轉換RTMP直播協定

  3. 還有一個關鍵點,就是要在自己的線程循環中,調用live555 environment的事件循環,就像這樣

視訊直播系統方案RTSP協定轉換RTMP直播協定

4. 對rtsp回調h264資料的分析處理

  這裡示範了,如何從rtsp回調的h264資料中,提取sps和pps資訊。裡面的parse函數,是live555自帶的。

視訊直播系統方案RTSP協定轉換RTMP直播協定

調用方式