Здесь я хочу сделать рекордер ffmpeg.exe.Как заставить QProcess останавливаться на кнопке или клавиатуре в графическом интерфейсе?
И я нашел строку благодарности, преуспел в запуске и сгенерировал видеофайл. И я знаю, что нажимает «Esc» или «q» на клавиатуре. Терминал
Теперь я хочу использовать графический интерфейс для управления рекодером (ffmpeg.exe). Здесь я выбираю Qt, а моей рабочей средой является Windows 7 sp1.
Я использую QProcess для его выполнения, вы увидите следующее.
Но я понятия не имею, для терминального процесса.
Кодовый список: main.cpp является простым.
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QProcess>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
QProcess *pro;
QString recorder;
QString outputName;
QString options;
private slots:
void startRecode();
void stopRecode();
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include <QProcess>
#include <QTest>
#include <QPushButton>
#include <QVBoxLayout>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
pro(new QProcess)
{
QDateTime current_date_time = QDateTime::currentDateTime();
QString current_date = current_date_time.toString("yyyy-MM-dd-hh_mm_ss");
recorder = "E:\\bin\\ffmpeg.exe";
outputName = current_date + ".mp4";
options = "-f gdigrab -framerate 6 -i desktop -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -hide_banner -report";
//-t 00:00:05"; this option can limit the process running time, and work well no GUI, but I don't want to use given time to stop recording.
QWidget *centerWindow = new QWidget;
setCentralWidget(centerWindow);
QVBoxLayout *mainLayout = new QVBoxLayout;
QPushButton *startButton = new QPushButton("start recording");
QPushButton *stopButton = new QPushButton("stop recording");
mainLayout->addWidget(startButton);
mainLayout->addWidget(stopButton);
centerWindow->setLayout(mainLayout);
connect(startButton, SIGNAL(clicked()), this, SLOT(startRecode()));
connect(stopButton, SIGNAL(clicked()), this, SLOT(stopRecode()));
}
MainWindow::~MainWindow()
{
delete pro;
}
void MainWindow::startRecode()
{
pro->execute(QString(recorder + " " +options +" " + outputName));
}
void MainWindow::stopRecode(){
pro->terminate(); // not work
//pro->close(); // not work, too
//pro->kill(); // not work, T_T
//how to terminate the process by pushbutton??
}
Там есть некоторые идеи для меня?
или, есть другие решения для моего регистратора?
'про-> убить()' должен работать. Как вы знаете, что процесс не остановился, он все еще работает в диспетчере задач? – cmannett85
@ cmannett85 en ... 'pro-kill()' сделает «Нет ответа» для моего графического интерфейса. И, как ваши слова, процесс GUI был закрыт, но ffmpeg.exe все еще работает, мне нужно убить ffmpeg.exe в диспетчере задач. Er ... Есть ли способ отправить сигнал в процесс (когда я нажимаю ESC в cmd.exe), что может привести к завершению процесса ffmpeg.exe? – xiaowei
Фактически согласно docs 'execute()' является статическим членом этого класса, поэтому его следует, вероятно, вызывать с помощью 'pro :: execute()'. Я где-то читал, что это может вызвать проблемы. – Nadarian