QtWebEngine 时允许使用 WebRTC 网络摄像头请求?

Posted

技术标签:

【中文标题】QtWebEngine 时允许使用 WebRTC 网络摄像头请求?【英文标题】:Allow WebRTC webcam request using when QtWebEngine? 【发布时间】:2015-06-16 18:36:04 【问题描述】:

当QtWebEngine(使用QML插件或不使用QML插件时)如何允许WebRTC网络摄像头请求?

webengine.qml

import QtQuick 2.1
import QtQuick.Controls 1.1
import QtWebEngine 1.0

ApplicationWindow 
    width: 800
    height: 600
    color: "lightgray"
    visible: true
    WebEngineView 
        id: webview
        url: "https://opentokrtc.com/test"
        anchors.fill: parent
    

在我的 Mac Yosemite 上,运行命令:

/usr/local/Cellar/qt5/5.4.0/bin/qmlscene webengine.qml 

但视频无法开始,因为它正在等待“允许”摄像头

在浏览器上你会有这个

有没有办法以编程方式设置 Chromium Web Engine 政策,例如VideoCaptureAllowed

【问题讨论】:

【参考方案1】:

将此添加到您的 WebEngineView 项目以从所有来源授予任何请求的功能,或选择性地将其限制为特定来源和特定功能:

    onFeaturePermissionRequested: 
        grantFeaturePermission(securityOrigin, feature, true);
    

【讨论】:

【参考方案2】:

你需要使用QtWebEngine.experimental请试试这个。

import QtQuick 2.4
import QtQuick.Window 2.2
import QtWebEngine 1.0
import QtWebEngine.experimental 1.0
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
import QtQuick.Layouts 1.1
import QtQuick.Controls.Private 1.0

Window 
    visible: true
    WebEngineView 
        id: webEngineView
        url: "https://test.webrtc.org/"
        anchors.fill: parent
        anchors.margins: 10
        experimental.onFeaturePermissionRequested: 
            console.log("request")
            experimental.grantFeaturePermission(securityOrigin, feature, true);
        

        readonly property string hideElementsJS: "
            function hideElement(id) 
                const el = document.getElementById(id);
                if (el) 
                    el.style.display = 'none';
                
            

            function hideElementsByClass(className) 
                const elList = document.getElementsByClassName(className);
                for (var i = 0, n = elList.length; i < n; ++i) 
                    elList[i].style.display = 'none';
                
            

            hideElement('hnArea');
            hideElement('lxSocialBarWrapper');
            hideElement('footerContent');
            hideElement('ftDisclaimers');
            hideElement('bottomNav');
            hideElement('topLinks');
            hideElement('rightMenuButtons');

            hideElementsByClass('footerText');
            hideElementsByClass('disclaimers');
        "

        onLoadingChanged: 
            if(loadRequest.status === WebEngineView.LoadSucceededStatus) 
                console.log("start")
                runjavascript(hideElementsJS);
                console.log("stop")
            
        
    

【讨论】:

【参考方案3】:

打开 fancybrowser 项目 在函数 MainWindow::MainWindow(const QUrl& url) 中添加 mainwindow.cpp

connect(view->page(), SIGNAL(featurePermissionRequested(QUrl,QWebEnginePage::Feature)),SLOT(test(QUrl,QWebEnginePage::Feature)));

还要加

void MainWindow::test(QUrl q, QWebEnginePage::Feature f) 
    view->page()->setFeaturePermission(q, f, 
    QWebEnginePage::PermissionGrantedByUser); 

在mainwindow.cpp和mainwindow.h下面

受保护的插槽:

void test(QUrl q, QWebEnginePage::Feature f);

然后一切正常!

【讨论】:

以上是关于QtWebEngine 时允许使用 WebRTC 网络摄像头请求?的主要内容,如果未能解决你的问题,请参考以下文章

使用 VS 2015 构建 QtWebEngine 5.8 时如何禁用 Windows 10 功能?

单击链接时如何修改 QtWebEngine 行为?

打开下拉菜单后在 QtWebEngine 中触摸冻结

使用 Qt WebEngine 自动授予对麦克风和摄像头的访问权限

使用 QtWebEngine 编译 PyQt5 应用程序

QtWebEngine 演示应用程序崩溃