2016年11月9日 星期三

live555 -- wis-streamer 與 media-server 的抉擇

當我們要實作一個 streaming server 時,該參考哪個範例較適合呢? Live555 提供了許多程式範例,以下將簡介各個測試程式,以了解何時該採用哪個範例。

一、範例程式介紹

1. testProgs\testXXXStreamer
針對每個媒體格式,單獨提供一個支援 RTSP 協定的 streaming server 的使用範例。例如:testH264VideoStreamer.cpp, testAMRAudioStreamer.cpp。
此範例內的多媒體內容會直接由檔案取得。

2. testProgs\testXXXToTransportStream
針對每個媒體格式,單獨提供一個 MPEG2 Transport Stream 協定的 streaming server 的使用範例。例如:testH264VideoToTransportStream.cpp,  testMPEG1or2AudioVideoStreamer.cpp。此範例內的多媒體內容會直接由檔案取得。

3. LIVE555 Media Server
The "LIVE555 Media Server" is a complete RTSP server application.  
media-server 支援多種 media,若需要同時支援多種格式,則可以考慮使用: 
支援的影像格式
MPEG, WebM, Ogg, MPEG-4, MPEG-1, MPEG-2, H.264, H.265, VOB, DV
支援的聲音格式
PCM, AMR, AC-3, AAC, mp3
此範例內的多媒體內容會直接由檔案取得。需移除不需要的部分。

4. wis-streamer
"wis-streamer" is a standards-compliant RTSP/RTP server application that streams encoded video and audio from the Linux WIS GO7007 driver.  
wis-streamer 支援四種影像格式與三種聲音格式, 
支援的影像格式
MPEG-4, MPEG-1, MPEG-2, MJPEG
支援的聲音格式
PCM, 8-bit u-law, or MPEG-2 audio format
此範例內的多媒體內容會從硬體即時取得。此範例同時針對 AMR, AAC, 提供了軟體編碼的程式碼。

由上述比較,建議方式如下
  • 若應用程式要即時從硬體取得影音進行串流,則參考 wis-streamer的作法,較快上手。
  • 若應用程式要即時從檔案系統內取得影音進行串流,則可參考 "LIVE555 Media Server"。


二、wis-streamer 程式流程

1. 流程簡介如下。
checkArgs() :
分析 argv 帶入的參數,並且設定到對應的全域變數中,例如:videoFormat 或是 audioFormat。若是應用程式只需提供幾個固定的串流媒體,其實可以省略此步驟。
WISInput* inputDevice = WISInput::createNew(*env);
建立影像與聲音的來源,幾個重要的函數描述如後:
  • openFiles(),開啟影像與聲音擷取裝置。 
  • initALSA(),透過 Linux ALSA(Advanced Linux Sound Architecture) 裝置,設定輸入的聲音參數,如:format, sample rate, channel number。 
  • initV4L(),透過 Linux V4L(video4linux) 裝置,設定輸入的影像參數,如:format, video width, video height。
此處如果想要使用不同軟體架構來取得影像與聲音,便得要自行改寫,例如:改成透過 OpenMAX 來取得媒體資料。 
當物件建立成功後,會產生兩個 FramedSource,分別是 fOurVideoSource 與 fOurAudioSource。這兩個 source 會當成串流資料的來源。
rtspServer = RTSPServer::createNew(*env, rtspServerPortNum, authDB);
建立 RTSP Server,其底層實作透過 OnDemandServerMediaSubsession
setupUnicastStreaming(*inputDevice, sms);
設定 RTSP Server 的影像與聲音來源為 inputDevice,
例如:可以新增兩個 OnDemandServerMediaSubsession,分別用來處理影像與聲音,其資料來源為 fOurVideoSource 與 fOurAudioSource 
env->taskScheduler().doEventLoop();
進入無窮迴圈,等待 client 連接。 
Live555處理流程可參考 liv555.html,此處只針對 wis-streamer 接口部分說明
RTSPServer::RTSPClientSession::handleCmd_PLAY  // 此處是 live555 原本的程式碼
  ... // 中間過程省略
    fSource->getNextFrame() // wis-streamer 從此處接手,此處fsource=WISVideoOpenFileSource, 
      doGetNextFrame() // 對應 WISOpenFileSource::doGetNextFrame()
        incomingDataHandler() 
          incomingDataHandler1()
            readFromFile() // 假設使用 Video,則對應 WISVideoOpenFileSource:readFromFile() 

2. 若要使用 wis-streamer 當範例進行修改,主要要修改兩個地方,如下:
  • WISInput::createNew() 先進行資料來源初始化
  • WISVideoOpenFileSource:readFromFile() 持續讀取資料,直到串流結束。

參考資料:
  1. http://www.live555.com/wis-streamer/
  2. http://nikosapi.org/w/index.php/WIS_Go7007_Linux_driver