DSPack各類使用方法

1. DSPack 2.3.4 安裝

 

一. 下載
因爲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

2. 用DSPack播放視頻

 

安裝完後,開始學習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。(這一步好像很熟悉哦)

從新運行程序,你就會看到一個進度條,而且可以使用這一進度條來調整播放的進度。數據庫

3. 使用DSPack打開攝像頭

 

如今咱們來看看(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

4. DSPack抓幀

 
在例子PlayVideoCap中,還有抓幀和回放的功能。這用到第4個控件TSampleGrabber。

咱們之前兩個例子爲基礎,增長抓幀的功能。
打開前面的例子,而後:

1. 在DSPack中選擇TSampleGrabber控件,放到窗口上。而後將其FilterGraph屬性設置爲FilterGraph1。
2. 在選擇一個標準控件TImage(在Additional頁籤中),放在窗口上。
3.講一個沒用的按鈕的Caption改成「Snapshot」,在它的OnClick事件中寫:
SampleGrabber1.GetBitmap(Image1.Picture.Bitmap);

前面兩個例子均可以這樣增長抓幀功能。不過,對於第二個例子(即操做攝像頭的例子),須要作額外的修改,就是:

    RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter,  nil, VideoWindow as IbaseFilter);
改成
    RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter,  SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter);

這樣就能夠了

5. DirectShow基本概念

 

到這裏,我基本用DSPack作了一點東西,瞭解了DSPack中的3個基本類及其一些方法。但要理解它們,還要了解一下DirectShow中Filter Graph、Filter、Pin的基本概念。

在網上找了一些資料,比較好資料的地址爲 http://www.yesky.com/259/1854259.shtml ,大部分資料都來自於陸其明寫的《DirectShow開發指南》和《DirectShow實務精選》兩本書。
總結以下:

1) DirectShow的系統結構

DirectShow的體系結構如圖1所示。

學習

【轉】DSPack各類使用方法

圖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

 
圖2 Filter的鏈接

能夠根據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

相關文章
相關標籤/搜索