CodingGeekwithglasses
CodingGeekwithglasses

Reputation: 21

How to use media foundation api to create a virtual camera filter which is detected in different apps( skype, teams, gmeet)?

this is my code in qt

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QMessageBox>
#include <QPushButton>

#include <mfobjects.h>
#include <mfplay.h>
#include <mfidl.h>
#include <mfapi.h>
#include <mfobjects.h>
#include <mfidl.h>
#include <mferror.h>
#include <Windows.h>
#include <comdef.h>
#include <string>
#include <mfapi.h>
#include <mfobjects.h>
#include <QDebug>
#include <QCoreApplication>
#include <QSettings>
#include <QFileInfo>

// Registry utility function
QString GUIDToString(const GUID& guid) {
    wchar_t guidString[39];  // 38 characters for GUID + null terminator
    StringFromGUID2(guid, guidString, sizeof(guidString) / sizeof(wchar_t));
    return QString::fromWCharArray(guidString);
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle("Virtual Camera Example");

    HRESULT hr = MFStartup(MF_VERSION);
    if (FAILED(hr)) {
        qDebug() << "Failed to initialize Media Foundation. HRESULT: " << QString::number(hr, 16);
        return;
    }

    startVirtualCamera();
}

// Start virtual camera
void MainWindow::startVirtualCamera()
{
    HRESULT hr = S_OK;

    // Virtual Camera GUID
    GUID CLSID_VCam = {0x3cad447d, 0xf283, 0x4af4, {0xa3, 0xb2, 0x6f, 0x53, 0x63, 0x30, 0x9f, 0x51}};
    std::wstring cameraName = L"Vita";

    // Create Virtual Camera
    hr = MFCreateVirtualCamera(
        MFVirtualCameraType_SoftwareCameraSource,
        MFVirtualCameraLifetime_Session,
        MFVirtualCameraAccess_CurrentUser,
        cameraName.c_str(),
        L"{3cad447d-f283-4af4-a3b2-6f5363309f51}",
        nullptr,
        0,
        &_vcam);
    qDebug() << "virtual cam clsid" <<GUIDToString(CLSID_VCam).toStdWString().c_str();
    if (FAILED(hr))
    {
        QMessageBox::critical(this, "Error", "Failed to create virtual camera");
        return;
    }

    hr = _vcam->Start(nullptr);
    if (FAILED(hr))
    {
        qDebug() << "Error Failed to start virtual camera" << hr;
        return;
    }

    QMessageBox::information(this, "Success", "Virtual Camera Started");
}

I have done this in Qt c++, this throws an error saying Error Failed to start virtual camera -2147221164, which is class not registered, how to register the class for this CLSID, I am new to media foundation api, any help is appreciated ;)

I also checked VCAMSAMPLE code but it also seems to do the same thing ( almost)

Upvotes: 2

Views: 48

Answers (0)

Related Questions