我用dspack获得摄象头的型号
然后列举出视频格式,比如rgb:176x144,rgb:320x240
再进行采集,通过网络服务端转发出去
现在问题是,dspack(FVideoMediaTypes)获取过来的摄象头视频格式,有些最小也是320*240,并没有176X144
320*240很占带宽但我看了别人的一些在使用的程序,都只是176*144,不管什么摄象头都可以强制设成176*144请问,应当如何才能做到先给100分
问题解决再加100分,决不食言谢谢大家了

解决方案 »

  1.   

    dspack获取的视频为一系列的图像的组合,把每个图像缩放成你的尺寸不就行了
      

  2.   

    用程序打开的摄像头尺寸好像是不可更改的,不信你用暴风打开设备看一下,我自己写的也是,一拉伸就变形了,一楼说的方法可行,取得图片后再用 TGpGraphics 和 TGpImage进行放大或缩小,效果很不错的!
      

  3.   

    取得图片后再用 TGpGraphics 和 TGpImage进行放大或缩小
    然后再压缩传出去??
      

  4.   


      var FGraphics : TGpGraphics;
          FImage    : TGPImage;
          Rect : TGpRect;
    begin
      try
        FGraphics  := TGpGraphics.Create(Form1.Canvas.Handle);
        Rect := GpRect(650,140,160,120); //X,Y 坐标,需要绘制的长度和宽度
        FImage := TGPImage.Create('4.gif');
        FGraphics.DrawImage(FImage,Rect,0,0,320,240,utPixel); // 0,0,320,240Rect 范围内的起始坐标和原
    图像大小
      Finally
        FGraphics.Free;
        FImage.Free;   
      end;  
    end;这是可实现图片放大缩小的一段代码,不过我估计用这种方法达不到楼主的要求
      

  5.   


    var
      pvih: PVideoInfoHeader;
      MediaType: TAMMediaType;
      FVideo_AMStreamConfig: IAMStreamConfig;
      pmt: 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(@PIN_CATEGORY_CAPTURE, nil, Filter as IBaseFilter, IID_IAMStreamConfig, FVideo_AMStreamConfig);    //设置摄像头
        FVideo_AMStreamConfig.GetFormat(pmt);
        pvih := PVideoInfoHeader(pmt^.pbFormat);
        pvih^.AvgTimePerFrame := 15;
        pvih^.bmiHeader.biBitCount := 24;
        pvih^.dwBitRate := VideoWidth * VideoHEIGHT * (pvih^.bmiHeader.biBitCount div 8) * 15;
        pvih^.bmiHeader.biWidth := VideoWidth;
        pvih^.bmiHeader.biHeight := VideoHEIGHT;
        pvih^.bmiHeader.biSizeImage := VideoWidth * VideoHEIGHT * (pvih^.bmiHeader.biBitCount div 8);
        pmt^.lSampleSize := VideoWidth * VideoHEIGHT * (pvih^.bmiHeader.biBitCount div 8);
        FVideo_AMStreamConfig.SetFormat(pmt^);
        RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter);
      end;
      FilterGraph.Play;
    end;
      

  6.   

    VideoWidth,VideoHEIGHT 
    这两个参数你可以自行设置
      

  7.   

    aniugee 如果摄像头没自带176*144的话,设置VideoWidth,VideoHEIGHT成176*144,是不是也可以达到176*144的效果
    我先试试
      

  8.   

    我摄像头最低是320*240,按aniugee的方法设置后,出来是黑屏
      

  9.   


    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DSUtil, StdCtrls, DSPack, DirectShow9, Menus, ExtCtrls;
    const
      VideoWidth=176;//352;//320;//
      VideoHeight=144;//288;//240;//type
      TForm1 = class(TForm)
        VideoWindow: TVideoWindow;
        FilterGraph: TFilterGraph;
        SampleGrabber: TSampleGrabber;
        Filter: TFilter;
        MainMenu1: TMainMenu;
        Devices: TMenuItem;
        N1: TMenuItem;
        ServerTrans: TMenuItem;
        p2p1: TMenuItem;
        N2: TMenuItem;
        ext1: TMenuItem;
        Bitmap1: TMenuItem;
        N3: TMenuItem;
        help: TMenuItem;
        About: TMenuItem;
        procedure FormCreate(Sender: TObject);
      private
        procedure OnSelectDevice(sender: TObject);
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      SysDev: TSysDevEnum;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
      var
      i: integer;
      Device: TMenuItem;
    begin
      SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
      if SysDev.CountFilters > 0 then
        for i := 0 to SysDev.CountFilters - 1 do
        begin
          Device := TMenuItem.Create(Devices);
          Device.Caption := SysDev.Filters[i].FriendlyName;
          Device.Tag := i;
          Device.OnClick := OnSelectDevice;
          Devices.Add(Device);
        end;
    end;procedure TForm1.OnSelectDevice(sender: TObject);
    var
      pvih: PVideoInfoHeader;
      FVideo_AMStreamConfig: IAMStreamConfig;
      pmt: 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(@PIN_CATEGORY_CAPTURE, nil, Filter as IBaseFilter, IID_IAMStreamConfig, FVideo_AMStreamConfig);    //设置摄像头
        FVideo_AMStreamConfig.GetFormat(pmt);    pvih := PVideoInfoHeader(pmt^.pbFormat);
        pvih^.AvgTimePerFrame := 15;
        pvih^.bmiHeader.biBitCount := 24;
        pvih^.dwBitRate := VideoWidth * VideoHEIGHT * (pvih^.bmiHeader.biBitCount div 8) * 15;
        pvih^.bmiHeader.biWidth := VideoWidth;
        pvih^.bmiHeader.biHeight := VideoHEIGHT;
        pvih^.bmiHeader.biSizeImage := VideoWidth * VideoHEIGHT * (pvih^.bmiHeader.biBitCount div 8);
        pmt^.lSampleSize := VideoWidth * VideoHEIGHT * (pvih^.bmiHeader.biBitCount div 8);
        FVideo_AMStreamConfig.SetFormat(pmt^);
        RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter);
      end;
      FilterGraph.Play;
    end;end.
      

  10.   

    通过xvid压缩的
    我后来是采用
    GetFormat(pmt);
    然后修改这个pmt的
      bmiHeader.biWidth := VideoWidth;
      bmiHeader.biHeight 
    这样好象出去后的图象大小就可以变成176*144了,正在实验中,成功后,就给分