一、整體框架圖
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。
待序。