《電子技術應用》
您所在的位置:首頁 > 其他 > 設計應用 > 基于Directshow的H.264流媒體播放器設計
基于Directshow的H.264流媒體播放器設計
山西電子技術
程少煉,陳 林 武漢科技大學
摘要: 摘要:基于目前最新的視頻壓縮編解碼標準H.264,采用Directshow應用框架,設計了網絡流媒體播放器系統;Directshow是微軟提供的基于windows平臺的優秀的流媒體應用架構,H.264標準具有高壓縮比和優良的網絡親和性,
關鍵詞: 流媒體 播放器 H.264
Abstract:
Key words :

摘要:基于目前最新的視頻壓縮編解碼標準H.264,采用Directshow應用框架,設計了網絡流媒體播放器系統;Directshow是微軟提供的基于windows平臺的優秀的流媒體應用架構,H.264標準具有高壓縮比和優良的網絡親和性,基于Directshow和H.264設計的網絡流媒體播放器不僅具有優良的系統架構,同時具有更好的靈活性和可擴展性,可以很方便地應用于視頻點播系統(Video On Demand System)中和移植到嵌入式WINCE平臺。基于Direotshow分析和設計了網絡源Filter和H.264解碼Filter,同時闡述了網絡流媒體播放器系統的整體框架。
關鍵詞:Directshow;H.264;Filter;流媒體

0 引言
    Directshow應用框架完成了流媒體處理的底層工作,使得編程者無需關心數據如何輸入,以及處理完后如何輸出,而只需關心如何對輸入數據進行處理。H.264視頻編解碼標準具有高壓縮比和優良的網絡親和性,被普遍認為是最有影響力的流媒體視頻壓縮標準。將Direct-show和H.264兩種相結合的流媒體播放器無疑將具有非常優秀的性能。

1 Directshow技術和H.264視頻壓縮標準簡介
    Directshow是微軟公司提供的一套流媒體開發軟件包,為在windows平臺上處理各種格式的媒體文件的回放、音視頻采集的高性能要求的多媒體應用,提供了完整的解決方案。
    Directshow是一套完全基于COM的應用系統,該系統位于應用層中,它使用Filter Graph的模型來管理整個數據流的處理過程;參與數據處理的各個功能模塊叫Filter;各個Filter在Filter Graph中按照一定的順序連接成一條“流水線”協同工作。Filter是一個COM組件,其功能可以由用戶自行實現,DirectShow SDK也為用戶提供了一些標準的Filter供用戶使用。各個Filter在Filter Graph中按一定順序通過Pin互相連接起來,Pin也是一個COM對象。
    H.264是由ITU-T和ISO/IEC的聯合開發組共同開發的最新國際視頻編碼標準。H.264/AVC視頻編碼標準在編碼質量和壓縮比上比原有的視頻編碼標準都有了明顯的提高。在相同的視覺感知質量上,編碼效率比H.263,MPEG-2和MPEG-4提高了50%左右。H.264不僅具有優異的壓縮性能,而且具有良好的網絡親和性。因此,H.264被普遍認為是最有影響力的流媒體視頻壓縮標準。

2 系統設計框架
    本系統基于Direotshow應用框架和H.264視頻壓縮標準,實現了從網絡接收流媒體數據,并在客戶端實時播放的功能。流媒體文件是采用H.264編碼的AVI文件,由于directshow提供了AVI Splitter Filter、Audio Decoder和標準的Video/Audio Renderer,因此,本系統只需設計自定義的網絡源Filter、H.264解碼Filter。
    多媒體流式傳輸實際上牽涉到兩個方面的技術。其一就是服務器與客戶端的通信技術,包括多媒體數據的傳輸、命令控制等;其二就是客戶端對接收到的多媒體流實時解碼后播放的技術。顯然,網絡通信可以使用windows socket技術,多媒體流的解碼播放可以使用direct-show技術。本文采用direetshow應用框架,設計了網絡源filter和h.264解碼filter,并通過Filter Graph構建了流媒體播放器。
    播放本地基于H.264編碼的AVI文件的Filter Graph如圖1。只需將本地File Source Filter替換為網絡源Filter,將CoreAVC Video De-coder替換為h.264解碼Filter,即可實現網絡H.264視頻播放器。

a.JPG

3 系統的設計與實現
3.1 Filter設計流程
    Filter的編碼實現包括Filter的注冊信息、Filter上的框架函數實現、邏輯控制類實現、自定義接口實現、屬性頁實現、產權保護等。
首先,要對Filter所要完成的功能和它在Filter Graph中的位置進行分析,以確定filter模型,選擇一個合適的基類;然后,再定義輸入輸出PIN以及自定義接口,注冊Filter信息;最后實現基類的全部純虛函數和自定義接口函數,并重寫基類的相關函數以定制filter功能。
3.2 網絡源Filter的設計
    源Filter主要功能是接收服務器發來的流媒體數據,并提供給Filter Graph中其它Filter使用。
    由于directshow自帶的AVI splitter工作于拉模式,故該源Filter也工作于拉模式。
    本源Filter采用雙緩沖循環隊列技術來實現數據的接收和向下一級Filter傳遞數據。采用該技術有如下理由:
    (1)在Source Filter與SpliRer連接的過程中,會從Source Filter中讀取一部分數據,以獲得數據的格式描述,否則Filter Graph無法完成連接。源Filter與Splitter Filter進行連接前,應啟動一個等待線程,當Source Filter的數據緩存預先接收到足夠的數據后,再構建完整的Filter Graph。
    (2)當完整的Filter Graph構建完成,并且處于運行狀態后,Source Filter必須動態地接收數據,并持續地把新數據提供給Splitter Filter,雙緩沖循環隊列既充分利用內存空間,又能為Splitter Filter提供穩定的數據源。
    (3)緩沖隊列可以穩定碼率,有效減小網絡延時、阻塞和抖動的影響。
    源Filter的工作過程如下:建立一個循環緩沖隊列,隊列尾指針用于緩沖從網絡接收的數據,隊列頭指針供Splitter讀取數據,進行音視頻分離,并傳給下一級Decoder處理;當Socket接收到網絡數據后,將數據插入隊列尾部,并使尾指針后移;當Splitter需要讀取數據時,從隊列頭讀取數據,并使頭指針后移。
    流媒體傳輸采用客戶端/服務器的架構,服務器與客戶端之間還有一個Socket通信協議問題,由于流媒體是連續的,它的同步點不能隨意選擇,因此,為了傳送流媒體數據,必須使用面向連接的可靠的傳輸協議(TCP)??蛻舳伺c服務器端的控制與反饋消息,則可以使用(UDP)來傳輸。服務器端首先創建一個偵聽Socket,偵聽來自客戶端的連接請求。一旦偵聽到客戶端的請求,服務器端就創建一個用于數據傳送的Socket,并綁定到請求連接的客戶端,此時,服務器處于數據傳送的就緒狀態。當客戶端發出命令,服務器再根據命令的類型執行相應的操作,如數據發送、停止、斷開連接等。
    在服務器端首先將連續的H.264流分成一塊一塊小包的負載數據,并且加上一個信息頭一起使用TCP協議發送;在客戶端根據信息頭描述,將小包的負載數據進行拼裝,然后進行H.264的解碼播放。Socket數據傳送結構為:負載類型(8 bit)、負載數據長度(16 bit)和負載數據包(2324Byte)。
    客戶端的實現可以參考SDK中的MEMFile Filter,直接從SDK例子將asyncrdr.cpp、asyncrdr.h、asyncio.cpp、asyneio.h四個文件拷貝過來,然后在MemFilter.h文件中從CAsyncStream派生流處理類CMemStream,定制數據源并進行數據的讀取操作;從CAsyncReader派生濾波器類CMemReader,實現含1個輸出PIN的Source Filter框架,完成與Splitter Filter的連接。
    網絡源濾波器類間數據流程如圖2,下一級Filter“拉”線程數據流程如圖3。其中:CAsyneStream用以標示數據流;CAsyneRequest標示輸入與輸出請求;CAsyncIo實現數據輸入和輸出的控制。編程主要實現CMemStream:Read()函數以實現從特定的數據源讀取數據到下一級Filter的Sample中。

b.JPG
3.3 H.264解碼Filter的設計
    該濾波器工作于Splitter和Renderer filter之間,包含一個輸入和一個輸出,且輸入和輸出pin上的媒體類型不一致,故選擇CTrans-form Filter作為基類,派生子類CX264Decode。
    ffmpeg是一個集錄制、轉換、音/視頻編碼解碼功能為一體的完整的開源解決方案。利用ffmpeg中的Libavformat和libavcodec庫訪問大多數視頻文件格式是一個很好的方法。將ffmpeg中關于h.264解碼的操作封裝為C++類,供H.264解碼Filter調用以實現解碼功能。
    子類CX264Decode必須要實現的純虛函數有:CheckInputType()實現輸入Pin上的媒體類型檢查;CheckTransform()檢查是否支持從該輸入pin到輸出pin的變換操作;DecideBufferSize()決定Samlple內存的大??;GetMediaType():提供輸出Pin上的首選媒體類型;Transform():實現解碼變換。
    子類CX264Decode可選的重寫虛函數有:初始化和反初始化流:StartStreaming()和StopStreaming();響應質量通告消息:AlterQuali-ty();獲取媒體類型被實際設置的時間:SetMediaType();連接時獲取額外的接口:CheckConnect()、BreakConnect()和CompleteConneet();定制變換過程:Receive();標準化設置輸出Sample:InitializeOutputSample()。
    本Filter設計主要流程如下:
    (1)Filter注冊信息
    定義類工廠模板,填寫Filter的注冊信息;同時實現DLL文件所必須實現的注冊和反注冊函數:DLLRegisterServer和DLLUnregisterSe-rver。
    (2)框架函數的實現
    實現函數CreateInstanee,用于創建Filter對象實例;實現函數CheeklnputType,用于對輸入Pin上的媒體類型檢查;實現函數Transfo-rm,用于H.264的解碼操作;實現函數NonDelegafingQueryIntefface,用于暴露Filter支持的自定義接口,使應用程序可以設置解碼器的參數;實現函數CompleteConnect,可以在輸入Pin成功連接后取得媒體類型描述,并將輸入數據的格式設置給應用邏輯控制對象;實現函數St-artStreaming和StopStreaming,可以分別調用應用控制邏輯對象的相應函數,進行流處理的初始化和反初始化操作。
    (3)邏輯控制類的實現
    邏輯控制類是本Filter設計的核心,框架函數和自定義接口函數的相關操作都是委托給邏輯控制類來實現的。該類實現了H.264.的解碼參數的設置與解碼操作,主要調用封裝了H.264解碼的C++類來實現。
    利用ffmpeg庫進行H.264解碼時,需要自定義兩個關鍵函數:open_net_file()和read_buffer_frame()。其中,open_net_file()函數完成與流媒體服務器的連接,接收指定流媒體文件的流相關信息,并返回類型為AVFormatContext結構體的值。read_buffer_frame()函數從bu-ffer緩沖中讀取一幀數據,并交由庫函數avcodec_decode_video()解碼。
    (4)自定義接口的實現
    將Filter類從自定義接口類派生,并聲明自定義接口的所有接口方法;然后在Filter類的實現文件中實現這些接口法,其實大都是調用應用邏輯控制類的相應函數;最后在函數NonDelegatingQueryInterface中暴露我們的自定義接口。
3.4 播放器的設計
    播放器采用Directshow應用框架,采取界面、控制邏輯和數據分離的三層程序設計方法。界面類直接從標準的對話框類CDialog派生,在界面類中定義兩個自定義類:數據封裝類和邏輯控制類。界面類表達一種用戶操作邏輯;數據封裝類集中管理各種參數;邏輯控制類具體實現業務應用邏輯。采取Directshow應用框架,不必關心數據如何輸入和輸出,這些問題都由Filter框架負責,只需更多的關注數據處理的算法實現、效率優化等問題。采取界面、控制邏輯和數據分離的設計結構,不僅使程序框架清晰、容易被人理解,而且具有良好的移植性和擴展性。
    播放器基于Filter Graph Manager構建包含網絡源Filter和H.264解碼Filter的Filter Graph,即可實現網絡流媒體的播放。界面類實現視頻顯示界面與用戶的操作交互,控制邏輯可以控制視頻的播放、暫停、停止、解碼參數設置等,數據類實現對數據的操作管理。

4 結束語
   本流媒體播放器系統采用了Directshow應用框架和H.264視頻編解碼標準,能很好的實現網絡流媒體視頻的播放,具有結構清晰、良好的可擴展性與可移植性。由于WINCE系統是微軟提供的嵌入式實時操作系統,提供了對Directshow的應用支持,故本系統也可以很好的移植到win-ce的嵌入式應用平臺,實現嵌入式端的流媒體視頻播放。同時,本流媒體播放系統也可很好地移植到視頻點播系統中,因其采用高壓縮比、低碼率的H.264視頻編解碼標準。能有效減少網絡負載、減小帶寬,從而減輕網絡對流媒體傳輸中所存在的丟包、抖動、延時等影響。
 

此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: 丁香5月婷婷 | 精品成人在线视频 | 国产亚洲精品国产第一 | 欧美日韩免费看 | 1234影院 | 国内精品一区二区三区αv 国内精品一区二区三区app | 第一福利社区导航 | 成人精品久久 | 99在线在线视频免费视频观看 | 免费一区二区 | 色婷婷视频在线观看 | 国产小视频在线观看免费 | 色婷婷久久综合中文网站 | 国产日韩视频在线观看 | 久久永久免费 | 国产精品高清在线观看地址 | 国产精品第一页在线 | 福利网在线 | 免费黄色视屏网站 | 玖玖99视频| 一级毛片免费视频观看 | 欧美黄色一级视频 | 国产天堂在线视频 | 伊人精品视频在线 | 午夜国产精品视频 | 国产成人综合久久精品亚洲 | 国产精品亚洲一区二区三区在线播放 | 九九精品视频免费 | 久久婷婷激情 | 色婷婷亚洲十月十月色天 | 四虎成人免费观看在线网址 | 欧美在线性视频 | 天天想你免费视频观看 | 放荡的美妇一区二区三区 | 欧美日韩亚洲m码色帝国 | 日韩欧美视频 | 男人的天堂a在线 | 99久久99久久精品国产 | 暖暖喜欢你电视剧免费观看完整版高清 | 97se狠狠狠综合亚洲狠狠 | 美女性视频网站 |