directshow中网络摄像头的Delphi更改分辨率

directshow中网络摄像头的Delphi更改分辨率,delphi,delphi-7,directshow,Delphi,Delphi 7,Directshow,我正在尝试将帧的分辨率更改为320x240,因为我的网络摄像头提供的帧为640x480,而我使用的编码器无法以更高的分辨率正常工作,我是这样做的 程序启动() 开始 FilterGraph.ClearGraph; FilterGraph.Active:=False; Filter.BaseFilter.Moniker:=SysDev.GetMoniker(TMenuItem(Sender.tag); FilterGraph.Active:=真; SetVideoProperties(过滤器作为i

我正在尝试将帧的分辨率更改为320x240,因为我的网络摄像头提供的帧为640x480,而我使用的编码器无法以更高的分辨率正常工作,我是这样做的

程序启动()
开始
FilterGraph.ClearGraph;
FilterGraph.Active:=False;
Filter.BaseFilter.Moniker:=SysDev.GetMoniker(TMenuItem(Sender.tag);
FilterGraph.Active:=真;
SetVideoProperties(过滤器作为iBaseFilter);
与ICaptureGraphBuilder2一样使用FilterGraph
尝试
RenderStream(@PIN_CATEGORY_PREVIEW,nil,过滤器为IBaseFilter,SampleGrabber为IBaseFilter,VideoWindow为IBaseFilter);
FilterGraph.播放;
除了
ShowMessage('无法使用指定的设备!')
终止
终止
函数SetVideoProperties(pVideoCapture:IBaseFilter):布尔值;
变量
hr:HRESULT;
pStreamConfig:IAMStreamConfig;
pAM_媒体:pammeditype;
pvih:pvideonefoheader;
pICGP2:ICaptureGraphBuilder2;
开始
pICGP2:=作为ICaptureGraphBuilder2的FilterGraph;
hr:=pICGP2.FindInterface(@PIN_CATEGORY_CAPTURE,nil,pVideoCapture,
IID_IAMStreamConfig,pStreamConfig);
如果(成功(hr))则开始
pStreamConfig.GetFormat(pAM_媒体);
pvih:=pAM_Media.pbFormat;
pAM_Media.subtype:=MEDIASUBTYPE_RGB24;
pvih.bmiHeader.biWidth:=320;
pvih.bmiHeader.bi高度:=240;
pvih.AvgTimePerFrame:=10000000第15部分;
pStreamConfig.SetFormat(pAM_Media^);
DeleteMediaType(pAM_介质);
pStreamConfig:=nil;
终止
终止
但通过样本抓取器抓取帧时,分辨率保持不变

这种方法有什么问题吗

更新


好的,我想我现在正在更新所有成员

函数SetVideoProperties(pVideoCapture:IBaseFilter):布尔值;
变量
hr:HRESULT;
pStreamConfig:IAMStreamConfig;
pAM_媒体:pammeditype;
pvih:pvideonefoheader;
pICGP2:ICaptureGraphBuilder2;
开始
pICGP2:=作为ICaptureGraphBuilder2的FilterGraph;
hr:=pICGP2.FindInterface(@PIN_CATEGORY_CAPTURE,nil,pVideoCapture,
IID_IAMStreamConfig,pStreamConfig);
如果(成功(hr))则开始
pStreamConfig.GetFormat(pAM_媒体);
pAM_Media.subtype:=MEDIASUBTYPE_RGB24;
pAM_Media.majortype:=媒体类型_视频;
pAM_Media.bFixedSizeSamples:=True;
pAM_Media.bTemporalCompression:=False;
pAM_Media.lSampleSize:=230400;
pAM_Media.formattype:=格式\u视频信息;
pAM_Media.pUnk:=零;
pAM_Media.cbFormat:=88;
pvih:=pAM_Media.pbFormat;
pvih.dwBitRate:=6912000;
pvih.AvgTimePerFrame:=10000000第15部分;
pvih.bmiHeader.biSize:=40;
pvih.bmiHeader.biWidth:=320;
pvih.bmiHeader.bi高度:=240;
pvih.bmiHeader.biPlanes:=1;
pvih.bmiHeader.biBitCount:=24;
pvih.bmiHeader.biCompression:=0;
pvih.bmiHeader.biSizeImage:=230400;
pvih.bmiHeader.biXPelsPerMeter:=0;
pvih.bmiHeader.biYPelsPerMeter:=0;
pvih.bmiHeader.biClrUsed:=0;
pvih.bmiHeader.biClrImportant:=0;
hr:=pStreamConfig.SetFormat(pAM_Media^);
如果成功(hr),则显示消息(“成功”),否则显示消息(IntToStr(hr));
DeleteMediaType(pAM_介质);
pStreamConfig:=nil;
终止
终止
  • 您使用新分辨率初始化的新媒体类型不正确/不完整:请同时更新其他成员
  • 您应该检查
    SetFormat
    result以检测格式设置中的故障
  • 代码本身似乎不完整,没有任何证据表明您正在更改格式,并且源筛选器已存在并已添加到筛选器图表中
  • 请参阅DSPack演示“…\dspack2.3.4\Demos\D6-D7\videocap”

    您需要枚举所有可用的网络摄像头格式,然后设置一种

    这就是代码: (按钮启动OnClick处理程序)

    VideoMediaTypes
    是用户选择源时填充的可用格式列表


    VideoFormat
    是用于选择格式的GUI控件(列表框)

    您能用代码解释一下吗??如果这不是要求太多的话。感谢您,它是0x80004005
    E_FAIL
    ——正如我所说,它拒绝了您的格式更改尝试。Hmmm。。那我在这里该怎么办?必须更新哪些其他成员?所有成员。你应该有一个格式良好的媒体类型。我正在更新所有成员,但它仍然给出相同的错误,我更新了上面的代码我正在更新所有成员,但它仍然给出相同的错误,我更新了上面的代码
    VideoMediaTypes, 
    AudioMediaTypes: TEnumMediaType;
    
    ....... 
    
          // configure output Video media type
          if VideoSourceFilter.FilterGraph <> nil then
          begin
            PinList := TPinList.Create(VideoSourceFilter as IBaseFilter);
            if VideoFormats.ItemIndex <> -1 then
              with (PinList.First as IAMStreamConfig) do
                SetFormat(VideoMediaTypes.Items[VideoFormats.ItemIndex].AMMediaType^);
            PinList.Free;
          end;
    
      SetFormat(VideoMediaTypes.Items[VideoFormats.ItemIndex].AMMediaType^);