2015-05-20 25 views
2

Здесь я хочу сделать рекордер 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?? 
} 

Там есть некоторые идеи для меня?

или, есть другие решения для моего регистратора?

+0

'про-> убить()' должен работать. Как вы знаете, что процесс не остановился, он все еще работает в диспетчере задач? – cmannett85

+0

@ cmannett85 en ... 'pro-kill()' сделает «Нет ответа» для моего графического интерфейса. И, как ваши слова, процесс GUI был закрыт, но ffmpeg.exe все еще работает, мне нужно убить ffmpeg.exe в диспетчере задач. Er ... Есть ли способ отправить сигнал в процесс (когда я нажимаю ESC в cmd.exe), что может привести к завершению процесса ffmpeg.exe? – xiaowei

+0

Фактически согласно docs 'execute()' является статическим членом этого класса, поэтому его следует, вероятно, вызывать с помощью 'pro :: execute()'. Я где-то читал, что это может вызвать проблемы. – Nadarian

ответ

1

Следующая работает нормально для меня:

#include <QTimer> 
#include <signal.h> 
[...] 
int thisPid = pro->pid(); 

kill(thisPid, SIGINT); 
QTimer::singleShot(2000, pro, SLOT(tryTerminate())); 
QTimer::singleShot(5000, pro, SLOT(kill())); 

Это сначала получить идентификатор процесса процесса, а затем

  1. Отправить сигнал прерывания процесса (если вы под окнами вам необходимо будет отрегулировать эту часть)
  2. подключает таймер однократного запуска для выполнения tryTerminate через 2 секунды
  3. подключает таймер с одним выстрелом для выполнения a kill через 5 секунд.

Позвольте мне знать, если это помогает

Смежные вопросы