線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:6464
推到 Plurk!
推到 Facebook!

如何设置采集分辩率.

尚未結案
jinzihan_009
一般會員


發表:12
回覆:41
積分:10
註冊:2005-07-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-30 08:57:28 IP:219.148.xxx.xxx 未訂閱
本人用的为dspack组件。笔记本接sony DV 90E.1394线 我用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 ICaptureGraphBuilder2 do begin FindInterface(@look_downstream_only, nil, Filter as IBaseFilter, IID_IAMStreamConfig, VideoStreamConfig); VideoStreamConfig.GetFormat(AMMEdiaType); PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biWidth:= 320; PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biHeight:= 240; 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; 为什么,我抓拍的图片都是720*576的,即感觉bmiHeader.biHeight的值是默认值(720*576)。为什么设置成功了,但不起作用呢?请问如何在dspack中调节分辨率呢?我想抓到320*240,请问如何设置?
WoodTiger
初階會員


發表:35
回覆:90
積分:25
註冊:2003-08-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-31 14:49:05 IP:60.191.xxx.xxx 未訂閱
jinzihan_009你好,視頻設備如果提供了分辯率與參數設置的話可以用Amcap.exe(一般在windows目錄下)進行設置。也可以在dspack中編程實現,以下是我自己寫的兩個過程供你參攷。提一個建議,发表的問題,请及时结案,(請將http://delphi.ktop.com.tw/topic.php?TOPIC_ID=77245 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=75740 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=75600 結案),这对帮助你的人是个鼓励,你也不會因此而扣分。    1、如何獲得視頻流的分辨率”按以下方法可以得到:
procedure TfrmCap.btnConfigClick(Sender: TObject);
var
nHeight,nWidth:integer;
basicvideo:IBasicVideo;
begin
if filtergraph.Active then
begin
if succeeded(FilterGraph.QueryInterface(IID_IBasicVideo,BasicVideo)) then
begin
BasicVideo.get_VideoWidth(nwidth);
BasicVideo.get_VideoHeight(nheight);
showmessage(inttostr(nWidth) '   ' inttostr(nHeight));
end;
end;
end;
2、如何呼叫出視頻參數窗口
procedure TfrmCap.btnConfigClick(Sender: TObject);
var
nHeight,nWidth:integer;
basicvideo:IBasicVideo;
PinList:TPinList;
i:integer;
begin
if filtergraph.Active then
begin
if succeeded(FilterGraph.QueryInterface(IID_IBasicVideo,BasicVideo)) then
begin
BasicVideo.get_VideoWidth(nwidth);
BasicVideo.get_VideoHeight(nheight);
showmessage(inttostr(nWidth) ' x ' inttostr(nHeight));
end;
end;
if dsutil.HaveFilterPropertyPage(Filter as IBaseFilter,ppDefault) then
ShowFilterPropertyPage(self.Handle,Filter as IBaseFilter,ppdefault);
FilterGraph.Stop;
Pinlist:=TPinList.Create(Filter as IBaseFilter);
for i:=0 to PinList.Count-1 do
if PinList.Connected[i] then
ShowPinPropertyPage(self.Handle,PinList.Items[i]);
PinList.Free;
FilterGraph.Play;
end;
祝順心! ================================== 搞得懂就答人,搞不懂就問人,沒有人懂還可以問神! 發表人 - woodtiger 於 2005/08/31 17:14:49 發表人 - woodtiger 於 2005/08/31 17:16:57
------
-=-=-=-=-=-=-=-=-=-=-=
Eveything as your wish.
jinzihan_009
一般會員


發表:12
回覆:41
積分:10
註冊:2005-07-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-01 08:41:31 IP:219.148.xxx.xxx 未訂閱
谢谢WoodTiger: 我的问题没有及时结案,实属我的过错,尤其对于象你这样帮助我的人,没有得到及时的肯定。以后我会改正的。先把你提到的帖子结案了,呵呵,希望你不会因此而认为我的态度有问题。我忠心谢谢你。你不愧是这个论坛里的一星级会员。(不要以为我在给你戴高帽,奉承你,我是真心的。) 对于设置分辨率这个问题你的代码,我试过了,可以看到showmessage(inttostr(nWidth) ' ' inttostr(nHeight)); 显示为720 *576。也可以看到呼出视频参数窗口,不过第一个页(数据流格式 )里都不能改动设置,因为好象enabled 都为false.而第二个页(Stream Format),打开时报错,不能打开,不知道是什么原因。 其实我就是想实现能把我的默认设置720*576 能变成320*240,或640*480。需要能任意改动。以便抓到的图也是设置的分辨率大小。
jinzihan_009
一般會員


發表:12
回覆:41
積分:10
註冊:2005-07-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-01 09:13:47 IP:219.148.xxx.xxx 未訂閱
to WoodTiger: 我在单位又用另一台台式电脑,天敏卡接工业摄象头,试了一下,你给出的呼出视频参数窗口,没有问题,也可以设置了,不过,默认就是320*240,可以改动,但当我改到640*480时,弹出“当前没有这种格式”,改其他的分辨率也是这样提示。可是用天敏卡自带的应用程序,就没有弹出错误信息,可以任意改动设置。抓图也是设置的那么大。 为什么我用你的呼出视频参数窗口代码不行呢?希望给予解答。谢谢前辈。
WoodTiger
初階會員


發表:35
回覆:90
積分:25
註冊:2003-08-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-01 09:48:04 IP:60.191.xxx.xxx 未訂閱
jinzihan_009,你好,我只是個初學者,即不是計算機的科班,以前從來不用Delphi的,只是要用它來完成一篇與視頻有關的論文才開始學的,慢慢的喜歡上了它。一星級是對我的最好詮釋了,呵呵,而且所有的得分也都是與此有關的。在KTop學到了很多,這裏濃濃的學習氛圍和互相幫助與分享的精神使我非常感動,這樣的環境需要每個人的努力,所以我才會提醒你的,並不是想要得分,其實那些得分心裏是發虛的,因爲正好在撞在槍口上而已。 我一直找不到與視頻設置的例子,上面我所提到的,是我看了Dspack的幫助文件和網上的一篇Directshow(VC)中的一部分,自己試出來的,可能通用性非常差,但在Pincal內外置視頻捕捉卡和羅技的攝像頭中是可以使用的,你所提到的1394方式聯接與天敏攝像頭我沒有用過,上面我提供可你的是我在另一篇發問文檔中摘出來的,一直沒有人能回答,已經被我結案了,在結案後我試出來後又加上去的。以下是我實際在用的,貼給你試一下,也請知道的大大們不吝賜教,共同學習,另外你可以用我提到的AMCAP.EXE(是微軟的小工具,一般在windows目錄下)試一下option>filter與pin的設置看看是否可以,如果可以說明我提供的代碼是有問題的,如果也不可以,可能是你使用的設備用了非標准的參數設置的調用方式。 =============
procedure TfrmCap.btnConfigPinClick(Sender: TObject);
var
 i:integer;
 PinList:TPinList;
begin
  FilterGraph.Stop;
  Pinlist:=TPinList.Create(Filter as IBaseFilter);
  for i:=0 to PinList.Count-1 do
   if PinList.Connected[i] then
    ShowPinPropertyPage(self.Handle,PinList.Items[i]);
  PinList.Free;
  FilterGraph.Play;
end;
procedure TfrmCap.btnConfigfilterClick(Sender: TObject);
begin
  if HaveFilterPropertyPage(Filter as IBaseFilter,ppDefault) then
    ShowFilterPropertyPage(self.Handle,Filter as IBaseFilter,ppdefault);
end;    
============= 另外請參攷dspack目錄下的demos\d6-d7\filter Enumerator中的例子。 祝順心!水平有限多包涵!如果你找到了正確的解決方法也請分享供大家學習,謝謝! ================================== 搞得懂就答人,搞不懂就問人,沒有人懂還可以問神!
------
-=-=-=-=-=-=-=-=-=-=-=
Eveything as your wish.
jinzihan_009
一般會員


發表:12
回覆:41
積分:10
註冊:2005-07-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-01 10:34:37 IP:219.148.xxx.xxx 未訂閱
to WoodTiger; 我又仔细分析了一下天敏卡自带的应用程序,发现它抓的720*576的图片,也只是在它的应用程序里表面显示为720*576,当我把它的图片复制到硬盘其它盘符底下的时候,发现显示的都没有到320*240,所以,本人认为可能该采集卡最大只支持到320*240,至于应用程序里显示的720*576,也只是在该应用程序里拉伸的,或只是显示720*576,而实际没有抓到那么大的图片。不知道这么理解,对吗? 总之谢谢你的代码提示,我还需要试一下其他的采集卡,来看看,之后就回帖,结案。
jinzihan_009
一般會員


發表:12
回覆:41
積分:10
註冊:2005-07-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-01 10:50:08 IP:219.148.xxx.xxx 未訂閱
我刚试了你提到的AMCAP.EXE,和你的代码执行后效果是一样的。说明你提供的代码百分百没问题。看来是上面我说的情况,是它(天敏卡)自带的应用程序自己改的,实际不是那么大的分辨率。而dv的1394线的设置分辨率是改不了的,总是720*576。用AMCAP.EXE也是改不了的。 所以总结你的代码暂时看没有问题,过一阵,我需要用其他的采集卡来试试。看能不能改动采集分辨率。我会及时回帖的。敬请关注。
WoodTiger
初階會員


發表:35
回覆:90
積分:25
註冊:2003-08-01

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-01 11:49:32 IP:60.191.xxx.xxx 未訂閱
引言: to WoodTiger; 我又仔细分析了一下天敏卡自带的应用程序,发现它抓的720*576的图片,也只是在它的应用程序里表面显示为720*576,当我把它的图片复制到硬盘其它盘符底下的时候,发现显示的都没有到320*240,所以,本人认为可能该采集卡最大只支持到320*240,至于应用程序里显示的720*576,也只是在该应用程序里拉伸的,或只是显示720*576,而实际没有抓到那么大的图片。不知道这么理解,对吗? 总之谢谢你的代码提示,我还需要试一下其他的采集卡,来看看,之后就回帖,结案。
這好像不會的應該顯示的就是視頻流的大小,你的image的Autosize是不是true? 還有運行那個demo選擇caputure可以列出嗎? ================================== 搞得懂就答人,搞不懂就問人,沒有人懂還可以問神!
------
-=-=-=-=-=-=-=-=-=-=-=
Eveything as your wish.
jinzihan_009
一般會員


發表:12
回覆:41
積分:10
註冊:2005-07-22

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-01 16:18:41 IP:219.148.xxx.xxx 未訂閱
我又针对我在楼顶的代码改了一下: procedure TVideoForm. false; Filter.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag); FilterGraph.Active := true; with FilterGraph as ICaptureGraphBuilder2 do begin findinterface(@look_downstream_only,nil,Filter as IBaseFilter,IID_IAMStreamConfig,videostreamconfig); Videostreamconfig.getformat(amediatype); case amediatype.formattype.d1 of $05589f80:bmiheader:=pvideoinfoheader(amediatype.pbformat)^.bmiheader; $F72A76A0:bmiheader:=pvideoinfoheader2(amediatype.pbformat)^.bmiheader; end; pvideoinfoheader(amediatype.pbformat)^.bmiheader.biwidth:=640; pvideoinfoheader(amediatype.pbformat)^.bmiheader.biheight:=480; videostreamconfig.setformat(amediatype^); //showmessage(inttostr(videostreamconfig.setformat(amediatype^))); deletemediatype(amediatype); RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter); end; FilterGraph.Play; 很遗憾的告诉WoodTiger: 总结问题如下: 1。如果用普通usb聊天摄象头,AMCAP.exe可以自由设置允许的分辨率,用我上面的代码也可以通过设置width,height来改变分辨率,而用你提供的呼出视频设置窗口则不能改变分辨率。 2。如果用台式电脑,pci插槽里插天敏采集卡,接工业摄象头,AMCAP.exe可以列出、选择分辨率,用我上面的代码不能改变分辨率,用你提供的呼出视频设置窗口同样不能改变分辨率。默认为320*240。而我又重新看了下天敏卡自带的应用程序,确实有720*576的图片,是我上一次操作错误。即自带的应用程序可以实现720*576图片的采集。 3。笔记本,DV 用1394线,则都不能改变分辨率,无论AMCAP.exe,还是我的上面的程序和你提供的呼出视频设置窗口都不能改变分辨率。 真不明白为什么可以改变普通usb聊天摄象头的分辨率,却不能改变DV的1394线连接笔记本的分辨率,也不能改变天敏采集卡,接工业摄象头的分辨率。(你提供的呼出视频设置窗口,当改变分辨率时,总是弹出“当前没有这种格式”),另外,对于你上面提到的“你的image Autosize是不是true?”,我用的是VideoWindow,直接用它抓图,后存到硬盘,没有用到image 啊?这有关系吗?
WoodTiger
初階會員


發表:35
回覆:90
積分:25
註冊:2003-08-01

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-01 16:37:14 IP:60.191.xxx.xxx 未訂閱
=========================================================== 我用的是VideoWindow,直接用它抓图,后存到硬盘,没有用到image 啊?这有关系吗? =========================================================== 這我想是肯定沒關係的,你能不能運行一下我所說的那個Demo,看看能不能列出你所使用的視頻設備所支持的pin和filter,如果可以列出,我想是應該有辦法好想的。 祝順心! ================================== 搞得懂就答人,搞不懂就問人,沒有人懂還可以問神! 發表人 - woodtiger 於 2005/09/01 16:40:10
------
-=-=-=-=-=-=-=-=-=-=-=
Eveything as your wish.
jinzihan_009
一般會員


發表:12
回覆:41
積分:10
註冊:2005-07-22

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-09-02 08:02:05 IP:219.148.xxx.xxx 未訂閱
你说的那个Demo是不是指AMCAP.exe,如果是 ,那个可以列出的,除了笔记本用1394线连DV不能出。
WoodTiger
初階會員


發表:35
回覆:90
積分:25
註冊:2003-08-01

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-09-02 08:26:35 IP:60.191.xxx.xxx 未訂閱
引言: 你说的那个Demo是不是指AMCAP.exe,如果是 ,那个可以列出的,除了笔记本用1394线连DV不能出。
dspack目錄下的demos\d6-d7\filter Enumerator中的例子。 ================================== 搞得懂就答人,搞不懂就問人,沒有人懂還可以問神!
------
-=-=-=-=-=-=-=-=-=-=-=
Eveything as your wish.
jinzihan_009
一般會員


發表:12
回覆:41
積分:10
註冊:2005-07-22

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-09-02 08:54:17 IP:219.148.xxx.xxx 未訂閱
刚试过,dspack目錄下的demos\d6-d7\filter Enumerator中的例子 完全能列出来。就是不知道我的代码如何改变分辨率,郁闷啊~~~
jinzihan_009
一般會員


發表:12
回覆:41
積分:10
註冊:2005-07-22

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-09-02 11:12:22 IP:219.148.xxx.xxx 未訂閱
to:WoodTiger: 我的一个网友给我回信如下,我觉得很有道理,不过我还是没有调试成功呢,你能帮我看看吗?他的回信如下: 你(指我本人)是否是在 FilterGraph 已经连接的状态下修改分辨率的? 有一些设置可能需要更换下游的 Filter,所以连接状态下的 FilterGraph 不是总能改变设置的; 比较保险的办法是: 1. 停止 FilterGraph; 2. 取得新的分辨率及色深设置; 3. 判断是否设置改变; 4. 如果设置未改变,继续运行 FilterGraph,结束; 5. 如果设置改变,销毁 FilterGraph,重建(按新的设置)、运行之,结束
WoodTiger
初階會員


發表:35
回覆:90
積分:25
註冊:2003-08-01

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-09-03 10:48:59 IP:60.191.xxx.xxx 未訂閱
引言: to:WoodTiger: 我的一个网友给我回信如下,我觉得很有道理,不过我还是没有调试成功呢,你能帮我看看吗?他的回信如下: 你(指我本人)是否是在 FilterGraph 已经连接的状态下修改分辨率的? 有一些设置可能需要更换下游的 Filter,所以连接状态下的 FilterGraph 不是总能改变设置的; 比较保险的办法是: 1. 停止 FilterGraph; 2. 取得新的分辨率及色深设置; 3. 判断是否设置改变; 4. 如果设置未改变,继续运行 FilterGraph,结束; 5. 如果设置改变,销毁 FilterGraph,重建(按新的设置)、运行之,结束
停止FilterGraph很有道理,但銷毀重建好像沒有必要。在我的程序中一打開Pin的設置,視頻流會自動停止,而Amcap.exe效果也是一樣的。 1394的設備我從來沒有用過,不知道其設置原理是否一樣,但有一點它的Filter和Pin可以枚舉出來,說明它是支持DirectShow的設備。設置方法淡什麽不同,真希望先進們指點了。 另外,如果你用的是天敏小章魚,那麽我在全國研究生數碼攝像程序的測試報告上看到了這麽一句話:“...它是我們已經測試過的衆多攝像頭中唯一一個不能正常工作的攝像頭類視頻設備...”,注:此程序是用DircetShow爲基礎寫的,用於全國100多萬的攷生的攝像,它的測試報告應該是可信的。 我還看到一本陸其明的《DirectShow實務精選》中的第2章第2.2.6採集參數設置,中可能有提到你要的內容,但說的不很詳細,C我也看不懂,供你參攷看看。 我有一個自己寫的小程序,想發給你試一下,可不可以調整參數,如果你需要我告訴我mail我發給你,如果好用,我把源碼給你。 祝順心! ================================== 搞得懂就答人,搞不懂就問人,沒有人懂還可以問神!
------
-=-=-=-=-=-=-=-=-=-=-=
Eveything as your wish.
jinzihan_009
一般會員


發表:12
回覆:41
積分:10
註冊:2005-07-22

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-09-04 17:52:14 IP:222.33.xxx.xxx 未訂閱
to WoodTiger: 这两天是周末,我们单位休息,所以没有及时回复你的信息,我现在在家没有设备,所以没办法调试,只有周一上班时,继续测试,不过我有个振奋消息要告诉你,就是我在那个Demo上做了个修改,添加了个videowindow 又加了个按纽,当调节好分辨率后,再点击按扭,即可以按照新的分辨率,在videowindow上面浏览图象。但当修改分辨率时,必须重新运行程序,并且必须先调节分辨率,后点击按扭播放。如果先播放就改不了分辨率。 所以我认为问题是应该先停止filterGraph,并且设置好分辨率后再播放。 虽然我在这个程序上修改成功,不过移植到我的项目上,就还没有改完呢?因为,我的那个项目程序没有那个demo列出来的接口,而你的那个呼出设置窗口程序,中的“if PinList.Connected[i] then”这句话只有先浏览运行才能算是保证这句代码为真。才能呼出窗口,如果不先浏览播放,这句代码为假,不能呼出窗口。所以这句不会改?
jinzihan_009
一般會員


發表:12
回覆:41
積分:10
註冊:2005-07-22

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-09-04 17:58:04 IP:222.33.xxx.xxx 未訂閱
我的邮箱:jinzihan_007@yahoo.com MSN:jinzihan_005@hotmail.com QQ:9076629
WoodTiger
初階會員


發表:35
回覆:90
積分:25
註冊:2003-08-01

發送簡訊給我
#18 引用回覆 回覆 發表時間:2005-09-05 08:37:30 IP:60.191.xxx.xxx 未訂閱
郵件已經發出,等待你的突破! 祝順心! ================================== 搞得懂就答人,搞不懂就問人,沒有人懂還可以問神!
------
-=-=-=-=-=-=-=-=-=-=-=
Eveything as your wish.
jinzihan_009
一般會員


發表:12
回覆:41
積分:10
註冊:2005-07-22

發送簡訊給我
#19 引用回覆 回覆 發表時間:2005-09-05 10:06:19 IP:219.148.xxx.xxx 未訂閱
你的程序,我刚调试完,在连接后,图象上来后,可以通过改变pin的列表来改变分辨率,大哥能给我这段在图象上来后,改变分辨率的代码吗?我的开发时间真的是很紧的。(有点不好意思,象剽窃作品)。 谢谢你一直以来的帮助,我也会在这边调试,修改的。祝你快乐。
jinzihan_009
一般會員


發表:12
回覆:41
積分:10
註冊:2005-07-22

發送簡訊給我
#20 引用回覆 回覆 發表時間:2005-09-05 10:37:59 IP:219.148.xxx.xxx 未訂閱
你的小程序,我发现一个问题,就是无论分辨率调到多少,拍摄的抓图,都是120*160的。我想这个问题不大,应该容易修改。
jinzihan_009
一般會員


發表:12
回覆:41
積分:10
註冊:2005-07-22

發送簡訊給我
#21 引用回覆 回覆 發表時間:2005-09-05 12:19:57 IP:219.148.xxx.xxx 未訂閱
非常高兴的告诉WoodTiger: 本人于今天上午11:58分调试成功,可以在图象浏览的前提下切换分辨率。这和你的大力帮助和支持是分不开的。再次感谢。 具体实现方法:由于你的呼出视频窗口的“if PinList.Connected[i] then”这句在浏览时,才能为真,不过此时却不能修改分辨率,所以我把该句删除,ShowPinPropertyPage在后面的这ShowPinPropertyPage(self.Handle,PinList.Items[i]);中把PinList.Items[i]直接指定为PinList.Items[1]。具体在窗口有浏览图象时,点击修改分辨率的按扭的代码如下: procedure TVideoForm.Button4Click(Sender: TObject); var nHeight,nWidth:integer; basicvideo:IBasicVideo; PinList:TPinList; i:integer; begin FilterGraph.ClearGraph; FilterGraph.Active := false; Filter.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag); FilterGraph.Active := true; FilterGraph.Stop; Pinlist:=TPinList.Create(Filter as IBaseFilter); ShowPinPropertyPage(self.Handle,PinList.Items[1]); PinList.Free; with FilterGraph as ICaptureGraphBuilder2 do begin RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter); end; FilterGraph.Play; end; 我过一会就准备结案。
WoodTiger
初階會員


發表:35
回覆:90
積分:25
註冊:2003-08-01

發送簡訊給我
#22 引用回覆 回覆 發表時間:2005-09-05 21:26:36 IP:219.82.xxx.xxx 未訂閱
真是祝賀你了!謝謝你的分,不過好像受之有愧,呵呵! 最重要的是又提高了,謝謝你! ================================== 搞得懂就答人,搞不懂就問人,沒有人懂還可以問神!
------
-=-=-=-=-=-=-=-=-=-=-=
Eveything as your wish.
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#23 引用回覆 回覆 發表時間:2008-09-05 19:38:11 IP:125.225.xxx.xxx 未訂閱
補個資料

http://www.progdigy.com/forums/viewtopic.php?t=1537


[code delphi]
function SetVideoParams(cgb2: ICaptureGraphBuilder2; Category: TGUID;
fSource: IBaseFilter; FrameWidth, FrameHeight,
FrameBitDepth, FrameRate: Integer): HResult;
var
StreamConf: IAMStreamConfig;
pmt: PAMMediaType;
begin
Result := E_FAIL;
StreamConf := nil;
pmt := nil;
try
Result := cgb2.FindInterface(@Category, @MEDIATYPE_Video, fSource, IID_IAMStreamConfig, StreamConf);
If Assigned(StreamConf) Then
Begin
StreamConf.GetFormat(pmt);
If Assigned(pmt) Then
Begin
if pmt.cbFormat = sizeOf(TVideoInfoHeader) Then
Begin
PVIDEOINFOHEADER(pmt^.pbFormat)^.bmiHeader.biWidth := FrameWidth;
PVIDEOINFOHEADER(pmt^.pbFormat)^.bmiHeader.biHeight := FrameHeight;
PVIDEOINFOHEADER(pmt^.pbFormat)^.bmiHeader.biBitCount := FrameBitDepth;
PVIDEOINFOHEADER(pmt^.pbFormat)^.AvgTimePerFrame := 10000000 div FrameRate;
with PVIDEOINFOHEADER(pmt^.pbFormat)^.bmiHeader do
pmt^.lSampleSize := ((biWidth 3) and (not (3))) * biHeight * biBitCount shr 3;
PVIDEOINFOHEADER(pmt^.pbFormat)^.bmiHeader.biSizeImage := pmt^.lSampleSize;
End;
Result := StreamConf.SetFormat(pmt^)
End;
End;
result := S_OK;
except
on E : Exception do
MessageBox(0, PChar(E.Message), '', MB_OK or MB_IC nil;
if Assigned(pmt) then
DeleteMediaType(pmt);
end;

[/code]
Shortend the Function because I am using the PIN_CATEGORY_CAPTURE instead of PIN_CATEGORY_PREVIEW (which was not working).
Add this line before the RenderStream......, to get the webcam to work with pf24, 15 Frames/sec.
SetVideoParams(FilterGraph as ICaptureGraphBuilder2, PIN_CATEGORY_CAPTURE , Filter as IBaseFilter ,356,288,24,15);
Marcel Brink
Xploration.
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#24 引用回覆 回覆 發表時間:2008-09-05 19:43:50 IP:125.225.xxx.xxx 未訂閱
DirectX中摄像头分辨率的设定
http://www.cnblogs.com/bullfinch/archive/2005/01/13/91373.html

每次都要选择才能达到640x480的分辨率,感觉很不人性化,假如用户希望定义默认值为640x480而不是320x240,那就需要别的方法了。

先把Capture Filter的属性读到IAMStreamConfig:

[code cpp]
IAMStreamConfig *pConfig = NULL;
hr = pBuild->FindInterface(
&PIN_CATEGORY_PREVIEW, // Preview pin.
0, // Any media type.
pCap, // Pointer to the capture filter.
IID_IAMStreamConfig, (void**)&pConfig);
[/code]

然后将属性中的每个AM_MEDIA_TYPE读出,处理。

[code cpp]
int iCount = 0, iSize = 0;
hr = pConfig->GetNumberOfCapabilities(&iCount, &iSize);

// Check the size to make sure we pass in the correct structure.
if (iSize == sizeof(VIDEO_STREAM_CONFIG_CAPS)
{
// Use the video capabilities structure.

for (int iFormat = 0; iFormat < iCount; iFormat )
{
VIDEO_STREAM_CONFIG_CAPS scc;
AM_MEDIA_TYPE *pmtConfig;
hr = pConfig->GetStreamCaps(iFormat, &pmtConfig, (BYTE*)&scc);
if (SUCCEEDED(hr))
{
/* Examine the format, and possibly use it. */

// Delete the media type when you are done.
DeleteMediaType(pmtConfig);
}
}

[/code]

在这里我要做的是,在众多支持的AM_MEDIA_TYPE中挑选一种合适的,作为默认选项。

[code cpp]
if ((pmtConfig->majortype == MEDIATYPE_Video) &&
(pmtConfig->subtype == MEDIASUBTYPE_RGB24) &&
(pmtConfig->formattype == FORMAT_VideoInfo) &&
(pmtConfig->cbFormat >= sizeof (VIDEOINFOHEADER)) &&
(pmtConfig->pbFormat != NULL))
{VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)pmtConfig->pbFormat;
// pVih contains the detailed format information.
LONG lWidth = pVih->bmiHeader.biWidth;
LONG lHeight = pVih->bmiHeader.biHeight;
if(lWidth == 640)
pSC->SetFormat(pmtConfig);
}
[/code]

以上代码放在/* Examine the format, and possibly use it. */后。
这样,初始模式就设在了640x480上,但是如果设备不支持640,就不会更改了。
編輯記錄
bugmans 重新編輯於 2008-09-05 19:46:29, 註解 無‧
系統時間:2017-10-17 12:11:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!