现在我们来看看
(DSPackDir)/Demos/D6-D7目录下的PlayVideoCap,这是一个打开本机的视频输入设备的例子。
在这个例子中,又用到了一个新类:TFilter。
在我们依葫芦画瓢之前,你要装个摄像头或虚拟摄像头。虚拟摄像头可以用VCDCut、Softcam或Vcam等软件,也可以使用9158(http://www.9158.com/)或MVBox(http://www.mvbox.cn/)的虚拟视频。
先跟上次一样:
1. 新建一个应用,在界面上先放4、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,
在增加
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;
运行一下试试,看是否能看到自己的摄像头的内容。
几个按钮没用,等到下一个例子用吧。
在这个例子中,又用到了一个新类:TFilter。
在我们依葫芦画瓢之前,你要装个摄像头或虚拟摄像头。虚拟摄像头可以用VCDCut、Softcam或Vcam等软件,也可以使用9158(http://www.9158.com/)或MVBox(http://www.mvbox.cn/)的虚拟视频。
先跟上次一样:
1. 新建一个应用,在界面上先放4、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,
在增加
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;
运行一下试试,看是否能看到自己的摄像头的内容。
几个按钮没用,等到下一个例子用吧。