Android中基於NuPlayer的RTSP框架學習

一、整體框架圖

Android中基於NuPlayer的RTSP框架如下圖所示(該圖來自網上)。


整個圖主要分爲兩個部分,一部分是NuPlayer的架構,另一部分則是實現了基於RTSP的流媒體播放功能,即RTSPSource。當然還有一些其他的Source,如圖中的HTTPLiveSource,還有圖中沒有畫出的GenericSource、StreamingSource等,他們是並列關係,實現了不同的播放功能。

二、NuPlayer架構

1、NuPlayerDriver是對NuPlayer的封裝,與NuPlayerDriver處於並列位置的是StagefrightPlayer,他們都繼承MediaPlayerInterface接口。通過NuPlayer來實現播放的功能。

2、NuPlayer真正實現了播放的功能,通過各個Source的接口來得到數據流的信息和解碼數據本身。在Stagefright媒體框架中,和NuPlayer處於相同地位的是AwesomePlayer。

三、RTSP功能實現架構

1、RTSPSource是NuPlayer架構的Source,給NuPlayer輸送媒體需據信息和媒體數據。在整個NuPlayer架構中,與RTSPSource並列的Source有HTTPLiveSource、GenericSource、StreamingSource,還有一個MP4Source,他們都繼承NuPlayer::Source。

2、MyHandler是核心,其中包含ARTSPConnection和ARTPConnection兩大部分。MyHandler負責向Server端發送Request和處理Response,並負責將待解碼的媒體數據傳送給RTSPSource。

3、AnotherPacketSource在RTSPSource中作爲mAudioTrack和mVideoTrack,他雖然繼承了MediaSource接口,但是並沒有使用read來讀數據,而是通過dequeueAccessUnit接口來獲得數據。RTSPSource通過調用queueAccessUnit結構將數據保存到這裏。

4、ARTSPConnection負責維護RTSP的socket,發送Request,循環接收Server端數據,響應Server的Request。這裏只是接收Response,真正的處理在MyHandler裏。

5、ARTPConnection負責維護RTP和RTCP的socket,接收RTP和RTCP包,週期性發送RTCP包。需要說明的一點是,如果傳輸RTP和RTCP數據使用的是TCP,那麼會共用RTSP的socket;如果用的是UDP,那麼針對每個stream都會創建兩個socket,一個用於傳輸RTP數據,一個用於傳輸RTCP數據。

6、ARTPSource,每個RTP數據流都有一個ARTPSource,後者會創建一個ARTPAssembler。依據處理數據流的壓縮格式,實例化對應格式的Assembler。在ARTPSource中實現的一個最主要而且重要的功能就是根據SeqNum對RTP包進行排序。

7、ARTPAssembler對ARTPConnection接收到的數據進行處理,說的簡單一點就將接收到的媒體數據進行重組,以滿足解碼器的要求。如AVC數據,他會把單一NAL,NAL分片和複合NAL分別處理後,都以單獨NAL的形式回調傳給RTSPSource,存放在AnotherPacketSource中,供decoder端使用。目前支持的Assembler有一下幾種,他們都繼承ARTPAssembler。

(1)AAVCAssembler

(2)AMPEG4AudioAssembler

(3)AH263Assembler

(4)AAMRAssembler

(5)AMPEG4ElementaryAssembler

(6)ARawAudioAssembler

(7)AMPEG2TSAssembler

8、APacketSource用來包存和設置每個stream的屬性。針對每個stream都會創建一個APacketSource。


待序。

發佈了7 篇原創文章 · 獲贊 23 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章