VCamSDK 4.1 qt 使用 (sip 客户端打开分享桌面测试)

1.VCamSDK 提供了虚拟设系统的开发 下载地址

http://www.e2esoft.com/sdk/vcam-sdk/ 本文4.1版本

解压运行install.bat   安装 uninstall.bat卸载  运行后会在系统注册虚拟摄像头

运行目录下的VCamDemo.exe或者VCamDemoCS.exe就可以吧要虚拟的桌面发送给摄像头

这里点击screen capture   就可以把桌面发送给摄像头

VCamSDK 4.1 qt 使用 (sip 客户端打开分享桌面测试)

可用CapTest.exe测试显示 打开摄像头

VCamSDK 4.1 qt 使用 (sip 客户端打开分享桌面测试)

VCamSDK 4.1 qt 使用 (sip 客户端打开分享桌面测试)

2.运行在qt 

解压VCamDemos.zip  本文主要测试在c的使用非c#    它默认提供的好像是win32句柄开发的demo 在qt 不好使用稍微改下

新建一个头文件将 VCamRenderer_i.c 内容拷过去(xx.h)

新一个类DSRender   将DSRender.cpp、h的文件内容拷过去

去掉头文件的#include <strmif.h> 

cpp的#include "stdafx.h"

3. qt 项目导入

#include "DSRender.h"
#include "xx.h"
#include <dshow.h>

先跑下项目运行后会在vs运行目录多个 vcamrenderer.tlh 

在导入#include "vcamrenderer.tlh"

好了现在可以开发了

 

在头文件添加

private:
    Ui::QtVCamClass ui;
    IBaseFilter*        m_vcam_renderer = nullptr;
    IVCamRenderer*        m_vcam = nullptr;
    CDSRender            m_player;
    //CDeviceEnumerator    m_input_devices;
    //CDeviceEnumerator::CDevice* m_current_vcam = nullptr;
    
    HANDLE                m_thread = nullptr;

    QTimer *m_timer;
    void closeEvent(QCloseEvent *event);

添加一个按钮事件

void QtVCam::start() {
    
    HRESULT hr = ::CoInitialize(nullptr);

    // Create VCam renderer filter
    if (FAILED(hr = CoCreateInstance(CLSID_VCamRenderer, NULL, CLSCTX_INPROC, IID_IBaseFilter,
        reinterpret_cast<void**>(&m_vcam_renderer)))) {
        //MessageBox(_T("VCamRenderer filter not registered!"), _T("Error"), MB_OK | MB_ICONERROR);
        qDebug() << "VCamRenderer filter not registered!";
        return ;
    }

    // get [IVCamRender] interface from VCam Renderer filter
    if (FAILED(hr = m_vcam_renderer->QueryInterface(&m_vcam))) {
        //MessageBox(_T("VCam Driver not installed!"), _T("Error"), MB_OK | MB_ICONERROR);
        qDebug() << "VCam Driver not installed!!";
        return ;
    }

    // pass it to player
    m_player.SetVCamRender(m_vcam);

    // list available video capture devices
    //m_input_devices.Enumerate();
      

    // list multiple VCam source Device 
    /**for (auto& it : m_input_devices.m_vcam) { 
        if (m_current_vcam == nullptr) {
            m_current_vcam = it.get();
            qDebug() <<"======="<< m_current_vcam->m_friendly_name.c_str();
        }
    }**/
    // create a thread to detect VCam usage.

    if (m_vcam) {
        m_vcam->SetOutputFormat(1920, 1080, 20, 0, 0);
        m_vcam->CaptureScreen(0, 0, 640, 480);
    
    }

    m_timer = new QTimer(this);
    //定时器触发信号槽
    connect(m_timer, &QTimer::timeout, this, &QtVCam::TimerTimeOut);
    m_timer->setInterval(100);//1000=1s
    
    m_timer->start();
}
 

这里启动了一个timer  设置100m发送一次桌面  还可以设置输出尺寸

void QtVCam::TimerTimeOut()
{
    if (m_vcam) {
        qDebug() << "11111";
        m_vcam->CaptureScreen(0, 0, 1920, 1080);
    }
}

好了  现在就可以用CapTest.exe打开看了   

 

在sip 客户端的摄像头选择设置为virtual camera 就可以发送桌面给对方了

for (int i = 0; i < 3; i++)//找到摄像头
    {
        QString x = QString(QLatin1String((video_devices[i])));
        if (x.contains("virtual camera", Qt::CaseSensitive)) {
            index = i; break;
        }
    }
    linphone_core_set_video_device(lc, video_devices[index]);

如果是通话视频 对方看到的是你的桌面了当然输出640*480 不是那么清楚 你可以调大 环境允许

 

sip 客户端各平台解决方案https://shop121230895.taobao.com/

交流群261074724