DSow视频开发,欢迎大家都来讨论 (140分)

barton:谢谢,我正在试。。
 
小弟还有一个问题:为什么我的捕捉程序刚开始进去的时候VideoWindow只是闪烁,得不到正确的视频?但采集卡自带的捕捉程序一进去就没有问题。

小弟用的是DSPack2.3,不知道各位大哥有没有遇到这个问题。
 
To zhoufujin:
你的意思是否是说只要在Win98下装Direct9,不管硬件设备的驱动模式是VxD还是WDM,都可以用DSHOW进行视频捕捉?
 
我现在也准备做,但我用的是WIN2000+DELPHI7+SQL2000;
我现在正在选采集卡,不知道那种采集卡好;当然不能太贵的。
 
zhoufujin说的应该没错。不过DSPack2.3没有DX9不能工作呀!
 
我装DX8.1也一样可以工作,只是效果不大好(自己水平不够。。)
 
请大家继续发言。。。请大家继续发言。。。请大家继续发言。。。请大家继续发言。。。
 
请注意,你这里最大的一个问题,也就是导致你的程序不能工作的原因,应该是压缩部分。
如果你想不压缩直接把全屏的画面存到硬盘里面,我相信硬盘的速度是跟不上的。
如果你选择了一个很好的压缩算法,比如mpeg4,那么采集压缩存储的时间肯定来得及,
我在PIII的机器上面试过,没问题。现在的机器都是P4了,压缩速度更没问题。
不管你是要压缩还是存储,关键是压缩算法!
内存里面数据传输很快的,但是一到硬盘就不行了...
 
caowei :谢谢您。其实我现在的问题并非“压缩存储”与“解压回放”,而是在视频捕捉上。不过,感谢你论及方面压缩问题。
 
见一程序,采用自开发视频图像压缩,据说原理类似于MPEG4,采用位移矢量压强,效果比MPEG4要好的多,而且数据量也小,特适合网络传输,但人家不给看源码,唉。。没办法。。[:(]
 
小弟现在的问题是:怎么用DSHOW接口改变视频尽寸?
请大家帮帮忙,谢谢了。
 
我用过一种采集卡。使用dspack

使用的过滤器如下形式
* +--------+ +---------------+ +---------------+
* | |---->|Sample Grabber |----->|Render preview |
* |VideoSrc| +---------------+ +---------------+
* | |---+
* +--------+ | +--------------+
* +--------+ +------>| |
* | | | WMV writer |
* |AudioSrc|---------->| |
* | | +--------------+
* +--------+
*
*)
可以实时高速预览, 抓取静态图。 生成wmv格式文件。 改变采集分辨率可以是使用上面说的方法,不过前提是你的video source 必须是wdm驱动。 如果是vfw驱动则可以通过调出vfw自己的设置框来设置分辨率。
如下所示:
ShowFilterPropertyPage(Self.Handle, VideoSrc as ibasefilter, ppVFWCapFormat);

注意,设置对话框的时候要停止过滤器的运行。
 
小弟在网上看到用IAMStreamConfig接口实现的方法,代码如下:
var
VideoStreamConfig : IAMStreamConfig;
AMMEdiaType : PAMMediaType;
begin

FilterGraph.ClearGraph;
FilterGraph.Active := false;
Filter.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag);
FilterGraph.Active := true;
with FilterGraph as ICaptureGraphBuilder2do

begin

FindInterface(@look_downstream_only, nil, Filter as IBaseFilter, IID_IAMStreamConfig, VideoStreamConfig);
VideoStreamConfig.GetFormat(AMMEdiaType);
PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biWidth:= 768;
PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biHeight:= 576;
AMMEdiaType.subtype := MEDIASUBTYPE_RGB24;
VideoStreamConfig.SetFormat(AMMEdiaType^);
DeleteMediaType(AMMEdiaType);
RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter);
end;

FilterGraph.Play;
============
我用ShowMessage看了一下,bmiHeader.biWidth和bmiHeader.biHeight倒设置成功了, 但效果一样。如果把VideoStreamConfig.SetFormat(AMMEdiaType^)一句注释掉,bmiHeader.biWidth和bmiHeader.biHeight的值是默认值(320*240)。为什么设置成功了,但不起作用呢?

 
请大家帮我看看。我现在正在试barton的方法。
xwings :我在网上下了采集卡的最新驱动程序,现在在98下面的驱动模式也是WDM了。在VFW下我知道怎么做,现在请大家再帮我看看。。。
 
TTAMMediaType在DShow Pack中声明如下,有哪位大侠可以说明一下其中每一部分的作用?谢谢了。
_AMMediaType = record
majortype : TGUID;
subtype : TGUID;
bFixedSizeSamples : BOOL;
bTemporalCompression : BOOL;
lSampleSize : ULONG;
formattype : TGUID;
pUnk : IUnknown;
cbFormat : ULONG;
pbFormat : Pointer;
end;

TAMMediaType = _AMMediaType;
=============
还有,DShow Pack2.3是基于DX9的,是否我必须要安装DX9?
 
您的QQ?愿意在QQ上探讨。
 
zhoufujin:小弟QQ-26965829。

凡参加DShow开发讨论的朋友都可以加进来。
 
wdm驱动和vfw驱动在directshow里面一样的。 只有一些特定的接口区别。正常使用一样处理。
 
我也来关注一下,最近公司也有意思要做这个东东,
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
顶部