【问题标题】:How can I record a window using ffmpeg by id?如何通过 id 使用 ffmpeg 记录窗口?
【发布时间】:2020-10-20 06:56:20
【问题描述】:

我想用c++或者qml通过名字获取窗口的id,并在ffmpeg中用这个id记录具体的屏幕。

ffmpeg -f x11grab -wid 0x6200012 -s 1920x1052 -r 30 -i :0.0+0,0

我该怎么做?

id不一定是id,可以是offset-x和offset-y,我只想在任意位置记录窗口。

【问题讨论】:

  • 无法测试,但ffmpeg -f x11grab -x 200 -y 100 -video_size 1920x1052 -framerate 30 -i :0.0+0,0 应该可以工作。
  • 我认为这对我不起作用,因为标志 -i :0.0+0,0 开始抓取屏幕的位置 x=0 和 y=0,我想记录屏幕在任何位置。

标签: qt c++11 ffmpeg qml


【解决方案1】:

我没有看到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();
}

【讨论】:

  • ffmpeg 可以做同样的事情吗?
【解决方案2】:

我发现了以下内容:

ffmpeg -y -s 800x600 -f x11grab -window_id 0x3200008 -framerate 30 -i :11.0+0,0 -c:v libx264 -preset ultrafast -crf 40 output_select_window.mp4

非常重要的解释:

-window_id = 'xwininfo' shows window_id if you select a window
-i :11.0+0,0 = 11 means and from in shell with `$echo $Display`.

【讨论】:

    猜你喜欢
    • 2014-10-13
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    相关资源
    最近更新 更多