哪位大哥知道DSPask里的ControlStream怎么用?
用ControlStream可以实现摄像头录象时,使用停止和继续录象吗?
我想实现用摄像头录象,预览视频流用来显示摄像头画面,捕捉视频流用来录象,随时可以中断捕捉视频流,中断录象后摄像头的画面不停,中断后还可以继续录象,不要重新录象而是继续,录象保存的文件是一个。
我想使用ControlStream来实现这个功能,但是总不成功,主要是pstart, pstop: PReferenceTime这两个参数不知道怎么设。
哪位大哥知道,说一下,谢谢了。

解决方案 »

  1.   

    DSPask没用过,ControlStream是个流类吧,看看的函数有什么功能
    进去代码看该类的的过程或者函数。
      

  2.   

    directshow 几句话的事,打开播放停止暂停啥都有,如果要录制,就加个捕获的 filter
      

  3.   

    楼上的大哥能告诉,我想实现捕获的 filter暂停和继续,在捕获的 filter暂停时预览的filter不暂停,这个应该怎么实现。谢谢
      

  4.   

    工作机不能上网呢,我明天找找看,给你个控制摄像头的例程吧,至于录制的,你另想办法,用 directshow 里面的 一个 Capture filter 就可实现
      

  5.   

    procedure TForm1.Button2Click(Sender: TObject);
      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;
      

  6.   

    具体的摄像头要看你的名称而定了
     idx := 0;                          //0虚拟,1,真实摄像 存在多个摄像头时,无法获取真实摄像头 修改这个值即可