Автоматическое предоставление доступа к микрофону и камере с помощью Qt WebEngine

Я создаю домашнюю систему безопасности с RPi и WebRTC. Мне просто нужен способ, чтобы браузер открывался по заданному URL-адресу и автоматически предоставлял доступ к микрофону и камере. Я надеялся использовать библиотеку WebEngine с PyQt, но WebEngine не поддерживается в PyQt для RPi. Поэтому я сейчас пробую сам Qt. К сожалению, я не знаком с C++, поэтому я борюсь.

Пример здесь содержит 90% того, что Я нуждаюсь. Код воспроизведен ниже. Мне просто нужно настроить его, чтобы предоставить доступ к микрофону и камере, когда это требуется. Я надеюсь, что кто-то может помочь мне с этим?

#include <QApplication>
#include <QWebEngineView>

QUrl commandLineUrlArgument()
{
    const QStringList args = QCoreApplication::arguments();
    for (const QString &arg : args.mid(1)) {
        if (!arg.startsWith(QLatin1Char('-')))
            return QUrl::fromUserInput(arg);
    }
    return QUrl(QStringLiteral("https://www.qt.io"));
}


int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc, argv);
    QWebEngineView view;
    view.setUrl(commandLineUrlArgument());
    view.resize(1024, 750);
    view.show();

    return app.exec();
}

person Lee Melbourne    schedule 16.03.2018    source источник


Ответы (1)


Я ответил на этот вопрос, но для PyQt5: Предоставить доступ к Cam & Mic использую Python для PyQt WebEngine, я буду делать только перевод C++ на Python, основа та же.

#include <QApplication>
#include <QUrl>
#include <QWebEngineView>

class WebEnginePage: public QWebEnginePage{
    Q_OBJECT
public:
    WebEnginePage(QObject *parent = Q_NULLPTR):QWebEnginePage(parent){
        connect(this, &WebEnginePage::featurePermissionRequested, this, &WebEnginePage::onFeaturePermissionRequested);
    }
private Q_SLOTS:
    void onFeaturePermissionRequested(const QUrl &securityOrigin, QWebEnginePage::Feature feature){

        if(feature  == QWebEnginePage::MediaAudioCapture
                || feature == QWebEnginePage::MediaVideoCapture
                || feature == QWebEnginePage::MediaAudioVideoCapture)
            setFeaturePermission(securityOrigin, feature, QWebEnginePage::PermissionGrantedByUser);
        else
            setFeaturePermission(securityOrigin, feature, QWebEnginePage::PermissionDeniedByUser);
    }
};

QUrl commandLineUrlArgument()
{
    const QStringList args = QCoreApplication::arguments();
    for (const QString &arg : args.mid(1)) {
        if (!arg.startsWith(QLatin1Char('-')))
            return QUrl::fromUserInput(arg);
    }
    return QUrl(QStringLiteral("https://www.qt.io"));
}


int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc, argv);
    QWebEngineView view;
    view.setPage(new WebEnginePage);
    view.setUrl(commandLineUrlArgument());
    view.resize(1024, 750);
    view.show();

    return app.exec();
}

#include "main.moc"
person eyllanesc    schedule 16.03.2018
comment
При создании сигналов и слотов Qt создает файлы moc, которые обрабатывают эти соединения, когда вы создаете .ui, они создаются автоматически, но в случае с main.cpp вы должны включать его вручную, поэтому я должен сделать это в примере, проверьте http://doc.qt.io/qt-5/moc.html - person eyllanesc; 23.03.2018
comment
@LeeMelbourne Если мой ответ поможет вам, отметьте его как правильный. - person eyllanesc; 23.03.2018
comment
Спасибо большое. Когда я запускаю код, как опубликовано, я не получаю main.moc такого файла или каталога. Если я удалю эту строку, я получу неопределенную ссылку на vtable для webenginepage. Можете ли вы помочь с тем, что я могу делать неправильно? - person Lee Melbourne; 23.03.2018
comment
@LeeMelbourne В Qt Creator перейдите на вкладку build и нажмите опцию run qmake. - person eyllanesc; 23.03.2018
comment
Большой! Прекрасно работает. К сожалению, когда я захожу на такие сайты, как «meet.jit.si» или «appear.in», они все еще предлагают использовать камеру и микрофон. Но я думаю, что это происходит из уровня их веб-приложений, а не из браузера. Я не планирую иметь пользовательский интерфейс на Pi, поэтому мне нужно найти способ обойти это. - person Lee Melbourne; 23.03.2018
comment
Я запустил qmake, чтобы создать make-файл. Когда я запускаю make, я получаю рецепт для целевого объекта main.moc. Ошибка make: *** [main.moc] Error 127 - person Lee Melbourne; 01.04.2018
comment
@LeeMelbourne Вы используете консоль или Qt Creator? консоль: qmake && make. Если у вас все еще есть проблема с этой строкой, прокомментируйте ее. - person eyllanesc; 01.04.2018
comment
Использование консоли. Я следил за сообщением, которое я где-то нашел, в котором описывался процесс создания исполняемого файла, и он предлагал qmake создать make-файл, а затем make. Вместе бежать тоже не получится. Попробую прокомментировать... - person Lee Melbourne; 01.04.2018
comment
@LeeMelbourne У вас есть .pro? - person eyllanesc; 01.04.2018
comment
Да, есть файл проекта. После комментария я получаю Makefile:216: recipe for target 'main.o' failed make: *** [main.o] Error 1 - person Lee Melbourne; 01.04.2018
comment
@LeeMelbourne Через несколько минут я поделюсь проектом, загрузите его, с помощью консоли вы находитесь внутри проекта, затем вы выполняете qmake и, в конце концов, make - person eyllanesc; 01.04.2018
comment
@LeeMelbourne По следующей ссылке находится проект: github.com/eyllanesc/stackoverflow/tree/ master/49312744, найдите консоль в проекте и выполните: qmake && make - person eyllanesc; 01.04.2018
comment
Спасибо большое. Но я все равно получаю make: /usr/lib/x86_64-linux-gnu/qt4/bin/moc: команда не найдена Makefile:190: рецепт для целевого 'main.moc' не удалось сделать: *** [main.moc] Ошибка 127. Кажется, мне чего-то не хватает в моем окружении. Будет исследовать... - person Lee Melbourne; 01.04.2018
comment
@LeeMelbourne Из сообщения об ошибке вы заметили, что используете Qt4: /usr/lib/x86_64-linux-gnu/ qt4 /bin/moc, но код QWebEngineView существует для версий выше Qt 5.4, проверьте, установлен ли у вас qt5. Попробуйте с qmake-qt5 && make - person eyllanesc; 01.04.2018
comment
Спасибо @eyllanesc. Вместо того, чтобы продолжать поток, я создал здесь отдельную проблему: stackoverflow.com/questions/49596099/ - person Lee Melbourne; 01.04.2018