一. 下載
因爲sourceforge最近不能訪問,因此能夠去 http://www.progdigy.com/ 下載。
下載 http://www.progdigy.com/files/DSPACK234.zip 後,解壓縮到一個目錄(我用的是C:\Borland\VCL\DSPACK234)。
二. 安裝
1 增長搜索路徑 (DSPackDir)\src\DirectX9 和 (DSPackDir)\src\DSPack
在delphi7中選擇菜單【Tools】-【Enviroment Options】,在打開的窗口中選擇Library頁籤,在Library Path一項中添加這兩個目錄C:\Borland\VCL\DSPACK234\src\Directx9 ;C:\Borland\VCL\DSPACK234\src\DSPack
(將其直接粘貼在原有內容的後面,或者點擊Library Path後面的...按鈕添加)
2 編譯 (DSPackDir)\packages\DirectX9_D7.dpk
雙擊(DSPackDir)\packages\DirectX9_D7.dpk,在delphi7中會顯示一個關於從新建立資源文件的對話框,點擊OK就能夠了。
在delphi7中的打開窗口中點擊compile按鈕,完成編譯。
在delphi7中選擇菜單【File】-【Close All】,在提問是否保存時,選擇保存。
3 編譯 (DSPackDir)\packages\DSPack_D7.dpk
雙擊(DSPackDir)\packages\DSPack_D7.dpk,在delphi7中會顯示一個關於從新建立資源文件的對話框,點擊OK就能夠了。
在delphi7中的打開窗口中,點擊compile按鈕,完成編譯。
在delphi7中選擇菜單【File】-【Close All】,在提問是否保存時,選擇保存。
4 編譯並安裝 (DSPackDir)\packages\DSPackDesign_D7.dpk
雙擊(DSPackDir)\packages\DSPackDesign_D7.dpk,在delphi7中會顯示一個關於從新建立資源文件的對話框,點擊OK就能夠了。
在delphi7中的打開窗口中,點擊compile按鈕,完成編譯。 點擊Install按鈕,完成安裝。
在delphi7中選擇菜單【File】-【Close All】,在提問是否保存時,選擇保存。
至此,安裝已完成,在delphi的控件面板上能夠找到DSPack的頁簽了。
若是在Delphi5或6中安裝,則選擇對應的D5或D6的文件。
(安裝過程當中遇到了一個編譯錯誤,說找不到Jedi.inc。這個文件在src\Directx9目錄下,爲何不能搜索。原來文檔裏寫的路徑是 (DSPackDir)\src\Directx9,而實際解壓縮出來的目錄名是DirectX9,因此添加搜索路徑的時候必定要注意這個問題。把x改爲X後,編譯就經過了)html
安裝完後,開始學習DSPack。
首先,要閱讀一下(DSPackDir)\help目錄下的help.chm文件,粗略地看了一下,內容太多看不出頭緒。
仍是先學習一下(DSPackDir)\Demos\D6-D7目錄下的那些例子,邊動手作邊學習吧。
研究的第一個例子是PlayWin。研究了一下,主要使用TFilterGraph和TVideoWindow來完成。
TFilterGraph是DSPack中的核心類,其餘類都要圍繞着它,可是怎麼理解它還不清楚。TVideoWindow是個顯示播放視頻的控件。這兩個類的關係好像是數據庫控件中Dataset控件和DBGrid控件的關係同樣。
看得差很少後,本身照葫蘆畫瓢仿製一個。
1. 新建一個應用,在界面上先放四、5個按鈕。
2. 在控件面板上選擇DSPack那頁,把前兩個控件(TFilterGraph和TVideoWindow)在窗口上各放一個。
3. 關聯
選中VideoWindow1控件,在屬性窗口中將FilterGraph屬性設置爲FilterGraph1。
選中FilterGraph1控件,確認屬性窗口中的Mode屬性爲gmNormal。
4.爲Form1增長一個onCreate事件處理程序。
內容爲:
if not FilterGraph1.Active then FilterGraph1.Active := true;
FilterGraph1.ClearGraph;
FilterGraph1.RenderFile('E:\v\951.wmv'); // 簡化一點,這裏用你本地硬盤上的一個視頻文件
5. 爲Form1增長一個onCloseQuery事件處理程序。
內容爲:
FilterGraph1.Active := false ;
6.把button1的Caption改成Start,並增長一個OnClick事件
內容爲:
FilterGraph1.Play;
運行一下,就能夠播放了。下面再增長几個功能按鈕,如pause、stop。
7. 把button2的Caption改成Pause,並增長一個OnClick事件
內容爲:
FilterGraph1.Pause;
8. 把button3的Caption改成Stop,並增長一個OnClick事件
內容爲:
FilterGraph1.stop;
能夠看出4-8步都是調用了TFilterGraph類的方法。
下面,再增長個全屏功能吧。
9. 把button4的Caption改成FullScreen,並增長一個OnClick事件
內容爲:
VideoWindow1.FullScreen :=true ;
10. 爲VideoWindow1增長一個OnClick事件
內容爲:
if videowindow1.FullScreen then
videowindow1.FullScreen := false ; //退出全屏方式
通常的視頻播放創窗口都有一個進度條,如今咱們也來加一個。
A.1. 在DSPack控件面板上選擇倒數第2個控件(TDSTrackBar),放到在窗口上。
A.2. 關聯
選中DSTrackBar1控件,在屬性窗口中將FilterGraph屬性設置爲FilterGraph1。(這一步好像很熟悉哦)
從新運行程序,你就會看到一個進度條,而且可以使用這一進度條來調整播放的進度。數據庫
如今咱們來看看(DSPackDir)\Demos\D6-D7目錄下的PlayVideoCap,這是一個打開本機的視頻輸入設備的例子。
在這個例子中,又用到了一個新類:TFilter。
在咱們依葫蘆畫瓢以前,你要裝個攝像頭或虛擬攝像頭。虛擬攝像頭能夠用VCDCut、Softcam或Vcam等軟件,也可使用9158(http://www.9158.com/)或MVBox(http://www.mvbox.cn/)的虛擬視頻。
先跟上次同樣:
1. 新建一個應用,在界面上先放四、5個按鈕,此次多放一個Listbox,這個列表框中將列出系統中安裝的視頻輸入設備。
2. 在控件面板上選擇DSPack那頁,把前兩個控件(TFilterGraph和TVideoWindow)在窗口上各放一個。
下面該有所不一樣了
3.在DSPack中選擇TFilter控件,放到窗口上。
4.選中FilterGraph1控件,在屬性窗口中將Mode屬性設爲gmCapture。
5. 關聯
選中VideoWindow1控件,將FilterGraph屬性設置爲FilterGraph1。
選中Filter1控件,將FilterGraph屬性設置爲FilterGraph1。
6. 在代碼模式中,在Interface後的Uses中增長
DSUtil, DirectShow9,
在implementation前面的Var中增長
SysDev: TSysDevEnum;
7. 爲Form1增長一個onCreate事件處理程序,讀取系統中的視頻輸入設備。
內容爲:
var
i: integer;
begin
// 讀取系統中的視頻輸入設備
SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
if SysDev.CountFilters > 0 then
for i := 0 to SysDev.CountFilters - 1 do
begin
Listbox1.Items.Add(SysDev.Filters[i].FriendlyName)
end;
end;
7. 同前。爲Form1增長一個onCloseQuery事件處理程序。
內容爲:
SysDev.Free;
FilterGraph1.ClearGraph;
FilterGraph1.Active := false ;
8. 爲Listbox1增長一個onClick事件處理程序
內容爲:
FilterGraph1.ClearGraph;
FilterGraph1.Active := false;
//設filter爲所選視頻輸入設備
Filter1.BaseFilter.Moniker := SysDev.GetMoniker(Listbox1.ItemIndex);
FilterGraph1.Active := true;
// 打開所選的視頻輸入設備
with FilterGraph1 as ICaptureGraphBuilder2 do
RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter1 as IBaseFilter, nil, VideoWindow1 as IbaseFilter);
// 顯示出來
FilterGraph1.Play;
運行一下試試,看是否能看到本身的攝像頭的內容。
幾個按鈕沒用,等到下一個例子用吧。ide
到這裏,我基本用DSPack作了一點東西,瞭解了DSPack中的3個基本類及其一些方法。但要理解它們,還要了解一下DirectShow中Filter Graph、Filter、Pin的基本概念。
在網上找了一些資料,比較好資料的地址爲 http://www.yesky.com/259/1854259.shtml ,大部分資料都來自於陸其明寫的《DirectShow開發指南》和《DirectShow實務精選》兩本書。
總結以下:
1) DirectShow的系統結構
DirectShow的體系結構如圖1所示。
學習
![]() 圖1 DirectShow系統 |
DirectShow位於應用層中。它使用一種叫Filter Graph的模型來管理整個數據流的處理過程;參與數據處理的各個功能模塊叫Filter;各個Filter 在Filter Graph中按必定的順序鏈接成一條「流水線」協同工做。
( 能夠看出TFilterGraph是個Filter的容器 )
按照功能來分,Filter大體分爲三類:Source Filters、Transform Filters和Rendering Filters。
Source Filters主要負責取得數據,數據源能夠是文件、因特網、或者計算機裏的採集卡、數字攝像機等,而後將數據往下傳輸;
Transform Fitlers主要負責數據的格式轉換、傳輸;
Rendering Filtes主要負責數據的最終去向,咱們能夠將數據送給聲卡、顯卡進行多媒體的演示,也能夠輸出到文件進行存儲。
在DirectShow系統之上,咱們看到的,便是咱們的應用程序(Application)。應用程序要按照必定的意圖創建起相應的Filter Graph,而後經過Filter Graph Manager來控制整個的數據處理過程。DirectShow能在Filter Graph運行的時候接收到各類事件,並經過消息的方式發送到咱們的應用程序。這樣,就實現了應用程序與DirectShow系統之間的交互。
2) Filter概述以及鏈接
過濾器(Filter)是DirectShow中最基本的概念。DirectShow是經過Filter Graph來管理Filter的。Filter Graph是Filter的「容器」,而Filter是Filter Graph中的最小功能模塊。
Filter是一種COM組件,對於每一個Filter,都有其本身的Pin,它是由Filter建立的COM對象。 Filter經過Pin來進行他們之間的鏈接。
Pin分爲兩種:輸出Pin和輸入Pin。輸出的Pin把Filter處理後的數據傳送到Filter的外 部,而輸入Pin則是把Filter外部的數據接收到Filter中,以便Filter對這些數據進行處理。
對於三種類型的Filter(Source Filter,Transform Filter,Rendering Filter)的鏈接圖以下:
ui
能夠根據Filter所包含的輸入Pin和輸出Pin的熟練來判斷Filter的類型:
只有輸出Pin,沒有輸入pin,爲Source Filter
既有輸出Pin,又有輸入pin,爲Transform Filter
沒有輸出Pin,只有輸入pin,爲Rendering Filter
3)DirectShow 的重要接口
DirectShow採用了COM標準,因此不少重要的功能都是經過COM接口來完成。下面就列舉一些重要的DirectShow的接口。
(1) IGraphBuilder接口
用於構造Filter Graph的接口,創建和管理一系列的Filter,過濾和處理源媒體流。
(2) IMediaControl接口
用於控制多媒體流在Filter Graph中的流動,如流的啓動和中止。
(3) IMediaEvent接口
用於捕獲播放過程當中發生的事件,並通知應用程序,如EC_COMPLETE等。
(4) IVideoWindow接口
用於控制視頻窗口的屬性。
(5) IMeadiaSeeking接口
用於查找媒體的接口,定位流媒體,控制多媒體數據播放提供精確控制。
(6) IBaseFilter接口
從ImediaFilter接口繼承,用來定義一個具體的過濾器指針,並對多媒體數據進行處理。
(7) IPin接口
用於管理兩個過濾器之間的Pin,從而鏈接過濾器。
(8) IsampleGrabberCB接口
是Sample Grabber過濾器的一個接口,用於當流媒體數據經過過濾器時進行採樣以得到幀圖象。
還有一個能夠參考的介紹,地址爲:http://www.yesky.com/259/1854259.shtml
Filter是一種COM組件。爲了實如今Filter Graph中的統一操做,每一個Filter上都至少實現了一個IBaseFilter接口。實現Filter的文件通常是一個DLL,擴展名能夠是.dll,但更多的時候是.ax。
Filter必須加入到Filter Graph並接入到工做鏈路中才能發揮做用。若是想繞過Filter Graph而直接使用Filter實現的功能模塊,那就要將Filter功能移植成DirectX媒體對象(DMO)。
在使用Filter以前,必須註冊。 命令格式爲
regsvr32 c:\yourdirectory\yourfilter.ax
Filter Chain是相互鏈接着的一條Filter鏈路,而且鏈路中的每一個Filter全都有一個處於「已鏈接」狀態的輸入Pin,至多有一個處於「已鏈接」狀態的輸出Pin,這條Filter鏈路中的數據流不依賴鏈路外的其餘Filter。Filter Chain經過IFilterChain接口來進行相關操做。
當Filter Graph處於運行狀態下,Filter Chain能夠在運行和中止狀態之間切換;
當Filter Graph處於暫停狀態下,Filter Chain能夠在暫停和中止狀態之間切換。這是Filter Chain僅有的兩種狀態轉換。
Filter的數據傳送
Filter之間以Sample的形式傳送數據。Sample是一個封裝了必定大小數據內存的COM組件。用於數據傳輸的通常是輸入pin上實現的IMemInputPin接口。
Filter有3種狀態:中止、暫停和運行。spa