我用dspack获得摄象头的型号
然后列举出视频格式,比如rgb:176x144,rgb:320x240
再进行采集,通过网络服务端转发出去
现在问题是,dspack(FVideoMediaTypes)获取过来的摄象头视频格式,有些最小也是320*240,并没有176X144
320*240很占带宽但我看了别人的一些在使用的程序,都只是176*144,不管什么摄象头都可以强制设成176*144请问,应当如何才能做到先给100分
问题解决再加100分,决不食言谢谢大家了
然后列举出视频格式,比如rgb:176x144,rgb:320x240
再进行采集,通过网络服务端转发出去
现在问题是,dspack(FVideoMediaTypes)获取过来的摄象头视频格式,有些最小也是320*240,并没有176X144
320*240很占带宽但我看了别人的一些在使用的程序,都只是176*144,不管什么摄象头都可以强制设成176*144请问,应当如何才能做到先给100分
问题解决再加100分,决不食言谢谢大家了
然后再压缩传出去??
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;这是可实现图片放大缩小的一段代码,不过我估计用这种方法达不到楼主的要求
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;
这两个参数你可以自行设置
我先试试
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.
我后来是采用
GetFormat(pmt);
然后修改这个pmt的
bmiHeader.biWidth := VideoWidth;
bmiHeader.biHeight
这样好象出去后的图象大小就可以变成176*144了,正在实验中,成功后,就给分