实现的基本功能:
1.支持单
线程按顺序
执行多任务
2.支持线程池
多线程并发执行任务
3.支持
文件类型、文件图标判断
4.支持
图片(jpg/png)和音频(mp3/aac)ffmpeg合成mp4文件
5.支持
视频文件预览播放(ffmpeg解码)
6.支持简单编码参数选择,如:帧率、分辨率、编码
格式7.同时支持ffmpeg命令行方式或ffmpeg API方式调用
线程池最大2线程并发处理10个任务效果:

线程池最大5线程并发处理10任务效果:

预览合成视频效果:
部分核心代码如下:
- // 多线程并发合成视频
- QString fileName,picName,mp4Name,spath;
- QString command;
- // 设置线程数和超时
- qDebug() <<"CPU核心数 QThreadmax: "<<QThread::idealThreadCount();
- QThreadPool::globalInstance()->setMaxThreadCount(QThread::idealThreadCount());
- QThreadPool::globalInstance()->setExpiryTimeout(-1);
- for(int i=0;i<m_Tasks.count();i++)
- {
- RunnableTask* worker;
- if(m_Tasks[i].sFileName.contains(".mp3")||m_Tasks[i].sFileName.contains(".aac"))
- {
- int first = m_Tasks[i].sFileName.lastIndexOf ("/");
- fileName = m_Tasks[i].sFileName.right (m_Tasks[i].sFileName.length ()-first-1);
- fileName = fileName.left(fileName.length ()-fileName.lastIndexOf (".")+1);
- spath = m_Tasks[i].sFileName.left(first);
- int pos = m_Tasks[i].sFileName.lastIndexOf (".");
- picName = m_Tasks[i].sFileName.left(pos)+".jpg";
- mp4Name = spath+"/output/"+fileName+".mp4";
- qDebug() <<"xiaoke---------- file full path:"
- <<fileName<<"\n"<<spath<<"\n"<<picName<<"\n"<<mp4Name;
- // 组ffmpeg命令
- command = QString("./ffmpeg -loop 1 -i %1 -i %2 -vcodec %3 -s %4 -pix_fmt yuvj420p -r %5 %6 %7")
- .arg(picName) // 图片
- .arg(m_Tasks[i].sFileName) // 音频
- .arg(ui->comboBox_format->currentText()) // 编码格式
- .arg(ui->comboBox_resolution->currentText())// 分辨率
- .arg(ui->comboBox_rate->currentText()) // 帧率
- .arg("-shortest") // 音频长度 用参数"-shortest" 不需要设音频长度
- .arg(mp4Name); // 输出文件
- qDebug() <<"xiaoke---------- command:"<<command;
- m_Tasks[i].sCommand = command;
- m_Tasks[i].sOutput = mp4Name;
- worker = new RunnableTask(m_Tasks[i].cProBar,command);
- }
- else
- worker = new RunnableTask(m_Tasks[i].cProBar);
- connect(worker, &RunnableTask::taskFinished,[=](QProgressBar* s)
- {
- // 完成一个视频文件合成
- qDebug() <<"taskFinished"<<s;
- m_Tasks[i].sStatus= "done";
- });
- m_Tasks[i].worker = worker;
- QThreadPool::globalInstance()->start(worker);
- }
- // 启动定时器判断线程池所有的tasks执行完毕
- tasksCode = new QTimer(this);
- tasksCode->setInterval(100);
- connect(tasksCode, SIGNAL(timeout()), this, SLOT(tasksFinished()));
- tasksCode->start();
- /* 定时器
- QTimer *timer = new QTimer(this);
- timer->setInterval(1000);
- connect(timer, &QTimer::timeout, [&]
- {
- if(QThreadPool::globalInstance()->waitForDone(100))
- {
- timer->stop();
- qDebug() <<"QThreadPool taskFinished";
- writefile();
- on_Btn_play_clicked();
- }
- });
- timer->start();
- */