qt - 如何通过 id 使用 ffmpeg 记录窗口?

标签 qt c++11 ffmpeg qml

我想使用 c++ 或 qml 按名称获取窗口的 id,并在 ffmpeg 中使用此 id 记录特定屏幕。

ffmpeg -f x11grab -wid 0x6200012 -s 1920x1052 -r 30 -i :0.0+0,0
我怎样才能做到这一点?
不需要是id,可以是offset-x和offset-y,我只想在任意位置记录窗口。

最佳答案

我没有看到 x11grab可以通过ID记录一些屏幕为this answer表明答案指出一种选择是使用 GStreamer:

gst-launch-1.0 ximagesrc xid=0x04000007 ! videoconvert ! autovideosink
如何在 Qt 中获取窗口 ID?
  • 如果 QQmlApplicationEngine 与 Window 或 ApplicationWindow 一起使用:
    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    #include <QWindow>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    
        QGuiApplication app(argc, argv);
    
        QQmlApplicationEngine engine;
        const QUrl url(QStringLiteral("qrc:/main.qml"));
        QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                         &app, [url, &engine](QObject *obj, const QUrl &objUrl) {
            if (!obj && url == objUrl)
                QCoreApplication::exit(-1);
            if(QWindow *w = qobject_cast<QWindow *>(engine.rootObjects().first())){
                qDebug() << w->winId();
            }
        }, Qt::QueuedConnection);
        engine.load(url);
    
        return app.exec();
    }
    
  • 使用 QQuickView
    #include <QGuiApplication>
    #include <QQuickView>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    
        QGuiApplication app(argc, argv);
    
        QQuickView view;
    
        const QUrl url(QStringLiteral("qrc:/main.qml"));
        view.setSource(url);
        view.show();
        qDebug() << view.winId();
        return app.exec();
    }
    
  • Qt 小部件:
  • #include "mainwindow.h"
    
    #include <QApplication>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        qDebug() << w.winId();
        return a.exec();
    }
    
    或者一般来说,您应该访问 QWindow 并获取窗口 ID:
    for(QWindow *w : QGuiApplication::allWindows()){
        qDebug() << w->winId();
    }
    

    关于qt - 如何通过 id 使用 ffmpeg 记录窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62649524/

    相关文章:

    c++ - 我似乎无法在 qt creator 中打印几行数据。程序覆盖除最后一行以外的所有输出

    python - PySide 中缺少 QtGui.QIdentityProxyModel?

    c++ - 使 mongo-cxx-driver 找不到包括

    c++ - 从 std::vector<glm::vec3> 获取一个 float 类型的数组指针

    c++ - 共享从属对象

    c++ - Qt 将主窗口拆分为四个小部件

    python - QWebview 的 Dymo 标签打印机?

    ffmpeg - 可以更改 ffmpeg 中的进度输出间隔吗?

    PHP 忽略我的 max_execution_time

    node.js - Docker 容器中的 Ffmpeg 错误 : ffmpeg exited with code 1: