基于DirectShow的流媒體解碼和回放

一、 前言

  流媒體的定義很廣泛,大多數時候指的是把連續的影像和聲音信息經過壓縮處理后放上網站服務器,讓用戶一邊下載一邊觀看、收聽,而不需要等整個壓縮文件下載到自己機器就可以觀看的視頻/音頻傳輸、壓縮技術。流媒體也指代由這種技術支持的某種特定文件格式:壓縮流式文件,它通過網絡傳輸,并通過個人電腦軟件進行解碼。

  MCI是微軟為Windows最初提出的多媒體編程接口,隨著多媒體技術的迅速發展,各種壓縮算法在該領域的的應用,MCI技術越來越顯的力不從心,最明顯的是它不支持可變比特率的壓縮算法,對于處理DVD等近年出現的多種新的媒體格式已顯得無能為力,而使用微軟提供的vfw之類的多媒體庫又太麻煩。怎么辦呢?
作為MCI的"接班人",微軟又適時推出了建立在DirectX(包含DirectDraw、DirectSound、Direct3D)之上的DirectShow技術,它是在DirectX之上的媒體層,支持來自本地或網絡的各種視頻、音頻壓縮格式的媒體文件的解碼和回放,可以從設備上捕捉多媒體流,也可以處理各種壓縮算法處理的流媒體。這些格式包括:MPEG的音頻和視頻標準、音頻和視頻交互標準(AVI)、WAVE、MIDI和高級流格式ASF。DirectShow對媒體數據處理采用流媒體(Multimedia Stream)的方式,在應用中使用該方式可以大大的減少編程的復雜程度,同時又可以自動協商從數據源到應用的轉換,流接口提供了統一的、可以預測的數據存取的控制方法,這樣應用程序在播放媒體數據時不需要考慮它最初的來源和格式。
 
  二、理解DirectX

  DirectX是一個用于多媒體應用程序和硬件增強的編程環境,它是微軟為了將其Windows建設成適應各種多媒體的最好平臺而開發設計的。DirectX目前已經成為微軟自身SDK的一部分,而Windows 98/Windows 2000內則集成了DirectX,表明它已成為操作系統的一部分。

  DirectX技術是一種API(應用程序接口),每個DirectX部件都是用戶可調用的API的總和,通過它應用程序可以直接訪問計算機的硬件。這樣,應用程序就可以利用硬件加速器(Hardware Accelerator)。如果硬件加速器不能使用,DirectX還可以仿真加速器以提供強大的多媒體環境。

  為了理解DirectX,我們可以把系統分為四層:

  ●硬件/網絡層:放置有多媒體設備,包括圖形加速器、聲卡、輸入設備以及網絡通信設備等;

  ●DirectX基礎層:為圖像、聲音和設備提供多媒體基本服務;

  ●DirectX媒體層:為動畫制作、音頻和視頻等提供API功能;

  ●組件層:包括ActiveX控制和應用,它利用DirectX的API功能的優勢為用戶提供多媒體服務。

  DirectShow就是建立在DirectX媒體層之上的技術,其前身是ActiveMovie2.0。它以一組API函數或ActiveX控件出現,用途是讓開發者能夠在網絡上傳遞高質量的音頻和視頻信號。值得一提的是,DirectShow為我們提供了一個開放式的開發環境,我們可以根據自己的需要定制組件。

  三、DirectShow技術結構

  DirectShow定義了如何利用標準組件來處理流媒體數據,這些組件稱為過濾器。過濾器帶有輸入、輸出針角(pin),或二者兼而有之。在DirectShow技術中處于最核心位置的就是作為"過濾器"的可插入標準組件,它是執行特定任務的COM對象。過濾器又可被細分為源過濾器(Source filter)、變換過濾器(Transform filter)、表現過濾器(Renderer filter)等。過濾器通過向文件讀寫、修改數據和顯示數據到輸出設備上來操作流媒體。為了完成整個任務,必須要將所有的過濾器Filter連接起來,這三種過濾器組成了過濾器圖表結構,如圖3.1所示:


圖3.1 過濾器圖表結構(Filter Graph)


  從圖3.1中可以看出,過濾器圖表是各種過濾器的集合,它是通過過濾器的輸入輸出針腳"pin"順序連接而成的,這些過濾器的針腳通過協商來決定它們將支持何種形式多媒體。由于DirectShow支持可重構的過濾器圖表結構,所以使用相同的軟件組件可以播放多種類型的媒體。開發人員可以通過定義自己的過濾器來擴展DirectShow對媒體的支持功能。

  在過濾器圖表結構中,源過濾器用來從數據源獲取數據,并將數據傳送到過濾器圖表中,這里的數據源可以是攝像機、因特網、磁盤文件等;轉換過濾器用來獲取、處理和傳送媒體數據,它包括分離視頻和音頻的分解變換過濾器(Splitter transform filter)、解壓視頻數據的視頻轉換過濾器(Video transform filter)、解壓音頻數據的音頻轉換過濾器(Audio transform filter);表現過濾器用來在硬件上表現媒體數據,如顯卡和聲卡,或者是任何可以接受媒體數據的地方,如磁盤文件。它包括用來顯示圖像的視頻表現過濾器(Video renderer filter)、將音頻數據送到聲卡上去的音頻表現過濾器(Audio renderer filter)。

  在過濾器圖表中,為了完成特定的任務,必須將所有需要的過濾器連接起來,因此前級過濾器的輸出必定成為下級過濾器的輸入。一個過濾器至少有一個輸入針(Input pin),并將特定的輸出送到輸出針(Output pin);圖3.2顯示了一個過濾器連接圖:


3.2 過濾器連接圖


  你的應用程序不需要對過濾器圖表中的各個過濾器進行單獨的處理,因為在更高的層次上,DirectShow提供的一個稱為過濾圖表管理器的部件(FGM)管理著這些過濾器的連接和流媒體數據在過濾器之間的流動,FGM提供了一套COM接口,應用程序可以通過它來訪問過濾器圖表、控制流媒體或者接收過濾器事件。如果需要,它可以自動的插入一個合適的解碼器,并將轉換過濾器的輸出針腳連接到表現過濾器。應用程序可以通過與過濾圖表管理器的通信來控制過濾器圖表的活動。程序開發人員只需要調用API函數來實現對流媒體的控制,如run方法啟動流媒體在過濾器圖表(Filter graph)中的流動;pause方法暫停流媒體的播放;stop方法停止播放流媒體等。

  另外,利用Filter Graph Manager能夠將事件信息傳送到應用層這一特點,可以使應用程序可以響應事件處理,例如播放或搜索流媒體中的特定時間段的數據、流結束信息等。

  圖3.3是一個MPEG解碼播放的實例,可以看出Source filter將獲取的多媒體數據通過Outpin送到MPEG分解轉換過濾器,MPEG分解轉換過濾器有一個輸入針腳,兩個輸出針角分別將視頻和音頻解釋碼器進行解碼,最后兩路數據分別通過視頻表示過濾器、音頻表示過濾器送到顯卡和聲卡進行回放。


圖3.3 MPEG解碼實例

?

四、DirectShow程序開發

  DirectShow建立在COM組件技術基礎上,所以開發DirectShow程序必須要掌握COM組件技術。DirectShow與COM緊密相連,它所有的部件和功能都由COM接口來構造和實現,其開發方式相當靈活,沒有固定的模式,通常隨不同的需要使用不同的COM接口。但是其中幾個重要的接口確實經常需要用到的:IGraphBuilder接口,這是最為重用的COM接口,用來創建Filter Graph Manager;IMediaControl接口,用來控制流媒體在濾波器圖表(Filter Graph)中的流動,例如流媒體的啟動和停止;IMediaEvent接口,該接口在Filter Graph發生一些事件時用來創建事件的標志信息并傳送給應用程序。

  一個典型的DirectShow應用程序的開發通常遵循的步驟為:

  1)通過API函數CoCreateInstance()創建一個Filter Graph Manager 實例;

  2)通過調用QueryInterface ( )函數來獲取Filter Graph 和IMediaEvent組件的指針;

  3)對Filter Graph進行控制和對事件作出響應。

  下面舉一個簡單的例子來說明如何利用DirectShow技術對多媒體流進行解碼回放的。首先生成一個名為MediaPlay的單文檔應用程序,定義一個名字為MediaPlay的函數,該函數的具體實現代碼為:

void PlayMovie(LPTSTR lpszMovie)
{
 IMediaControl *pMC = NULL;
 IGraphBuilder *pGB = NULL;
 IMediaEventEx *pME = NULL;
 long evCode; // something to hold a returned event code
 hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
 IID_IMediaControl, (void **)&pMC);
 hr = pMC->QueryInterface(IID_IGraphBuilder, (void **)&pGB);
 hr = pMC->QueryInterface(IID_IMediaEventEx, (void **)&pME);
 hr = pGB->RenderFile(lpszMovie, NULL);
 hr = pMC->Run();
 hr = pME->WaitForCompletion(INFINITE, &evCode);
 if(pMC)pMC->Release();
  if(pGB)pGB->Release();
   if(pME)pME->Release();
}

  上述代碼中,CoCreateInstance()函數創建了一個過濾器圖表(Filter Graph)對象,并返回一個媒體控制(ImediaControl)接口,這個接口通過過濾器來實現播放、暫停、停止等媒體放映功能,但是這時候圖表對象并不包含具體的過濾器,因為此時DirectX并不清楚需要播放何種類型的媒體;接下來創建一個圖表構建接口,該接口可以實現創建過濾器圖表、向圖表對象添加、刪除各種過濾器、列舉當前過濾器圖表中所有的過濾器、連接圖表對象中的各個過濾器等功能;本例中使用了IGraphBuilder 接口的RenderFile()函數,告訴DirectX需要播放的媒體文件名,此時IgraphBuilder對象接口根據多媒體文件的類型,自動向過濾器圖表添加播放該類型媒體所需的的各種過濾器,并實現其連接。

  最后,函數調用ImediaControl接口對象的Run()函數,就可以開始播放媒體文件了。為了實現從頭至尾的順序播放完多媒體文件,需要調用IMediaEventEx 對象接口的WaitForCompletion()阻塞函數的運行,直到媒體文件結束后才可以釋放對象、結束函數的運行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455271.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455271.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455271.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《知易行難》擴展練習

在學習了《知易行難》后,這個是一個選做的擴展練習,但是里面的問題真的的很好,所以我也將在這里真實的分享,但是有些敏感的人名我就隱去了。 1. 這一年你做了些什么事情? 1)團隊的整合,將團隊…

python 裁判文書網_python - 用selenium模擬登陸裁判文書網,系統報錯找不到元素。...

問 題from selenium import webdriverfrom selenium.webdriver.common.desired_capabilities import DesiredCapabilitiesdcap dict(DesiredCapabilities.PHANTOMJS)dcap["phantomjs.page.settings.userAgent"]("Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWeb…

Python 四大主流 Web 編程框架

目前Python的網絡編程框架已經多達幾十個,逐個學習它們顯然不現實。但這些框架在系統架構和運行環境中有很多共通之處,本文帶領讀者學習基于Python網絡框架開發的常用知識,及目前的4種主流Python網絡框架:Django、Tornado、Flask、Twisted。 …

汕頭市隊賽 SRM16 T2

描述 貓和老鼠,看過吧?貓來了,老鼠要躲進洞里。在一條數軸上,一共有n個洞,位置分別在xi,能容納vi只老鼠。一共有m只老鼠位置分別在Xi,要躲進洞里,問所有老鼠跑進洞里的距離總和最小是…

基于django和vue的xdh官網設計

前言 本項目是使用三段分離的設計 前臺 使用materialize框架搭建的前臺頁面,后端使用的django寫的接口 后臺 使用Amazon UI 模板搭建的界面,管理各個部分的內容 項目環境 python3.7.2 django2.2.9 vue axios jQuery materialize mysql摘 要 本設計采用前后端分離的設計…

C#調用WebService實例和開發(轉)

http://www.cnblogs.com/peterpc/p/4628441.html 一、基本概念 Web Service也叫XML Web Service WebService是一種可以接收從Internet或者Intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通訊技術。是:通過SOAP在Web上提供的軟件服務,使用WSDL文件…

智能情緒分析技術_簡單分析人工智能的表現在計算機網絡應用技術中的優勢

簡單分析人工智能的表現在計算機網絡應用技術中的優勢大數據時代背景下, 計算機網絡技術迅猛發展, 而人工智能技術的發展也進一步推動了計算機網絡技術的發展, 兩者相互融合, 相互促進, 實現了雙贏發展。從人工智能技術…

隨筆:關于關于

突然感覺挺累的。 我愛你。 北京,加油。轉載于:https://www.cnblogs.com/zhengzeze/p/7448878.html

MV預測過程詳解

第一步:確定相鄰塊 MV 預測以宏塊分割(或亞宏塊分割,如果宏塊存在亞分割)為單位,同一個宏塊分割(或亞宏塊分割)內所有 4*4 塊 MV 預測值相同。以每個宏塊分割(或亞宏塊分割&…

Django models中關于blank與null的補充說明

建立一個簡易Model class Person(models.Model):GENDER_CHOICES((1,Male),(2,Female),)namemodels.CharField(max_length30,uniqueTrue,verbose_name姓 名) birthdaymodels.DateField(blankTrue,nullTrue)gendermodels.IntegerField(choicesGENDER_CHOICES)accountmodels.In…

python 人臉關鍵點檢測_opencv+python+dlib人臉關鍵點檢測、實時檢測

安裝的是anaconde3、python3.7.3,3.7環境安裝dlib太麻煩,在anaconde3中新建環境python3.6.8,在3.6環境下安裝dlib-19.6.1-cp36-cp36m-win_amd64.whl,下載地址:https://pypi.org/project/dlib/19.6.1/#filesvscode更改配…

Zabbix2.2.6郵件報警設置方法

http://www.jb51.net/article/56973.htm 這篇文章主要介紹了Zabbix郵件報警設置方法,在Zabbix服務端設置郵件報警,當被監控主機宕機或者達到觸發器預設值時,會自動發送報警郵件到指定郵箱說明:Zabbix監控服務端、客戶端都已經部署完…

Skip宏塊與Direct預測模式淺析

對于我來說,這個是一個老問題了。以前藍風車專門給我講解,我都沒搞懂(真有點對不起藍風車的細心教誨哈。呵呵~~~)。今天終于弄清楚了,特此總結出來,請大家指正。 B_Skip類型宏…

自律

生活上的自律 寫出自律的代碼 身體上的自律 日常生活中,存在這么兩條路。一條路誘惑我們只根據自己的沖動和直覺來生活。這條路可以稱為「寵物之路」,因為所有的動物,包括家里養的寵物狗走的都是這條路。餓了就吃,吃完就算。…

解決兼容性的庫

HTML5標簽兼容方案&#xff1a;html5shiv.js [GitHub地址&#xff1a;https://github.com/aFarkas/html5shiv/] IE8不支持HTML5的新標簽&#xff0c;如<header>、<nav>等標簽在IE8無法渲染。html5shiv.js可幫助IE6-8瀏覽器兼容HTML5語義化標簽。 使用方法&#xff…

H.264 中的相關問題

幀內解碼時&#xff0c;在解碼端&#xff0c;首先通過當前宏塊左邊、上邊已經解碼完成的宏塊使用當前宏塊的預測模式&#xff08;預測模式計算過程請參見我的論文《H.264數字視頻差錯控制技術的研究》&#xff0c;在群FTP“本群原創資料”目錄中&#xff09;得到當前宏塊的像素…

wenzhixin bootstrap-table 點擊table單元格改變顏色

bootstrap-table用于展示數據非常方便&#xff0c;也需要滿足一些個性化需求。比如點擊窗格&#xff08;td&#xff09;標記下顏色&#xff0c;用于目測 代碼如下&#xff0c;轉載請注明 $("table").on(click-row.bs.table, function (e, row, $el) {//el[0] is tr …

tornado學習筆記day01-高并發性能web框架

tornado的安裝 這里我使用的是虛擬環境中的pip安裝,配合清華大學鏡像源安裝的 pip install tornado -i https://pypi.tuna.tsinghua.edu.cn/simple我的第一個tornado程序 import tornado.web import tornado.ioloopclass IndexHandler(tornado.web.RequestHandler):主頁處理…

python99乘法表while翻譯_Python學習之while練習--九九乘法表

效果如下&#xff1a;實現代碼;m 1n 1while(m<10):while(n<m):print(n,"*",m,"",m*n,end \t)n 1print(\n)n 1m 1解析&#xff1a;這是一個很簡單的while嵌套程序&#xff0c;首先分析九九乘法表是從上往下逐行增加&#xff0c;且第一列乘積為1…

ASP.NET Core 2加入了Razor頁面特性

最近發布的ASP.NET Core 2.0&#xff0c;連同新發布的.NET Core 2和Entity Framework Core 2.0y&#xff0c;一并構成了.NET Core 2.0生態中的三元組。此發布給出了多個新特性和改進&#xff0c;其中包括通用性能的改進、Razor頁面、新的開發模板以及更好的Azure Diagnostics支…