【问题标题】:Display Camera created in C++ on VideoOutput in QML在 QML 的 VideoOutput 上显示用 C++ 创建的相机
【发布时间】:2020-02-07 18:40:55
【问题描述】:

我无法将用 C++ 创建的 QCamera 显示到 QML 中的 VideoOutput。 如果我在 QML 中使用相机的这种方式,一切都很好,我得到了视频输出:

Item{
        VideoOutput
        {
            id: videoOutput
            anchors.fill: parent
            source: camera
        }
        Camera
        {
            id: camera
        }
}

但在我的情况下,相机不在 QML 中。我正在用 C++ 创建它。我试图在 C++ 中创建它并将其设置为 contextProperty,因此在 qml 的 VideoOutput 的源代码中使用它。所以这是我的 main.cpp。

QCamera* camera;

    QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
    foreach (const QCameraInfo &cameraInfo, cameras)
    {
        qDebug() << cameraInfo.description();

        camera = new QCamera(cameraInfo);
    }

    if(camera)
    {
        qDebug() << "setContextProperty  camera ";
        engine.rootContext()->setContextProperty("mCamera", camera);
    }

一切都很好,摄像头被检测到,我在 QML 中使用它,如下所示:

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Item
    {
        id: cameraView
        height: 230
        width: 300
        anchors.centerIn: parent

        VideoOutput
        {
            id: videoOutput
            anchors.fill: parent
            source: mCamera
        }
    }

但是这种方式没有视频输出。这有可能实现吗?提前致谢。

【问题讨论】:

  • 您是否按照documentation 中的说明进行操作?:如果您正在扩展自己的 C++ 类以与 VideoOutput 互操作,您可以提供基于 QObject 的类,该类具有 mediaObject 属性公开具有可用 QVideoRendererControl 的 QMediaObject 派生类,或者您可以提供具有可写 videoSurface 属性的基于 QObject 的类,该属性可以接受基于 QAbstractVideoSurface 的类,并且可以遵循正确的协议将 QVideoFrames 传递给它。
  • 我会检查并尝试一下。非常感谢@folibis
  • 链接文档适用于您想要显示常规相机以外的其他内容时

标签: c++ qt camera qml


【解决方案1】:

您不能直接将QCamera 分配给VideoOutput 的来源。

您可以做的是将 QML CameradeviceId 设置为与您的 QCamera 中的匹配:

在你的 C++ 中:

engine.rootContext()->setContextProperty("deviceId", cameraInfo.deviceName);

在你的 QML 中:

Camera {
    id: camera
    deviceId: cameraDeviceId
}

VideoOutput {
    id: videoOutput
    anchors.fill: parent
    source: camera
}

【讨论】:

  • 感谢您的回答@GrecKo。但是通过这种方法,我只需将设备 ID 传递给 QML,并且将设置相机而不从 C++ 获取设置。我对吗?假设我修改了我的 C++ QCamera,并且我希望修改后的相机用于 QML。我会用这种方法创建新的 QML 相机类型吗?提前致谢。
【解决方案2】:

以防万一有人仍然感兴趣。
您可以使用 Camera->setViewfinder() 函数。

我有一个 QCamera 的包装类,可以做一些其他的事情。 除此之外,还有一个公共插槽可以从 QML 设置相机取景器。

void MyCamClass::setViewFinder(QObject *vf)
{
  if(Camera)
    Camera->setViewfinder(qobject_cast<QAbstractVideoSurface *>(vf));
}

在 QML 方面,您将拥有一个

VideoOutput {
  id: vOutput
}

如果你想激活你的相机,你可以拨打:

mCamera->setviewFinder(vOutput.videoSurface);

mCamera 是 MyCamClass 类的对象,并已注册到 QML 环境。
请确保在设置取景器之前启动相机。

【讨论】:

    猜你喜欢
    • 2020-09-16
    • 2015-07-12
    • 2017-10-06
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多