全部博文(1293)
分类: LINUX
2011-05-14 14:32:57
一:用DSPack播放视频 首先,要阅读一下(DSPackDir)\help目录下的help.chm文件,粗略地看了一下,内容太多看不出头绪。 二:使用DSPack打开摄像头 现在我们来看看(DSPackDir)\Demos\D6-D7目录下的PlayVideoCap,这是一个打开本机的视频输入设备的例子。
在这个例子中,又用到了一个新类:TFilter。 在我们依葫芦画瓢之前,你要装个摄像头或虚拟摄像头。虚拟摄像头可以用VCDCut、Softcam或Vcam等软件,也可以使用9158()或MVBox()的虚拟视频。 先跟上次一样: 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, 在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; 运行一下试试,看是否能看到自己的摄像头的内容。 几个按钮没用,等到下一个例子用吧。 三: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); 这样就可以了 |