mpeg4網路傳輸 以及Livemedia 結構分析

來源:互聯網
上載者:User
Live555類結構live555幾乎所有得處理單元都繼承自Medium類;該類定義了基本介面,lookupByName,close和返回當前的環境類UsageEnvironment,nextTask,此外還有一些判斷類型函數。屬性又名字,環境指向下一個TaskToken的指標。MPEG4ServerMediaSession對象的建立函數在檔案DynamicRTSPServer.cpp中。DynamicRTSPServer的繼承關係是DynamicRTSPServer:RTSPServer:Medium。當接受到帶有URI請求以後,首先建立SMS,調用 ServerMediaSession的建構函式,除了建立時間戳記,拷貝檔案名稱外都是使用的預設值,並且將初始化子會話鏈表。當處理describe命令時,調用generateSDPDescription函數產生。在NEW_SMS()中建立ServerMediaSession對象,然後建立MPEG4VideoFileServerMediaSubsession並將這個子會話對象添加到添加到會話對象中。建立MPEG4VideoFileServerMediaSubsession對象,對象的繼承關係:MPEG4VideoFileServerMediaSubsession::FileServerMediaSubsession::OnDemandServerMediaSubsession::ServerMediaSubsession ::MediumServerMediaSession::MediumMedium:抽象了基本的介面,包括環境,task和媒體名和媒體尋找函數以及一些輔助函數。SessionServerMediaSession:添加了子會話鏈表,SDP描述以及一些媒體相關處理函數。ServerMediaSubsession:定義了指向ServerMediaSession的父指標,指向下個一個對象的指標。該媒體的SDP資訊,該媒體的讀取定位函數等。OnDemandServerMediaSubsession:添加了RTPSink處理函數以及經典命名屬性等,這裡預設的連接埠號碼是6970?不知道什麼意思。成員函數大部分和ServerMediaSubsession相似,在流媒體完成定位等處理。createNewStreamSource和createNewRTPSink是兩個純虛函數,在子類中必須實現。FileServerMediaSubsession:增加了檔案名稱和檔案大小屬性。MPEG4VideoFileServerMediaSubsession:添加了RTPSink屬性,並且實現了OnDemandServerMediaSubsession中定義的兩個純虛函數,即建立了source和sink對象。這個source是MPEG4VideoStreamFramer。該類中還定義了StreamState的內部類。StreamState:包含了指向OnDemandServerMediaSubsession的引用,RTPSink指標,BasicUDPSink指標,RTCPInstance指標FramedSource指標,fRTPgs和fRTCPgs(groupsock).StreamState類可以用OnDemandServerMediaSubsession的fLastStreamToken屬性指向。Sink1. MPEG4ESVideoRTPSink::VideoRTPSink::MultiFramedRTPSink::RTPSink::MediaSink::MediumMediaSink定義中有一個媒體源指標,主要處理函數有startplaying(),stopplaying()和 afterPlayingFunc函數指標。RTPSink類定義了RTP相關的處理和屬性。包含Socket組對象,時間處理系列,統計計數處理等相關屬性。MultiFramedRTPSink是RTPSink的子類,處理buffer中的多個RTP包。VideoRTPSink僅僅添加了sdpMediaType處理函數,而MultiFramedRTPSink添加了輔助SDP處理和VOPIsPresent屬性和一個判斷性處理函數。2. MPEG4ESVideoRTPSink中的處理函數doSpecialFrameHandling:首先檢測開頭的四個位元組看是否是 VOP_START_CODE,該函數處理RTP的起始/中止標識和新增時間戳記。其他處理包括是否允許分區,是否是起始包判斷以及輔助SDP處理。父類 VideoRTPSink處理非常簡單,僅僅是返回SDP類型是“video”。3. MultiFramedRTPSink類:完成多幀組包處理主要函數有buildAndSendPacket, packFrame, sendNext, afterGettingFrame,這幾個函數之間有相互調用。內部有OutPacketBuffer屬性,在建立是設定為(1000(希望),1448(最大))大小,其他是統計或者識別屬性。這個發送資料包是通過 fRTPInterface.sendPacket(fOutBuf->packet(), fOutBuf->curPacketSize());實現。這個fRTPInterface是父類RTPSink的屬性。SourcecreateNewStreamSource調用的是MPEG4VideoFileServerMediaSubsession中的定義。在類 OnDemandServerMediaSubsession中的createNewStreamSource定義是一個純虛函數。建立的source是:MPEG4VideoStreamFramer:MPEGVideoStreamFramer:FramedFilter:FramedSource:MediaSource:MediumMediaSource在Medium類的基礎上添加了更多媒體類型判斷,比如是H264,mpeg還是jpeg。此外還有一個MIME類型。FramedSource類處理成框架類型的媒體,比如 mpeg,mjpeg,h264,amr等音訊類型的媒體。改函數分幀處理媒體流,主要處理是getNextFrame,afterGetting以及關閉等ApsaraVideo for Media Processing,此外定義了doGetNextFrame純虛函數,這個函數由getNextFrame調用,處理具體的媒體流。該類還定義了兩個函數指標,afterGettingFunc* fAfterGettingFunc; onCloseFunc* fOnCloseFunc;處理。該類的屬性包括資料拷貝的指標,幀的大小,展示時間,和播放間隔。是否當前等待播放標誌。子類FramedFilter是FramedSource的子類,這是個中間類,主要在類中添加了指向輸入源的指標 FramedSource* fInputSource;MPEGVideoStreamFramer:是FramedFilter的子類,因為mpeg是時間相關的媒體流,所以在父類的基礎上添加了時間處理函數,此外還有 continueReadProcessing函數。主要的屬性有:幀率,結束標誌,圖片計數,展示時間,GOP時間相關內容,圖片時間相關屬性。此外還有一個重要的類屬性: MPEGVideoStreamParser用來分析媒體流。MPEG4VideoStreamFramer:在父類的基礎上添加了config資訊,類如profile等級資訊。在該類的定義檔案中還實現了MPEG4檔案分析類繼承自MPEGVideoStreamParser。處理mepg4相關資訊。ByteStreamFileSource::FramedFileSource::FramedSourcesource裡面有一個非常重要的StreamParser對象,用來分析,讀取流資料。其中afterGettingBytes和不同媒體流處理相關,內部有一個函數fClientContinueFunc為不同媒體註冊的函數。而getNextFrame會調用afterGettingBytes。RTPSoruceMPEG4ESVideoRTPSource:MultiFramedRTPSource:RTPSource:FramedSource:MediaSource:MediumRTPSource:添加RTP相關處理,主要屬性有RTPInterface,時間標籤,處理資料幀拆分packetMarkerbit時間戳記頻率和統計資訊。RTP統計資訊:收到的總包數,從reset以後收到的總包數,收到的位元組數,初始化序列標識,前面一個RTP包的時間戳記,接受到的寄件者報告的NTP時間,接受到的寄件者報告時間。RTPSource僅僅處理RTP協議相關的問題。MultiFramedRTPsource中的 networkHandler中會調用到這些處理。playing在服務端的操作中是圍繞著StreamState展開的,OnDemandServerMediaSubsession類中的StartStream通過調用StreamState的startplaying開始進行,並且初始化rtpSeqNum和rtpTimestamp (= rtpSink()->presetNextTimestamp()) 兩個變數。在MediaSink定義了startPlaying,這裡通過調用continuePlaying最終調用到了 buildAndSendPacket,函數buildAndSendPacket根據傳入的參數是否第一幀分別進行處理。如果是第一幀,那麼取目前時間標籤,作為發送時間,在函數packFrame中,首先調用afterGettingFrame1,然後調用 fSource->getNextFrame(fOutBuf->curPtr(), fOutBuf->totalBytesAvailable(),afterGettingFrame, this, ourHandleClosure, this);處理。在播放過程中,通過nextTask() = envir().taskScheduler().scheduleDelayedTask(uSecondsToGo,(TaskFunc*)sendNext, this);每次都會計算一個下次發送時間和包添加到調度中進行。讀取媒體資料在MPEG4VideoStreamParser類定義中處理。成員函數parse分析出讀取資料的大小。然後讀取一幀資料,交給打包代碼處理。 live555的rtsp媒體播放器,程式啟動後,以連接埠號碼和系統內容為參數,建立一個RTSPServer對象,然後進入doEvendLoop迴圈,等待事件。RTSPServerDynamicRTSPServer從RTSPServer繼承過來,僅僅添加了構造器和尋找函數,沒有添加其他成員。構造器是建立socket然後傳給 RTSPServer,尋找是如果沒有已經開啟的流服務,那麼根據參數建立流服務。RTSPServer的屬性有socket,連接埠號碼,Session點號,認證機制和ServerMediaSession表。根據RTSP協議,當服務端收到Play命令時候,開始播放。調用得是subSession得streamStart方法。現有的檔案媒體會話MPEG4VideoFileServerMediaSubsession:FileServerMediaSubsession: OnDemandServerMediaSubsession: ServerMediaSubsession : MediumServerMediaSubsession類和具體的流播放相關,是個純虛類。其中startStream和getStreamParameter是純虛函數。 OnDemandServerMediaSubsession是子類,在原來ServerMediaSubsession的基礎上添加了RTP處理,添加流source和rtp-sink處理。封裝seek,pause等處理,把這些介面中clientSessionid號到這裡轉換成了FramedSource。getStreamParameters方法會建立streamState。這個方法在處理RTP的Setup命令時被調用。onDemandServerMediaSubsession  類變數fDestinationsHashTable儲存Destination對象,destination封裝的時地址資訊包括地址,連接埠,rtp資訊。類streamState的屬性有: OnDemandServerMediaSubsession& fMaster; Boolean fAreCurrentlyPlaying;unsigned fReferenceCount;                             Port fServerRTPPort, fServerRTCPPort;RTPSink* fRTPSink;                                          BasicUDPSink* fUDPSink;float fStreamDuration;                                        unsigned fTotalBW; RTCPInstance* fRTCPInstance;FramedSource* fMediaSource;                        Groupsock* fRTPgs; Groupsock* fRTCPgs;sink有兩種,一個時BasicUDPSink,一個是RTPSink,如果協商時沒有RTP資訊,那麼建立BasicUDPSink。Source和 Sink通過函數createNewRTPSink和createNewStreamSource。這兩個函數在類 OnDemandServerMeidaSubsession中定義為純虛函數,如果媒體類型是mpeg4videofileserver,那麼對應的函數定義在類MPEG4VideoFileServerMediaSubsession中。播放程序呼叫Sink的startPlaying,如果是RTPSink,那麼建立RTCPInstance,添加RTCP處理函數rtcpRRHandler。 RTPSink->startPlaying(fMediaSource,afterPlayingStreamState,this)這裡傳入的三個三數分別是source,處理函數和StreamState對象。SinkSink類提供了總的媒體播放介面,屬性有:fSource指標,AfterPlayFunc函數指標和fAfterClientData。主要介面是startPLaying,continuePlaying純虛函數,和前面的AfterPlayFunc

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.