SETUP
rtsp 會話 SETUP 階段,會呼叫OnDemandServerMediaSubsession :: getSt
reamParameters,裡面產生 mediaSource 與 rtpSink 用的就是需要實作的 creat
eNewStreamSource 跟 creatNewRTPSink , mediaSource 與 rtpSink 會以 stre
amState 這個 class 保存,就是裡面的 fMediaSource , fRTPSink (streamToken
這個變數,後面 startStream() 會使用他)
以 mpeg4 video 為例,createNewStreamSource 裡面先產生一個 ByteStre
amFileSource * fileSource ,以此為inputSource,產生一個 Mepg4VideoStrea
mFramer ,返回給 mediaSource,其中 ByteStreamFileSource 的 doGetNextFr
ame 呼叫 ByteStreamFileSource :: doReadFromFile() ,裡面有 fread(fTo, 1, fM
axSize, fid),讀出來的東西當然還需要一些 parse 的手段,不過我們不需要,我
們是要直接把 NAL 餵進去,裡面還有設定 fPrestationTime 等變數的部分,可以
參考
PLAY
到 PLAY 階段,會 startStream ,裡面會呼叫到 StreamState :: startPlaying 然
後 fRTPSink->startPlaying (定義在MediaSink::startPlaying) ,裡面會把 MediaS
ink 的變數 fSource 設定為前面的 fMediaSource , 然後執行 continuePlaying() ,
在 H264VideoRTPSink::continuePlaying() 裡,會讓 fSource 等於 H264VideoRT
PSink :: fOurFragmenter ( 一個 H264FUAFragmenter class) ,而原來的 fSource
變為 fOurFragmenter 的 fInputSource ,然後執行 MultiFramedRTPSink :: conti
nuePlaying() ......MultiFramedRTPSink::buildAndSendPacket(true) ...... MultiFra
medRTPSink :: packFrame(),這裡設定好 fSource :: fTo 這個指標指到 fOutBuf-
>curPtr()
H264FUAFragmenter 繼承 FramedFilter : FramedSource ,在上面 fOurFra
gmenter 就定義了 FramedFilter::fInputSource 等於 fSource, H264FUAFragm
enter :: doGetNextFrame() 會設定 FramedFilter :: fInputSource 的 fTo , i.e.
memmove(fTo, &fInputBuffer[1], fNumValidDataBytes - 1);
_ &fInputBuffer[1] => startcode 應該可以一起放進去
_ 所以 fInputBuffer 是我們 startcode + NAL hdr + NAL payload 要存
评论11