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 就可以把桌面发送给摄像头
可用CapTest.exe测试显示 打开摄像头
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