新聞中心

        EEPW首頁 > 消費電子 > 設計應用 > 基于DirectShow的MPEG-4視頻傳輸系統的研究與實現

        基于DirectShow的MPEG-4視頻傳輸系統的研究與實現

        作者: 時間:2009-03-24 來源:網絡 收藏

        接收端的思路如下:通過一個接收Filter接收發送端發送的數據,然后再用Divx Decoder Filter對接收到的數據進行解碼。最后用Video Renderer把解碼后的數據播放出來。其Filter Graph如圖2所示:

        本文引用地址:http://www.104case.com/article/167017.htm


        圖2 接收端的Filter Graph
        3.1 數據采集及編碼的
        3.1.1 采集Filter Graph的
        采集應用的Filter Graph一般比較復雜,而直接使用Filter Graph Manager上的IGraphBuilder接口構建這種Filter Graph,有時候難度又很大。為此,特別提供了一個輔助組件Capture Graph Builder,來簡化這種Filter Graph的創建。
        首先是創建Filter Graph Manager 組件,核心代碼如下:

        3.1.2 加入采集Filter

        3.1.3加入編碼器Filter
        這里我們采用Divx 提供的開源編碼Filter。安裝DivX.Pro.v5.1.1后會自動安裝Divx的編碼器Filter和解碼器Filter(注:解碼器Filter在接收端要用到)。在程序中加入Divx的編碼器Filter,實現思想是在Video Compressors目錄下枚舉到名稱為DivX Pro(tm) 5.1.1 Codec的Filter項后,把它加入到Filter Graph中即可。
        3.2 數據的發送和接收
        3.2.1 數據的發送Filter的實現
        數據的發送要開發一個發送Filter,為了編程上的方便,這里采用程序內Filter的形式來實現。即用類的形式而不是編寫一個成一個后綴為ax的組件注冊后再使用。這里我們定義一個繼承自CBaseFilter的類CFilterMpeg4Sender。這個類必須實現以下功能[3]:
        (1) 在類中定義CFilterMpeg4Sender上的Pin的實例mInputPin。
        (2) 實現繼承自CBaseFilter::GetPin,用于返回Filter上各個Pin的對象指針。
        (3) 實現繼承自CBaseFilter::GetPin,用于返回Filter上各個Pin的數量。
        定義一個繼承自CRenderedInputPin的類CMpeg4InputPin,用于實現CFilterMpeg4Sender上的輸入pin,發送Filter通過該輸入pin接收編碼Filter輸出的數據,然后按一定的規則發送。
        這個類必須實現以下功能[2]:
        (1) 重寫方法EndOfStream。
        (2) 實現IPin::BeginFlush和IPin::EndFlush兩個函數。
        (3) 重寫方法CBasePin::CheckMediaType進行連接時媒體類型的檢查。
        (4) 重寫方法CBasePin:: Receive(),接收Sample并發送
        3.2.2 數據的接收Filter的實現
        數據的接收其實是要編寫一個Source Filter, 這個Source Filter名稱為CFilterMpeg4Receiver,也繼承自CBaseFilter。這跟發送Filter的實現有些類似,有一點需要注意的是該Filter輸出的MediaType的設置。
        Char MediaType[]=//媒體數據類型,通過在發送端把媒體類型寫到一個文件中而得到然后通過語句:CFilterMpeg4Receiver::SetupMediaType((char *)MediaType,88)設置輸出數據的MediaType。
        CFilterMpeg4Receiver::SetupMediaType再調用CMpeg4OutPin::SetupMediaType()設置、接收到的媒體數據的格式,
        3.2.3 數據的網絡傳輸的實現


        數據的發送我們采用開源代碼JRTPLIB【6】提供的RTP協議棧。最新的JRTPLIB對RFC3550的實現進行了封裝,開發人員只要初步了解RTP協議就可以開發出高質量的音傳輸程序。使用JRTPLIB時,只需要通過繼承RTPSession類,再重新以下幾個函數就可以實現數據的接收。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 广宁县| 吉水县| 田阳县| 和龙市| 南靖县| 揭东县| 青海省| 梁平县| 旅游| 利川市| 绿春县| 南投市| 庆云县| 北碚区| 雷波县| 屏山县| 铁力市| 景德镇市| 六枝特区| 许昌县| 通化县| 应用必备| 中宁县| 吉隆县| 新乡县| 陵川县| 射洪县| 治县。| 乐亭县| 柘城县| 曲周县| 邹平县| 铜梁县| 叶城县| 包头市| 莱州市| 同德县| 常宁市| 兖州市| 峨眉山市| 内黄县|