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.Active := True;
ShowFilterPropertyPage(Self.Handle, Filter as IBaseFilter);
//以上代码就可以调用一个调整视频参数的窗口,但无法默认它的值!
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);
再问下 PinList.Items[1]是什么类型的,怎么得到这个值的 我不知道怎么调用
多谢
贴段代码我看一下可以撒
至于0是什么,1是什么,在IBaseFilter里就有的!
我是想问你1楼的代码的参数PinList是怎么产生出来的(不是用来干什么而是怎么得出来的),总不会是某个事件的参数吧?
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;
刚好在修改这一块 就给你掏出来了 看看先
ShowPinPropertyPage(Self.Handle, PinList.Items[1]); //修改分辩率
我通过上面这一句,就可以弹出一个预览设置属性窗口,就可以设出720*576分辨率了!
用你的函数对天敏SDK3000的卡就是不成功!
或者从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]
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;
在yktd26的提示下,我修改了一下19楼的代码!现在终于可以现实天敏这卡默认分辨率了!
谢谢!非常感谢啊!
结贴去!
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;
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;
我想修改MPEG Layer-3 Decoder 这个Filter 的属性的FreQuency值=Quarter
代码怎么实现呢?
咋改的?我怎么还是不能ShowPinPropertyPage(Self.Handle, PinList.Items[1])设置的分辨率默认下来啊?每次重新运程序又回去了。
似乎是SetVideoParams函数没起作用。