查看完整版本: [-- QT 实现jpg/png和mp3/aac编码合成mp4视频文件工具 --]

QTCN开发网 -> Qt 作品展 -> QT 实现jpg/png和mp3/aac编码合成mp4视频文件工具 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

xiaoke123 2021-01-27 16:50

QT 实现jpg/png和mp3/aac编码合成mp4视频文件工具

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

线程池最大2线程并发处理10个任务效果:
[attachment=22228]
线程池最大5线程并发处理10任务效果:
[attachment=22229]
预览合成视频效果:
[attachment=22227]

部分核心代码如下:
  1.     // 多线程并发合成视频
        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();
        */












nigoole 2021-01-29 15:06
  

xiaoke123 2021-01-29 16:31
nigoole:[表情]  [表情]  (2021-01-29 15:06) 

谢谢鼓励


查看完整版本: [-- QT 实现jpg/png和mp3/aac编码合成mp4视频文件工具 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled