ShowPinPropertyPage(Self.Handle, PinList.Items[1]); //修改分辩率 
我通过上面这一句,就可以弹出一个预览设置属性窗口,就可以设出720*576分辨率了!
但每次都要设。很麻烦!请教一下,如何设它的默认值啊! 
谢谢

解决方案 »

  1.   

    我的意思是,没有ini之类的配置文件吗?一般来说配置更改一般会保存在ini里面
      

  2.   

    //调整视频参数
    FilterGraph.Active := True;
    ShowFilterPropertyPage(Self.Handle, Filter as IBaseFilter);
    //以上代码就可以调用一个调整视频参数的窗口,但无法默认它的值!
      

  3.   

    procedure TForm1.FormCreate(Sender: TObject);
    var SysDev: TSysDevEnum;
        VideoStreamConfig : IAMStreamConfig;
        AMMEdiaType :PAMMediaType;
    begin
        SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
        FilterGraph1.ClearGraph;
        FilterGraph1.Active := False;
        Filter1.BaseFilter.Moniker := SysDev.GetMoniker(SysDev.CountFilters-1);
        FilterGraph1.Active := true;
        with FilterGraph1 as ICaptureGraphBuilder2 do
        begin
            FindInterface(@PIN_CATEGORY_PREVIEW, nil, Filter1 as IBaseFilter, IID_IAMStreamConfig, VideoStreamConfig);
            VideoStreamConfig.GetFormat(AMMEdiaType);
    PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biWidth:= 768;
    PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biHeight:= 576;
            AMMEdiaType.SubType :=MEDIASUBTYPE_RGB24;
            PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biSizeImage:=Round(768*576*PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biPlanes*PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biBitCount/8);
            AMMEdiaType.lSampleSize:=PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biSizeImage;
    VideoStreamConfig.SetFormat(AMMEdiaType^);
            DeleteMediaType(AMMEdiaType);
            RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter1 as IBaseFilter, SampleGrabber1 as IBaseFilter,             VideoWindow1 as IbaseFilter);
        end;
        FilterGraph1.Play;
    end;不知道怎么贴代码 自己整理下
    这样应该可以的,注意的是设置分辨率好像还必须同时设置biSizeImage属性我顺便请教下
    我用ShowFilterPropertyPage掉出来的对话框没有设置分辨率的,只有设置亮度之类的值,
    下面的语句只有第一句有对话框,还设置不了分辨率
        ShowFilterPropertyPage(VideoWindow1.Handle, Filter1 as IBaseFilter,ppDefault);
        ShowFilterPropertyPage(VideoWindow1.Handle, Filter1 as IBaseFilter,ppVFWCapDisplay);
        ShowFilterPropertyPage(VideoWindow1.Handle, Filter1 as IBaseFilter,ppVFWCapFormat);
        ShowFilterPropertyPage(VideoWindow1.Handle, Filter1 as IBaseFilter,ppVFWCapSource);
        ShowFilterPropertyPage(VideoWindow1.Handle, Filter1 as IBaseFilter,ppVFWCompConfig);
        ShowFilterPropertyPage(VideoWindow1.Handle, Filter1 as IBaseFilter,ppVFWCompAbout);
      

  4.   


    再问下  PinList.Items[1]是什么类型的,怎么得到这个值的 我不知道怎么调用
    多谢 
      

  5.   

    这个是某类型的参数,例如:PinList.Items[0]就是设置预览的分辩率,PinList.Items[1]就是设置捕抓的分辩率
      

  6.   

    我是想知道PinList的类型,重点是怎么给PinList赋值的  
    贴段代码我看一下可以撒
      

  7.   

    10楼就是代码来的!
    至于0是什么,1是什么,在IBaseFilter里就有的!
      

  8.   

    晕 你10楼的代码我知道啊 但是我的调不出来分辨率的对话框
    我是想问你1楼的代码的参数PinList是怎么产生出来的(不是用来干什么而是怎么得出来的),总不会是某个事件的参数吧?
      

  9.   


       FindInterface(@PIN_CATEGORY_CAPTURE,nil, Filter as IBaseFilter, 
              IID_IAMStreamConfig, pconfig);...................
    ...................   SetVideoParams(FilterGraph as ICaptureGraphBuilder2, 
              PIN_CATEGORY_CAPTURE , Filter as IBaseFilter ,VbiWidth,VbiHeight);   CheckDSError(
                     RenderStream(
                                     @PIN_CATEGORY_CAPTURE,nil,
                                     Filter as ibasefilter,
                                     SampleGrabber as ibasefilter,
                                     VideoWindow as ibasefilter)
                    );..................
    function SetVideoParams(cgb2: ICaptureGraphBuilder2; Category: TGUID;
     fSource: IBaseFilter; FrameWidth, FrameHeight: 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_ICONERROR);
       end;   StreamConf := nil;
       if Assigned(pmt) then
       DeleteMediaType(pmt);
    end;注意SetVideoParams的位置
    还有
    FindInterface,RenderStream所用到的第一个参数 @PIN_CATEGORY_CAPTURE显示分辨率设置属性页
    var
      PinList:TPinList;
     
    ........    FilterGraph.Stop;    Pinlist:=TPinList.Create(Filter as IBaseFilter);
        try
          for i:=0 to PinList.Count-1 do
            if PinList.Connected[i] then
              ShowPinPropertyPage(mainhandle,PinList.Items[i]);
        finally
          PinList.Free;
        end;
        
        FilterGraph.Play;
    刚好在修改这一块 就给你掏出来了 看看先
      

  10.   

    19楼的朋友,我用你的函数可以了!可以默认分辩率了!但我现在有一个天敏SDK3000的视频卡就是不行!总是只有320*240分辩率的,你有没有遇到这种情况啊!
      

  11.   

    19楼的朋友你好啊!
    ShowPinPropertyPage(Self.Handle, PinList.Items[1]); //修改分辩率 
    我通过上面这一句,就可以弹出一个预览设置属性窗口,就可以设出720*576分辨率了! 
    用你的函数对天敏SDK3000的卡就是不成功!
      

  12.   

    如果只是控制视频窗口大小,改变TVideoWindow 或者 DSVideoWindow 的属性应该可以? 
      

  13.   

    如果是预览,我觉得可以试试19楼的代码但是CATEGORY我觉得应该设置为PIN_CATEGORY_PREVIEW
    或者从capturesource的output中找到PIN_CATEGORY_PREVIEW这个pin,然后用IAMStreamConfig设置
    [code]
    g_pCapture.FindPin(aSrcFilter.BaseFilter, PINDIR_OUTPUT, @PIN_CATEGORY_CAPTURE, @MEDIATYPE_Video, true, 0, pPinOut);
        pPinOut.QueryInterface(IID_IAMStreamConfig,pStreamConfig);
        GetMem(pSrcType,SizeOf(TAMMediaType));
        if pStreamConfig.GetFormat(pSrcType)=S_OK then begin
          pSrcType.majortype:=MEDIATYPE_Video;
          pSrcType.subtype:=MEDIASUBTYPE_UYVY;
          pSrcType.formattype:=FORMAT_VideoInfo;
          pSrcType.bFixedSizeSamples:=true;
          pSrctype.bTemporalCompression:=false;
          pSrcType.lSampleSize:=MyProfile.ImageWidth*MyProfile.ImageHeight*3;
          PVideoInfoHeader(pSrcType.pbFormat).rcSource:=Rect(0,0,MyProfile.ImageWidth,MyProfile.ImageHeight);
          PVideoInfoHeader(pSrcType.pbFormat).rcTarget:=Rect(0,0,MyProfile.ImageWidth,MyProfile.ImageHeight);
          PVideoInfoHeader(pSrcType.pbFormat).dwBitRate:=1000000;
          PVideoInfoHeader(pSrcType.pbFormat).dwBitErrorRate:=0;
          //PVideoInfoHeader(pSrcType.pbFormat).AvgTimePerFrame:=Round(10000000 / FileFps);
          PVideoInfoHeader(pSrcType.pbFormat).AvgTimePerFrame:=theAvgTimePerFrame;
          PVideoInfoHeader(pSrcType.pbFormat).bmiHeader.biWidth:=MyProfile.ImageWidth;
          PVideoInfoHeader(pSrcType.pbFormat).bmiHeader.biHeight:=MyProfile.ImageHeight;
          PVideoInfoHeader(pSrcType.pbFormat).bmiHeader.biSizeImage:=MyProfile.ImageWidth*MyProfile.ImageHeight*3;
          PVideoInfoHeader(pSrcType.pbFormat).bmiHeader.biCompression:=MKFOURCC('U','Y','V','Y');
          pStreamConfig.SetFormat(TAMMediaType(pSrcType^));
        end;
    [/code]
      

  14.   

    g_pCapture.FindPin(aSrcFilter.BaseFilter, PINDIR_OUTPUT, @PIN_CATEGORY_CAPTURE, @MEDIATYPE_Video, true, 0, pPinOut);
        pPinOut.QueryInterface(IID_IAMStreamConfig,pStreamConfig);
        GetMem(pSrcType,SizeOf(TAMMediaType));
        if pStreamConfig.GetFormat(pSrcType)=S_OK then begin
          pSrcType.majortype:=MEDIATYPE_Video;
          pSrcType.subtype:=MEDIASUBTYPE_UYVY;
          pSrcType.formattype:=FORMAT_VideoInfo;
          pSrcType.bFixedSizeSamples:=true;
          pSrctype.bTemporalCompression:=false;
          pSrcType.lSampleSize:=MyProfile.ImageWidth*MyProfile.ImageHeight*3;
          PVideoInfoHeader(pSrcType.pbFormat).rcSource:=Rect(0,0,MyProfile.ImageWidth,MyProfile.ImageHeight);
          PVideoInfoHeader(pSrcType.pbFormat).rcTarget:=Rect(0,0,MyProfile.ImageWidth,MyProfile.ImageHeight);
          PVideoInfoHeader(pSrcType.pbFormat).dwBitRate:=1000000;
          PVideoInfoHeader(pSrcType.pbFormat).dwBitErrorRate:=0;
          //PVideoInfoHeader(pSrcType.pbFormat).AvgTimePerFrame:=Round(10000000 / FileFps);
          PVideoInfoHeader(pSrcType.pbFormat).AvgTimePerFrame:=theAvgTimePerFrame;
          PVideoInfoHeader(pSrcType.pbFormat).bmiHeader.biWidth:=MyProfile.ImageWidth;
          PVideoInfoHeader(pSrcType.pbFormat).bmiHeader.biHeight:=MyProfile.ImageHeight;
          PVideoInfoHeader(pSrcType.pbFormat).bmiHeader.biSizeImage:=MyProfile.ImageWidth*MyProfile.ImageHeight*3;
          PVideoInfoHeader(pSrcType.pbFormat).bmiHeader.biCompression:=MKFOURCC('U','Y','V','Y');
          pStreamConfig.SetFormat(TAMMediaType(pSrcType^));
        end;
      

  15.   

    怎么不能修改回复,晕,还是那个问题把PIN_CATEGORY_CAPTURE改成PIN_CATEGORY_PREVIEW
      

  16.   

    哈哈!可以啦!终于可以啦!
    在yktd26的提示下,我修改了一下19楼的代码!现在终于可以现实天敏这卡默认分辨率了!
    谢谢!非常感谢啊!
    结贴去!
      

  17.   

    procedure TForm1.FormCreate(Sender: TObject); 
    var SysDev: TSysDevEnum; 
        VideoStreamConfig : IAMStreamConfig; 
        AMMEdiaType :PAMMediaType; 
    begin 
        SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory); 
        FilterGraph1.ClearGraph; 
        FilterGraph1.Active := False; 
        Filter1.BaseFilter.Moniker := SysDev.GetMoniker(SysDev.CountFilters-1); 
        FilterGraph1.Active := true; 
        with FilterGraph1 as ICaptureGraphBuilder2 do    //这个地方我运行的时候会报错 请帮我看看
        begin 
            FindInterface(@PIN_CATEGORY_PREVIEW, nil, Filter1 as IBaseFilter, IID_IAMStreamConfig, VideoStreamConfig); 
            VideoStreamConfig.GetFormat(AMMEdiaType); 
    PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biWidth:= 768; 
    PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biHeight:= 576; 
            AMMEdiaType.SubType :=MEDIASUBTYPE_RGB24; 
            PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biSizeImage:=Round(768*576*PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biPlanes*PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biBitCount/8); 
            AMMEdiaType.lSampleSize:=PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biSizeImage; 
    VideoStreamConfig.SetFormat(AMMEdiaType^); 
            DeleteMediaType(AMMEdiaType); 
            RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter1 as IBaseFilter, SampleGrabber1 as IBaseFilter,            VideoWindow1 as IbaseFilter); 
        end; 
        FilterGraph1.Play; 
    end; 
      

  18.   

    procedure TForm1.FormCreate(Sender: TObject); 
    var SysDev: TSysDevEnum; 
        VideoStreamConfig : IAMStreamConfig; 
        AMMEdiaType :PAMMediaType; 
    begin 
        SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory); 
        FilterGraph1.ClearGraph; 
        FilterGraph1.Active := False; 
        Filter1.BaseFilter.Moniker := SysDev.GetMoniker(SysDev.CountFilters-1); 
        FilterGraph1.Active := true; 
        with FilterGraph1 as ICaptureGraphBuilder2 do  //这个地方我运行的时候会报错 请帮我看看    begin 
            FindInterface(@PIN_CATEGORY_PREVIEW, nil, Filter1 as IBaseFilter, IID_IAMStreamConfig, VideoStreamConfig); 
            VideoStreamConfig.GetFormat(AMMEdiaType); 
    PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biWidth:= 768; 
    PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biHeight:= 576; 
            AMMEdiaType.SubType :=MEDIASUBTYPE_RGB24; 
            PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biSizeImage:=Round(768*576*PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biPlanes*PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biBitCount/8); 
            AMMEdiaType.lSampleSize:=PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biSizeImage; 
    VideoStreamConfig.SetFormat(AMMEdiaType^); 
            DeleteMediaType(AMMEdiaType); 
            RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter1 as IBaseFilter, SampleGrabber1 as IBaseFilter,            VideoWindow1 as IbaseFilter); 
        end; 
        FilterGraph1.Play; 
    end; 
      

  19.   

    请问大家:
    我想修改MPEG Layer-3 Decoder 这个Filter 的属性的FreQuency值=Quarter
    代码怎么实现呢?
      

  20.   


    咋改的?我怎么还是不能ShowPinPropertyPage(Self.Handle, PinList.Items[1])设置的分辨率默认下来啊?每次重新运程序又回去了。
    似乎是SetVideoParams函数没起作用。