qt 使用QProcess调用控制台命令

本文介绍了一种使用Qt与FFmpeg将图片序列合成为视频的方法。通过调用FFmpeg的控制台版本,而非C++代码,简化了图片合成视频的过程。示例代码展示了如何设置输入路径、输出路径、帧率等参数,并通过Qt信号和槽机制处理FFmpeg的输出。
摘要由CSDN通过智能技术生成

由于项目需要使用ffmpeg进行实现图片合成视频,本来打算使用c++版本的ffmpeg代码进行实现,奈何代码看都看不懂,时间赶的紧,于是决定直接调用控制台版本的,代码如下,非常简单:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QMessageBox>

#include <QTime>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QTime time;
       time.start();
      po = new QProcess(this);

//处理完成事件
    connect(po,SIGNAL(readyRead()),this,SLOT(handle_ok()));
 //读取控制台输出
    connect(po , SIGNAL(readyReadStandardOutput()) , this , SLOT(on_readoutput()));
    //读取控制台输出错误
    connect(po , SIGNAL(readyReadStandardError()) , this , SLOT(on_readerror()));

//开始运行事件
    connect(po,SIGNAL(started()),SLOT(handle_start()));
      QString input_path = "/home/wenshuai/桌面/out/%12d.jpg";
      QString output_path="/home/wenshuai/桌面/test.flv";
      QString threads="1";
      QString rate="25";
        QString program = "ffmpeg";
        QStringList argu;
        argu.append("-y");
        argu.append("-r");
        argu.append(rate);
        argu.append("-threads");
        argu.append(threads);
        argu.append("-i");
        argu.append(input_path);
        argu.append("-vcodec");
        argu.append("libx264");
        argu.append(output_path);
        po->start(program,argu);
        po->waitForFinished(-1);

            qDebug() << "Using " << time.elapsed();
}
void MainWindow::handle_ok()
{

    qDebug()<<"start";
}
void MainWindow::on_readoutput()
{
   //ui->textEdit->append(po->readAllStandardOutput().data());   //将输出信息读取到编辑框
}
void MainWindow::on_readerror()
{
   ui->textEdit->setText(po->readAllStandardError().data());    //弹出信息框提示错误信息
}
void MainWindow::handle_start()
{
    qDebug()<<"handle start";
}
MainWindow::~MainWindow()
{
    delete ui;
}

启动外部程序使用的是start函数,当我们使用这个函数之后,外部的进程启动,程序开始运行,这时候它和调用它的线程(一般是我们的GUI线程)之间就分离了,二者再无任何关系,即使这时候关闭了我们的程序,外部的程序还是会自己运行直到处理任务结束。有时候这并不是我们需要的,我们想让主线程等待这个处理工具处理结束,这个时候可以在start之后调用一个等待的函数:

bool QProcess::waitForFinished(int msecs = 30000)

这里面msecs函数是等待结束的时间(单位是毫秒),如果设置为-1,那么启用外部程序的这个线程会等待外部工具运行完成。这个时候如果是GUI线程,那么画面会假死。

bool QProcess::waitForFinished(-1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值