哪位大哥知道DSPask里的ControlStream怎么用?
用ControlStream可以实现摄像头录象时,使用停止和继续录象吗?
我想实现用摄像头录象,预览视频流用来显示摄像头画面,捕捉视频流用来录象,随时可以中断捕捉视频流,中断录象后摄像头的画面不停,中断后还可以继续录象,不要重新录象而是继续,录象保存的文件是一个。
我想使用ControlStream来实现这个功能,但是总不成功,主要是pstart, pstop: PReferenceTime这两个参数不知道怎么设。
哪位大哥知道,说一下,谢谢了。
用ControlStream可以实现摄像头录象时,使用停止和继续录象吗?
我想实现用摄像头录象,预览视频流用来显示摄像头画面,捕捉视频流用来录象,随时可以中断捕捉视频流,中断录象后摄像头的画面不停,中断后还可以继续录象,不要重新录象而是继续,录象保存的文件是一个。
我想使用ControlStream来实现这个功能,但是总不成功,主要是pstart, pstop: PReferenceTime这两个参数不知道怎么设。
哪位大哥知道,说一下,谢谢了。
进去代码看该类的的过程或者函数。
var pCreateDevEnum : ICreateDevEnum; //设备枚举器Interface
pEnum : IEnumMoniker; //名称枚举Interface
pM : IMoniker ;
cFetched : Plongint;
pBag :IPropertyBag;
varName :OleVARIANT;
pBuilder : ICaptureGraphBuilder2;
pCapSrcFilter : IBaseFilter;
pbc : IBindCtx;
hr : HRESULT;
i,idx : integer;
pEvent : IMediaEvent; //过滤器容器事件接口
Vcam : Variant;
hrTest: HRESULT;
strPath : string;
dwHGif ,dwRet: DWORD;
begin
Func_ImageLayerOpen(5,160,120);
For i := 0 to 3 do
begin
strPath := ExtractFilePath(Application.ExeName) + inttostr(i + 1) + '.gif';
Func_ImageLayerLoad(i,PChar(strPath));
end;
if m_pGraph <> nil then
begin
(m_pGraph as IMediaControl).Run;
Exit;
end;
idx := 0; //0虚拟,1,真实摄像 存在多个摄像头时,无法获取真实摄像头
PM := nil; pbc := nil;
hr := CoCreateInstance(CLSID_SystemDeviceEnum, nil,
CLSCTX_INPROC_SERVER, ICreateDevEnum, pCreateDevEnum);//创建枚举器组件
if(hr<0) then exit;
// 为指定的类型目录创建一个枚举器
hr := pCreateDevEnum.CreateClassEnumerator(CLSID_VideoInputDeviceCategory, pEnum, 0);
if(hr<0) then exit;
if (pEnum <> nil) then
begin
PEnum.Reset;
i :=0;
while (pEnum.Next(1, pM, cFetched) = S_OK) do //枚举每一个IEnumMoniker
begin
pM.BindToStorage(nil, nil, IPropertyBag, pBag);
VariantInit(varName);
pBag.Read('FriendlyName', varName, nil);//设备名称
if (idx = i) then //返回设备的名称
break
else
begin
Inc(i);
end;
end;
end;
pEnum := nil;
pCreateDevEnum := nil;
// we found it
if (pM <> nil) then
begin
pBuilder := nil;
pCapSrcFilter := nil;
CreateBindCtx(0, pbc);
pM.BindToObject(pbc, nil, IBaseFilter, pCapSrcFilter);//生成绑定到设备上的filter
pbc := nil;
eid := 0;
Test:= 'bright[-255..255]={100}, contrast[0..32]={10}';
// CoCreateInstance(CLSID_VCamTrans,nil,CLSCTX_INPROC,IID_IBaseFilter,P_VCamTrans);
// CoCreateInstance(CLASS_VCamRenderer, nil, CLSCTX_INPROC, IID_IBaseFilter,m_pVCamRenderer);
CoCreateInstance(CLSID_CaptureGraphBuilder2, nil,CLSCTX_INPROC_SERVER, ICaptureGraphBuilder2, pBuilder);
CoCreateInstance(CLSID_FilterGraph, nil,CLSCTX_INPROC, IGraphBuilder, m_pGraph);
// m_pVCamRenderer.QueryInterface(IID_IVCamRenderConfig, m_pConfig); //访问接口
// P_VCamTrans.QueryInterface(IID_IVCamTransConfig,m_pCamTranconfig);
pBuilder.SetFiltergraph(m_pGraph);//将其添加到FILTER管理器中
// m_pGraph.AddFilter(m_pVCamRenderer, 'Renderer');
m_pGraph.AddFilter(pCapSrcFilter, 'Source');
// m_PGraph.AddFilter(P_VCamTrans,'Trans');
// m_pCamTranconfig.SetVideoGDIDrawer(Addr(GDIDraw));
m_pGraph.QueryInterface(IID_IMediaControl, m_pMC);
hr := pBuilder.RenderStream(nil, nil, pCapSrcFilter, nil, P_VCamTrans);//连接一个源Filter输出到下一 Filter
// hr := pBuilder.RenderStream(nil, nil, P_VCamTrans, nil, m_pVCamRenderer);//连接一个源Filter输出到下一 Filter
// if (hr<0) then Exit;
Button3.Enabled := True;
if (m_pMC <> nil) then
try
(m_pGraph as IMediaControl).Run;
pCapSrcFilter := nil;
pBuilder := nil;
pCapSrcFilter := nil;
pM := nil;
Except
end;
end;
end;
idx := 0; //0虚拟,1,真实摄像 存在多个摄像头时,无法获取真实摄像头 修改这个值即可