关于DSHOW(dspack包)做视频采集时,有效分辨率枚举的问题(100)

V

vciner

Unregistered / Unconfirmed
GUEST, unregistred user!
有这方面经验的朋友帮帮忙,我尝试了很多方法,到现在都还没有解决。 问题描述: 我用dshow做视频采集的时候,有一部份分辨率没有枚举出来,只有通过ShowPinPropertyPage(parentHandle, pinlist.Items[1])方式,调用驱动程序提供的设置窗口,才能显示所有的采集分辨率,然而其中有一部份分辨率是不起作用的(设置以后没有任何的反映),并且要对设置进行保存也比较麻烦。如果使用videoMediaTypes := TEnumMediaType.Create(pinList.First);这样的方式,对于有些采集设备来说,采集卡能够支持的大部分分辨率都不能枚举出来。pinList是一个TPinList的对象。 在程序中,使用如下代码可以设置指定的分辨率(指没有列举出来,采集卡能够支持的分辨率),如果采集卡不支持,设置将不起作用,设备将使用默认的采集分辨率设置。因此我想大家帮忙解决的就是怎么样才能将采集卡支持的所有采集分辨率都列举出来,如果能够解决次问题,将非常感谢,如果闲分不够的,也请提出来,只要能够解决问题,不过重在交流,对遇到相同问题的人也是一种借鉴。 附设置分辨率的代码如下:class function TDS9Ex.SetCaptureScale(Filter: IBaseFilter; Width, Height, Bits: Integer): HResult;var pin: IPin; amStreamConfig: IAMStreamConfig; iCount, iSize, i: Integer; scc: VIDEO_STREAM_CONFIG_CAPS; pmt: PAMMediaType; pvih: PVideoInfoHeader; subType : TGUID;begin Result := E_FAIL; if not Assigned(Filter) then Exit; Result := FindUnConnectPin(Filter, PINDIR_OUTPUT, pin); if FAILED(Result) then Exit; Result := pin.QueryInterface(IID_IAMStreamConfig, amStreamConfig); if FAILED(Result) then Exit; Result := amStreamConfig.GetNumberOfCapabilities(iCount, iSize); if FAILED(Result) then Exit; if iSize <> SizeOf(VIDEO_STREAM_CONFIG_CAPS) then begin Result := E_FAIL; Exit; end; case Bits of 4: subType := MEDIASUBTYPE_RGB4; 8 : subtype := MEDIASUBTYPE_RGB8; 16: subtype := MEDIASUBTYPE_RGB555; 24: subtype := MEDIASUBTYPE_RGB24; 32: subtype := MEDIASUBTYPE_RGB32; else Bits := 24; subType := MEDIASUBTYPE_RGB24; end; for i := 0 to iCount - 1 do begin Result := amStreamConfig.GetStreamCaps(i, pmt, scc); if FAILED(Result) then Continue; if IsEqualGuid(pmt.majortype, MEDIATYPE_Video) and IsEqualGuid(pmt.subtype, subType) and IsEqualGuid(pmt.formattype, FORMAT_VideoInfo) and (pmt.cbFormat >= sizeof(VIDEOINFOHEADER)) and (pmt.pbFormat <> nil) then begin pvih := pmt.pbFormat; pvih.bmiHeader.biBitCount := Bits; pvih.bmiHeader.biWidth := Width; pvih.bmiHeader.biHeight := Height; pvih.bmiHeader.biSize := (Width * Height * Bits) div 8; Result := amStreamConfig.SetFormat(pmt^); Exit; end; DeleteMediaType(pmt); end;end; 请大家看清问题,是如何列举出采集设备所支持的有效分辨率(凡是支持DSHOW的所有采集设备,因为我测试的时候有些设备可以完全列举出来,有些就不行),而不是怎样去设置视频采集的分辨率 。
 
有好的建议的,也可以在这里讨论.
 
现在搞DS的人少,用D搞的人更少
 
那现在的视频采集程序主要用什么做呢?mediacenter??
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部