有这方面经验的朋友帮帮忙,我尝试了很多方法,到现在都还没有解决。
问题描述:
我用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的所有采集设备,因为我测试的时候有些设备可以完全列举出来,有些就不行),而不是怎样去设置视频采集的分辨率 。
问题描述:
我用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的所有采集设备,因为我测试的时候有些设备可以完全列举出来,有些就不行),而不是怎样去设置视频采集的分辨率 。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货