1. 程式人生 > >Source和Sink:可以把source理解為傳送端的流,sink理解為接受端。MediaSink是各種型別的Sink的基類,MediaSource是各種型別Source的基類,各種型別的流媒體格式

Source和Sink:可以把source理解為傳送端的流,sink理解為接受端。MediaSink是各種型別的Sink的基類,MediaSource是各種型別Source的基類,各種型別的流媒體格式

Source和Sink:可以把source理解為傳送端的流,sink理解為接受端。MediaSink是各種型別的Sink的基類,MediaSource是各種型別Source的基類,各種型別的流媒體格式和編碼的支援即是通過對這兩個類的派生實現的。Source和Sink通過RTP子會話(MediaSubSession)聯絡在一起。

   FramedSource 派生自MediaSource, 一幀碼流的實現。私有unsigned char* fTo; // in  是指向傳送的碼流的指標。

重要的函式有 getNextFrame

void FramedSource::getNextFrame(unsigned
char* to, unsigned maxSize, afterGettingFunc* afterGettingFunc, void* afterGettingClientData, onCloseFunc* onCloseFunc, void* onCloseClientData) { // Make sure we're not already being read: if (fIsCurrentlyAwaitingData) { envir() << "FramedSource[" << this << "]::getNextFrame(): attempting to read more than once at the same time!\n"
; envir().internalError(); } fTo = to; fMaxSize = maxSize; fNumTruncatedBytes = 0; // by default; could be changed by doGetNextFrame() fDurationInMicroseconds = 0; // by default; could be changed by doGetNextFrame() fAfterGettingFunc = afterGettingFunc; fAfterGettingClientData = afterGettingClientData;
fOnCloseFunc = onCloseFunc; fOnCloseClientData = onCloseClientData; fIsCurrentlyAwaitingData = True; doGetNextFrame(); }
doGetNextFrame(); 是一個虛擬函式,具體各種編碼模式,我們可以根據自己的碼流型別定義一個派生自FramedSource的類, 重新再定義doGetNextFrame如何獲得下一幀的碼流。在自己重定義的doGetNextFrame() 中將fTo指向要傳送的快取。
<br><br>我們可以通過doGetNextFrame() 是fTo重定向我們要傳送的流,而不是從檔案中讀取。(搞定了source)之後就是要如何讓fTo與傳送會話連線起來,OnDemandServerMediaSubsession由 ServerMediaSubsession 派生而來,其有一個新的私有函式 virtual FramedSource* createNewStreamSource,我們又可以重新定義一個派生自OnDemandServerMediaSubsession 的類,重新定義createNewStreamSource 將fTo 與 ServerMedia聯絡起來。<br>如下live555中的例子<br><br>
複製程式碼
FramedSource* H264VideoFileServerMediaSubsession::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) {
  estBitrate = 500; // kbps, estimate

  // Create the video source:
  ByteStreamFileSource* fileSource = ByteStreamFileSource::createNew(envir(), fFileName);
  if (fileSource == NULL) return NULL;
  fFileSize = fileSource->fileSize();

  // Create a framer for the Video Elementary Stream:
  return H264VideoStreamFramer::createNew(envir(), fileSource);
}
複製程式碼
ByteStreamFileSource說到底還是繼承自FramedSource,定義了從檔案獲取source的方法,而這個函式又將ServerMedia 與source聯絡了起來,
ServerMedia 就知道該傳送什麼東東了。  return H264VideoStreamFramer::createNew(envir(), fileSource); 給 ServerMedia  返回了一個 FramedSource 。
不過,如果自己定義的ServerMedia直接從 OnDemandServerMediaSubsession 繼承的話,有很多純虛擬函式需要自己去實現,比較麻煩,所以可以直接從
H264VideoFileServerMediaSubsession 繼承,它實現了這些純虛擬函式,我們只需重定義createNewStreamSource 就ok了。
FROM:  http://www.cnblogs.com/mlj318/archive/2013/01/23/2871952.html