一. 下载
因为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