基於移動平臺的多媒體框架——使用live555接收流媒體方法簡介

基於移動平臺的多媒體框架——使用live555接收流媒體方法簡介

更多關於live555的詳細信息請參考官網:http://www.live555.com


爲什麼要用live555?因爲mplayer和vlc這兩個著名的項目都用了,由此也能反映出live555這個庫的重要價值。
關於流媒體的基本知識就不贅述了。本文着重介紹如何使用live555這個庫使得播放器支持播放流媒體格式的文件。
簡述一下live555的主要目錄結構。
UsageEnvironment
groupsock
liveMedia
BasicUsageEnvironment
testProgs


主要有這5個目錄,其他關於live555分析的文章裏介紹過很多裏,具體的介紹還是可以看官網的描述。這裏着重介紹兩個目錄:

1. mediaServer 該目錄不在上述5個主要目錄中列出,其中有個小程序,名叫live555MediaServer。這是個使用live555庫寫出的一個流媒體服務器,功能就是將本地的視頻文件變成媒體流。使用方法也很簡單,只要運行這個文件,就可以將當前目錄下所有的支持流化格式的多媒體文件進行流化。如圖所示:


這裏就可以看到對應的rtsp的地址,以及其所支持的文件類型。

根據我的簡單測試,發現這個服務器還不是很穩定,有時候會崩潰。如果你需要一個比較穩定的流服務器,還是建議參考前面的一篇

基於移動平臺的多媒體框架——用VLC搭建簡單的流媒體服務器

2. 第二個會用到的目錄是testProgs。編譯好後會看到裏面有許多測試程序。這裏提到一個叫做openRTSP的程序,這是live555做的一個比較完整的接收rtsp流的工程。運行./openRTSP rtsp://IP:PORT/FILENAME之後,就會在當前目錄下看到一個以video-MPV-開頭的文件,這就是openRTSP接受到流後然後保存在本地的文件。

雖然這個openRTSP已經做的比較穩定,功能也很完整,但是如果要用live555開發自己的RTSP應用程序,不建議基於這個程序,而比較建議基於一個叫做testRTSPClient的小而簡單的測試程序。可以打開openRTSP看到作者在註釋中寫到的:

// NOTE: If you want to develop your own RTSP client application (or embed RTSP client functionality into your own application),
// then we don't recommend using this code as a model, because it is too complex (with many options).
// Instead, we recommend using the "testRTSPClient" application code as a model.

相反,testRTSPClient中的註釋寫的是:

// NOTE: This code - although it builds a running application - is intended only to illustrate how to develop your own RTSP
// client application.  For a full-featured RTSP client application - with much more functionality, and many options - see
// "openRTSP": http://www.live555.com/openRTSP/

所以,我們就可以參考testRTSPClient的程序寫我們自己的流媒體播放器。

關於RTSP協議,這張圖可以比較簡單的描述:

需要收發的包有:OPTIONS DESCRIBE SETUP SET_PARAMETER PLAY TEARDOWN 這幾種。在testRTSPClient中,我們只用到DESCRIBE SETUP PLAY TEARDOWN這四種進行順序發送。對前三種包的發送分別定義回調函數進行接受,接收到之後相應的事務在回調函數中處理。

// RTSP 'response handlers':
void continueAfterDESCRIBE(RTSPClient* rtspClient, int resultCode, char* resultString);
void continueAfterSETUP(RTSPClient* rtspClient, int resultCode, char* resultString);
void continueAfterPLAY(RTSPClient* rtspClient, int resultCode, char* resultString);
在收到PLAY reply之後,將收到的數據傳入一個sink中就可以用sink進行播放了。在testRTSPClient中,我們實現了一個非常簡單的sink,只負責打印收到的每一幀的時間戳。

// Define a data sink (a subclass of "MediaSink") to receive the data for each subsession (i.e., each audio or video 'substream').
// In practice, this might be a class (or a chain of classes) that decodes and then renders the incoming audio or video.
// Or it might be a "FileSink", for outputting the received data into a file (as is done by the "openRTSP" application).
// In this example code, however, we define a simple 'dummy' sink that receives incoming data, but does nothing with it.

class DummySink: public MediaSink 

用我們需要進行解碼播放的函數實現一個sink,就可以得到一個完整的從接受rtsp流到播放出畫面的流媒體播放器了。


發佈了46 篇原創文章 · 獲贊 12 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章