由于项目需要使用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)