基于DVB-C的流媒體廣播系統(tǒng)實(shí)驗(yàn)研究
1 引言
基于DVB-C的數(shù)據(jù)廣播在共享多媒體等海量數(shù)據(jù)方面具有明顯的優(yōu)勢(shì),可解決網(wǎng)絡(luò)上傳輸海量流媒體信息資源引起的網(wǎng)絡(luò)阻塞,是一種低成本接收和可提供優(yōu)質(zhì)服務(wù)的優(yōu)秀信息共享結(jié)構(gòu)。因此,基于DVB-C數(shù)據(jù)廣播網(wǎng)的流媒體技術(shù)是具有潛力的技術(shù)。
為此,本文介紹了一種搭建在實(shí)驗(yàn)室的流媒體廣播系統(tǒng),可用于DVB-C有線電視廣播網(wǎng)平臺(tái),為現(xiàn)有DVB-C數(shù)字有線電視系統(tǒng)開展流媒體業(yè)務(wù)提供了一種由發(fā)送端到接收端的解決方案。
2 流媒體傳輸技術(shù)方案
流媒體的傳輸涉及到兩方面的技術(shù):其一,服務(wù)器端與客戶端的通信技術(shù),包括多媒體數(shù)據(jù)的傳輸、命令控制等;其二,客戶端對(duì)收到的多媒體流實(shí)時(shí)解碼播放的技術(shù)。
本文中,對(duì)多媒體流的解碼播放使用DirectShow技術(shù),它將流媒體處理劃分為若干個(gè)連續(xù)的步驟,包括音視頻數(shù)據(jù)的采集、傳輸、分離、合并、編碼、解碼和回放等。每個(gè)具體的流媒體處理過程可由其中的幾個(gè)步驟組成。利用其中濾波器處理一個(gè)或多個(gè)步驟,用不同的濾波器實(shí)現(xiàn)不同的功能。開發(fā)人員可創(chuàng)建自己的濾波器,也可用微軟或第三方提供的濾波器。應(yīng)用程序連接若干個(gè)濾波器進(jìn)行指定的流媒體處理。數(shù)據(jù)可在不同的濾波器間傳輸,傳輸方向一般是單向的。一個(gè)過濾器通過輸出針將特定的輸出送到下游過濾器的輸入針。傳輸?shù)臄?shù)據(jù)加有時(shí)間戳,用來同步音視頻數(shù)據(jù)的回放。
圖1為利用DirectShow開發(fā)流媒體程序的框圖。
在DirectShow中,濾波器分為3類。
1) 源濾波器:從數(shù)據(jù)源獲取原始數(shù)據(jù)。不同的源濾波器可處理一類或多類數(shù)據(jù)源,包括本地文件、網(wǎng)絡(luò)和數(shù)據(jù)采集卡等。
2) 變換濾波器:用來獲取、處理和傳送媒體數(shù)據(jù),它包括分離視頻和音頻的切分過濾器、解壓視頻數(shù)據(jù)的視頻解碼過濾器、解壓音頻數(shù)據(jù)的音頻解碼過濾器。
3) 終端濾波器:對(duì)數(shù)據(jù)進(jìn)行最后的處理,可顯示視頻、回放音頻、保存數(shù)據(jù)或者將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)等。
3 系統(tǒng)設(shè)計(jì)
3.1 系統(tǒng)總體設(shè)計(jì)
在DVB傳輸協(xié)議的基礎(chǔ)上,采用合適的硬件和軟件結(jié)構(gòu)可構(gòu)建一套數(shù)據(jù)廣播系統(tǒng)。圖2給出了在實(shí)驗(yàn)室搭建的基于DVB-C的數(shù)據(jù)廣播系統(tǒng)平臺(tái)結(jié)構(gòu)圖。
系統(tǒng)所用設(shè)備:北京藍(lán)拓?fù)涞腎P/DVB網(wǎng)關(guān)(BDG-10)和數(shù)據(jù)接收卡(BDR-10C);九州QAM調(diào)制器;普通PC機(jī),其中服務(wù)器使用WIN XP操作系統(tǒng);客戶機(jī)使用的WIN 2000操作系統(tǒng);IP/DVB網(wǎng)關(guān)使用WIN 2000Server操作系統(tǒng)。
該系統(tǒng)同時(shí)具備本地文件廣播及流媒體廣播功能。服務(wù)器利用IP多播技術(shù),將UDP數(shù)據(jù)包通過內(nèi)部以太網(wǎng)傳送到IP/DVB網(wǎng)關(guān),把輸入的IP數(shù)據(jù)打包成DVBTS碼流輸出,經(jīng)過640AM調(diào)制器調(diào)制到一個(gè)特定的8MHz帶寬的模擬電視頻道上,在有線電視網(wǎng)上傳送,信號(hào)經(jīng)過分支器進(jìn)行衰減,客戶端的PC機(jī)使用DVB-C接收卡接收各類文件及流媒體數(shù)據(jù)。
根據(jù)流媒體系統(tǒng)的設(shè)計(jì)要求,整個(gè)基于DVB-C的流媒體廣播軟件系統(tǒng)由服務(wù)器數(shù)據(jù)廣播發(fā)送軟件系統(tǒng)和客戶端接收實(shí)時(shí)播放軟件系統(tǒng)組成。
3.2 服務(wù)器端軟件設(shè)計(jì)
實(shí)驗(yàn)系統(tǒng)軟件設(shè)計(jì)采用面向?qū)ο蟮某绦蛟O(shè)計(jì)方法,藍(lán)拓?fù)浣邮湛ㄌ峁┝诉m用于Visual C++6.0的API接口函數(shù),因此,軟件開發(fā)臺(tái)使用Visual C++提供的MFC編程平臺(tái),發(fā)送接收使用Windows Socket技術(shù),采用面向無連接的UDP協(xié)議來實(shí)現(xiàn)服務(wù)器端主動(dòng)發(fā)送數(shù)據(jù)、用戶端被動(dòng)接收數(shù)據(jù)。發(fā)送端選擇MPEG-1編碼格式的多媒體文件作為節(jié)目源。
其發(fā)送進(jìn)程如圖3所示。
1) 初始化進(jìn)程環(huán)境
2) 數(shù)據(jù)庫(kù)記錄集對(duì)象_RecordsetPtrm_pRecordset首先移動(dòng)到記錄集中的第一條記錄處m_pRecordset.Movefirst();
3) 讀取數(shù)據(jù)庫(kù)獲得文件路徑(數(shù)據(jù)庫(kù)第三欄)m_p Recordset->GetCollect(“位置”),用函數(shù)CFile::Open打開待發(fā)送的文件;
4) 啟動(dòng)文件發(fā)送線程(一個(gè)函數(shù)循環(huán)),用函數(shù)CFile::read順序讀取文件數(shù)據(jù)(74 368 bit)到緩沖區(qū),緩沖區(qū)定義為
#define MPEG1_PACK 9296
cbar* pBuf = new char[MPEG1_PACK]
用CSocket::SendTo函數(shù)將緩沖區(qū)數(shù)據(jù)封裝成UDP包并發(fā)送到網(wǎng)關(guān),等待30 ms后繼續(xù)此循環(huán),直至文件發(fā)送完畢;
5) 將記錄集對(duì)象指針移動(dòng)到下一條記錄處,發(fā)送下一個(gè)文件,程序執(zhí)行3),直至記錄集對(duì)象指針指到最后一條記錄處。
3.3 客戶端軟件設(shè)計(jì)
客戶端接收并解碼播放部分是系統(tǒng)的難點(diǎn)也是重點(diǎn)。客戶端解碼播放部分建立的DirectShow過濾器如圖4所示。除了源濾波器外,其他濾波器由DirectShow SDK中提供,但MPEG-1切分過濾器只能工作在拉模式(切分過濾器向源過濾器發(fā)送數(shù)據(jù)請(qǐng)求,源過濾器發(fā)送數(shù)據(jù)來回應(yīng)請(qǐng)求)下,因此,Source Filter也設(shè)計(jì)成拉模式。
客戶端接收實(shí)時(shí)回放軟件系統(tǒng)所用的關(guān)鍵技術(shù)有:
1) 雙緩沖隊(duì)列技術(shù)
客戶端通過函數(shù)CSocket::ReceiveFrom循環(huán)接收服務(wù)器端發(fā)送的數(shù)據(jù)包,為減輕網(wǎng)絡(luò)抖動(dòng)的影響,必須進(jìn)行一定量的緩沖,才能交給DirectShow解碼處理,動(dòng)態(tài)地一邊繼續(xù)從網(wǎng)絡(luò)接收數(shù)據(jù),一邊將得到的數(shù)據(jù)進(jìn)行解碼回放。因此,使用了雙緩沖隊(duì)列技術(shù),封裝的CDataAdmin類實(shí)現(xiàn)對(duì)數(shù)據(jù)接收隊(duì)列的管理。
建立了兩個(gè)隊(duì)列:第一隊(duì)列是空閑的緩沖隊(duì)列Pool-List,用以接收存放數(shù)據(jù)包;另一個(gè)是尚未處理的數(shù)據(jù)緩沖隊(duì)列DataList,等待下游Filter的讀取。其代碼如下:
當(dāng)客戶端接收到一個(gè)包的數(shù)據(jù),從PoolList的頭部拿出一個(gè)緩沖塊,存放數(shù)據(jù),然后將這個(gè)緩沖塊加入到DataList的尾部等待DirectShow的Filter讀取;從DataL-ist頭部拿出一個(gè)緩沖塊,DirectShow的Filter讀取緩沖塊內(nèi)的數(shù)據(jù),讀完后將緩沖塊加入到PoolList的尾部,等待再一次地接收數(shù)據(jù)。
2) 源過濾器的設(shè)計(jì)
流媒體數(shù)據(jù)傳輸技術(shù)決定了DirectShow Filter只能讀取緩沖中的各個(gè)包數(shù)據(jù),由于DirectShow只提供了異步文件源過濾器和URL文件源過濾器,因此,自己必須設(shè)計(jì)源過濾器。如圖5所示。
在源過濾器的模塊結(jié)構(gòu)中,過濾器CMemStream是從DirectShow SDK中的基類CAsyncStream繼承而來,處理從第二隊(duì)列中讀取數(shù)據(jù),主要是由重載的CMem-Stream::read函數(shù)完成。輸出CAsyrncOutPin實(shí)現(xiàn)了I-AsyncReader接口以支持異步操作。所使用的切分過濾器的輸入pin是拉模式,它從CAsyncOutputPin的IAsyn-cReader接口中索取數(shù)據(jù)。圖中所有的數(shù)據(jù)請(qǐng)求都是由異步I/O操作類CAsyncIo來處理,而CAyncIo的核心是請(qǐng)求對(duì)列處理線程,它不停地從請(qǐng)求隊(duì)列中取數(shù)據(jù)請(qǐng)求并處理,實(shí)現(xiàn)異步數(shù)據(jù)請(qǐng)求操作。
總體數(shù)據(jù)流向?yàn)椋涸诮⒃礊V波器CMemReader時(shí),CMemReader會(huì)建立一個(gè)CAyncIo對(duì)象且CAsyncIo在合適啟動(dòng)一個(gè)請(qǐng)求丟隊(duì)列處理線程,然后開始以下的處理流程:1)MPEG-1切分過濾器向CAyncOutputPin提出數(shù)據(jù)請(qǐng)求;2) CAsyncOutputPin將該請(qǐng)求加以包裝并加入到CAsyncIo的請(qǐng)求隊(duì)列中,由處理線程來處理;3)處理線程通過內(nèi)部流類CMemStream訪問緩沖區(qū),讀取數(shù)據(jù)并通過CAyncOutputPin發(fā)給MPEG-1切分過濾器。實(shí)際應(yīng)用時(shí),使用了DirectShow SDK提供的基類CAyncIo和CAyncOutputPin,CMemReader是從DirectShow SDK中的基類CAsyncReader繼承而來,這一切簡(jiǎn)化了程序設(shè)計(jì)。
4 實(shí)驗(yàn)結(jié)果分析
實(shí)驗(yàn)完成了單路多媒體數(shù)據(jù)的廣播流式發(fā)送與接收并實(shí)時(shí)播放。利用丟包率與網(wǎng)絡(luò)帶寬等信息來檢測(cè)網(wǎng)絡(luò)狀態(tài)與確定發(fā)送速率。
1) 丟包的檢測(cè)
在單播環(huán)境中,本文采用的檢測(cè)方法為:發(fā)送端在發(fā)送固定數(shù)量的MPEG-1格式文件的同時(shí),發(fā)送固定頻率的空UDP包;接收端通過檢查能接收到的包數(shù)目來檢測(cè)包丟失情況。本服務(wù)器端發(fā)送4 495個(gè)數(shù)據(jù)包的MPEG-1格式文件,每個(gè)數(shù)據(jù)包9 296 byte,同時(shí)服務(wù)器端以2.1 Mbit/s的速率發(fā)送空的UDP測(cè)試包,接收端能收到的平均包數(shù)日為3 701,丟包率為17.7%。這主要是由網(wǎng)絡(luò)擁塞與網(wǎng)絡(luò)線路衰減引起的。
丟包情況下接收端有馬賽克現(xiàn)象,但是現(xiàn)象影響輕微,用戶可觀看流暢的流媒體節(jié)目,并能把收到的節(jié)目存入文件。這表明在實(shí)驗(yàn)中,流媒體廣播能成功接收。
2) 網(wǎng)絡(luò)帶寬
DVB-C平臺(tái)中調(diào)制器參數(shù)設(shè)置為:64QAM調(diào)制;網(wǎng)關(guān)最大傳輸速率為32 Mbit/s,可復(fù)用多路服務(wù)器的數(shù)據(jù)在8 MHz的模擬頻道上進(jìn)行傳輸,例如文件服務(wù)器等。流媒體數(shù)據(jù)的占用帶寬情況可在IP/DVB網(wǎng)關(guān)中觀測(cè)到,實(shí)際占的最大帶寬可等效于3.17 Mbit/s,網(wǎng)關(guān)可復(fù)用多路獨(dú)立的流媒體服務(wù)器的同時(shí)并行發(fā)送。
因此,DVB-C廣播平臺(tái)擁有較高的傳輸速率,在單向傳輸大容量多媒體數(shù)據(jù)時(shí)比因特網(wǎng)更具有優(yōu)勢(shì),可有效緩解因特網(wǎng)中的信息擁塞問題。
評(píng)論