UPnP媒體播放器的研究與實(shí)現
通用型即插即用UPnP(Universal Plug and Play)是PnP(Device Plug and Play)的擴展,它可發(fā)現和控制各種網(wǎng)絡(luò )設備,如網(wǎng)絡(luò )打印機、Internet網(wǎng)關(guān)等,并能提供相應服務(wù)。但UPnP不是即插即用的簡(jiǎn)單擴展,它支持“0配置”和無(wú)線(xiàn)網(wǎng)絡(luò ),可自動(dòng)發(fā)現其他供應商提供的設備。在UPnP協(xié)議下,一個(gè)設備可動(dòng)態(tài)的加入網(wǎng)絡(luò ),獲得IP地址,廣播其功能,并了解其他設備的功能。很多種類(lèi)的設備都可以使用UPnP協(xié)議,包括智能設備,無(wú)線(xiàn)設備。
UPnP使用標準的TCP/IP和Internet協(xié)議,能夠很好的在現存網(wǎng)絡(luò )中使用,使用這些標準協(xié)議使UPnP可從已有的各種經(jīng)驗和知識中獲利,打破各種信息孤島,越過(guò)各種物理層,可以是有線(xiàn)的,也可以是無(wú)線(xiàn)的,具有設備間的相互協(xié)作基本特點(diǎn)。
目前,DLNA(現代數字家庭)是一個(gè)非?;钴S的領(lǐng)域,UPnP是其中的主流協(xié)議之一。DLNA/UPnP的遠景是構建一個(gè)有線(xiàn)與無(wú)線(xiàn)的互操作網(wǎng)絡(luò ),由個(gè)人電腦、家用電器和移動(dòng)設備組成,在家庭內部實(shí)現設備互聯(lián)和網(wǎng)絡(luò )控制,從而實(shí)現影音娛樂(lè )、內容共享。
UPnP組成包括設備節點(diǎn),服務(wù)節點(diǎn)和控制節點(diǎn)。在UPnP網(wǎng)絡(luò )中,最小的可控制單位是服務(wù),采用一系列的狀態(tài)變量描述服務(wù)的“行為”和“狀態(tài)”。UPnP使用各種現存的標準協(xié)議口,包括TCP/IP、HTTP,HTTPU、SSDP、GENA。使用標準化的協(xié)議保證了各種設備間的互操作性??傊?,UPnP建立在各種協(xié)議之上,而不是API上,這使其能應用在各種不同的平臺上。同時(shí),建立在各種現存的標準之上,具備很強的靈活性,可很好的適應現在和將來(lái)各種網(wǎng)絡(luò )設備的需求。
2 UPnP媒體播放器設計的基本思想
2.1 功能描述
UPnP網(wǎng)絡(luò )媒體播放器可以提供從網(wǎng)絡(luò )中獲取的各種娛樂(lè )信息,它允許控制節點(diǎn)對其進(jìn)行控制。此外,根據所支持協(xié)議的不同,播放器也可以提供對數據流進(jìn)行控制的功能。一個(gè)標準的UPnP網(wǎng)絡(luò )媒體播放器包含播放控制服務(wù)、連接管理服務(wù)和媒體傳輸服務(wù)。任何媒體播放器都至少提供兩種服務(wù):播放控制服務(wù)和連接管理服務(wù),媒體傳輸服務(wù)是可選的,它取決于設備所支持的傳輸協(xié)議。這里設計使用的協(xié)議是HTTP GET,能提供媒體傳輸服務(wù),因而可以在數據傳輸過(guò)程中控制數據流。
2.2 過(guò)程描述
媒體播放器可由控制節點(diǎn)在局域網(wǎng)內對媒體服務(wù)器所提供的媒體進(jìn)行播放控制。媒體服務(wù)器、播放器、控制節點(diǎn)3者的互動(dòng)過(guò)程如下:控制節點(diǎn)使用SSDP協(xié)議在局域網(wǎng)內發(fā)現一個(gè)或多個(gè)媒體服務(wù)器和媒體播放器,首先定位媒體服務(wù)器上的資源,并需明確在服務(wù)器和播放器之間傳輸數據所需的協(xié)議和它們都支持的數據格式。這些傳輸參數都被確定后,控制節點(diǎn)就可以對傳輸的內容進(jìn)行控制,如播放、暫停、停止等。真正的數據傳輸是在服務(wù)器和媒體播放器之間直接進(jìn)行的,并且獨立于控制節點(diǎn),因此不包含在UPnP內。即內容的傳輸是使用UPnP以外的協(xié)議。之后,控制節點(diǎn)使用媒體服務(wù)器所提供的內容目錄服務(wù)來(lái)獲取該服務(wù)器所支持的協(xié)議和數據類(lèi)型,使用媒體播放器的連接管理服務(wù)來(lái)獲取相應的信息,比較后選定雙方都支持的傳輸協(xié)議和數據類(lèi)型。在本設計中,使用的傳輸協(xié)議是HTTP GET,所支持的數據格式為MP3。最后,控制節點(diǎn)使用媒體播放器提供的媒體傳輸服務(wù)來(lái)控制數據流。
3 UPnP媒體播放器的實(shí)現方法
設計使用Intel公司的開(kāi)源UPnP開(kāi)發(fā)工具Device-Builder,在Microsoft.NET Framwork下開(kāi)發(fā)。DeviceBuilder生成的UPnP協(xié)議棧由MiniServer模塊、HTTP模塊、線(xiàn)程庫模塊、XML解析模塊及協(xié)議棧編程接口等模塊組成,負責提供基本的UPnP功能,具體實(shí)現流程如下。
3.1 生成UPnP框架
使用DeviceBuilder生成相應平臺上的代碼,由于是在Microsoft.NET Framwork下開(kāi)發(fā),所以選擇的Target Platform應為:Windows 98,NT,XP。具體功能有:尋址、發(fā)現、描述、控制、發(fā)布事件。各功能組合在一起,為媒體播放器提供UPnP能力,但Intel開(kāi)發(fā)包生成的僅是一個(gè)框架,還要為其添加解碼、控制功能及對播放列表的識別等。
3.2 添加媒體解碼庫
下載一個(gè)開(kāi)源的播放器,將其改造成媒體解碼庫。即將播放器的功能抽象成函數以供外界調用,主要函數如下:
int decodestart(char*pBuffer):調用該函數開(kāi)始播放,相當于原來(lái)播放器的play功能。pBuffer是一個(gè)公共緩沖區,存放已下載的媒體數據。
extem void Read(int*position):負責向公共緩沖區中裝入已下載的媒體數據,position指針則對應于公共緩沖區中應裝入的位置。由于一般下載的速度遠大于解碼速度,所以應注意裝入新數據時(shí)不要將尚未解碼的數據覆蓋掉。
extern void Decode(int*Dposition):當外界調用該函數時(shí)開(kāi)始解碼,Dposition則指示對應于公共緩沖區的解碼位置。
此外還有pause,resume,stop等函數,均對應于原播放器的相應功能。將已實(shí)現的媒體解碼庫添加到生成的UPnP框架,再在UPnP框架中相應的位置調用庫文件中的函數以實(shí)現解碼、播放控制。
3.3 播放控制功能實(shí)現
添加媒體解碼庫后。還需添加:數據流實(shí)時(shí)控制能力、根據播放器的狀態(tài)發(fā)布消息。詳細過(guò)程如下:
(1)設置傳輸地址 當控制節點(diǎn)從媒體服務(wù)器選定一首歌時(shí),則觸發(fā)設置傳輸地址(由媒體傳輸服務(wù)提供)這一動(dòng)作。這時(shí),如果播放器正在播放,首先要停止播放器的解碼動(dòng)作,為新歌曲的播放做準備。接下來(lái),在播放器獲得所選定歌曲的地址后(由控制節點(diǎn)提供),直接從媒體服務(wù)器中下載這首歌曲,在此項目中,播放器采用HTTP GET下載。下載前,還需對該URL進(jìn)行判斷,查看下載的是否為播放列表,如果是播放列表,就不能將其直接傳給播放器,而要繼續從播放列表提供的地址中得到第1首歌的URL,再從媒體服務(wù)器中下載。最后,調用函數SetLastChange發(fā)布自己的狀態(tài)信息。
(2)數據流實(shí)時(shí)控制在下載的大小達到一定長(cháng)度時(shí),觸發(fā)傳輸控制服務(wù)中Play這一動(dòng)作,這時(shí),主線(xiàn)程創(chuàng )建一個(gè)解碼線(xiàn)程,該線(xiàn)程調用媒體解碼庫中的decodestart(char*pBuffer)函數,對存放在公用緩沖區中的數據進(jìn)行解碼并播放,進(jìn)行同步控制,以免當網(wǎng)絡(luò )出現擁塞或系統內存不足時(shí),緩沖區中的播放指針超過(guò)下載指針而導致意外。如果選定的是含有多首歌曲的播放列表,則過(guò)程類(lèi)似,只不過(guò)在一首歌曲播放完時(shí)會(huì )自動(dòng)從媒體服務(wù)器端下載另一首歌曲,一邊下載,一邊播放。當用戶(hù)點(diǎn)擊next,previous時(shí),首先檢查之前保存的URL是否為播放列表,若不是,則輸出錯誤信息;若是,則停止播放器的解碼動(dòng)作,撤銷(xiāo)當前解碼線(xiàn)程,為新歌的播放做準備。由播放列表得到下一首歌的地址和端口號,開(kāi)始下載數據,并創(chuàng )建新的解碼線(xiàn)程,最后,發(fā)布狀態(tài)信息。
評論