我想使用 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?#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();
}
#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();
}
#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/