前言
本文记录使用 Qt 实现 FFmepg 音视频转码器项目的开发过程。
一、移植 FFmpeg 相关文件
1、首先创建一个 Qt 项目,选择 MSVC2017 32bit 作为其编译器
2、将 FFmpeg 相关库及源文件拷贝到当前目录下
3、注释 prepare_app_arguments 函数(这里方便后面我们运行时可以指定相应的转码参数)
4、将所需的一些 dll 动态库文件拷贝到 debug 目录下
5、将音视频素材文件拷贝到 build-QtVideoConverterFFmpeg431-Desktop_Qt_5_14_2_MinGW_32_bit-Debug
目录下(点击运行自动生成的目录)
二、绘制 ui 界面
绘制一个简单的 ui 界面,效果如下:
里面包括 Frame、Push Button、Progress Bar、Label、Table Widget、Combo Box、Line Edit 等相关控件。
三、实现简单的转码
1、在开始转码按键的 clicked 槽函数加入以下代码:
void Widget::on_pushButton_Running_clicked() { qDebug() << "hello,ffmpeg"; QString currentPath = QDir::current().path(); qDebug() << "Current path:" << currentPath; char* arrParams[10] = { 0 }; for (int k = 0; k < 10; k++) { arrParams[k] = new char[64](); } strcpy(arrParams[0], "QtVideoConverter.exe"); strcpy(arrParams[1], "-i"); strcpy(arrParams[2], "SampleVideo_1280x720_20mb.mp4"); strcpy(arrParams[3], "-vcodec"); strcpy(arrParams[4], "libx264"); strcpy(arrParams[5], "-acodec"); strcpy(arrParams[6], "copy"); strcpy(arrParams[7], "-y"); strcpy(arrParams[8], "SampleVideo_1280x720_20mb.flv"); main_ffmpeg431(9, arrParams); AVGeneralMediaInfo* avmi = new AVGeneralMediaInfo(); for (int k = 0; k < 10; k++) { delete[] arrParams[k]; avmi = NULL; } }
2、点击运行,可以看到如下的界面
目前进度条功能还未实现,点击转码可以在 build-QtVideoConverter-Desktop_Qt_5_14_2_MSVC2017_32bit-Debug
目录下看到转码成功的 flv 文件
四、功能优化
1、控件布局及美化
Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); this->setStyleSheet("background-color:#F0F0F0;"); // 设置组件窗口的外观 // qss,类似于css ui->lblLogoText->setStyleSheet("color:#009100;font-style:italic;font-weight:bold;font-size:30px;"); // frame 背景色 ui->frameTop->setStyleSheet("background-color:#C4E1FF;"); // 按钮背景色 ui->pushButton_Running->setStyleSheet("background-color:#C4E1FF;font-weight:bold;font-size:30px;color:#009100;border:2px groove gray;border-radius:10px;padding:2px 4px;"); } // 隐藏栅格线、单元格不可编辑 ui->tableWidget_FileList->verticalHeader()->setHidden(true); // 设置行名隐藏(注意是行名,不是整行) ui->tableWidget_FileList->setShowGrid(false); // 控制视图中数据项之间是否显示网格 ui->tableWidget_FileList->setEditTriggers(QAbstractItemView::NoEditTriggers); // 让这个表格对用户只读
效果如下:
2、缩放界面
事件过滤器:(双击,全屏)
// 事件过滤器:(双击,全屏) bool Widget::eventFilter(QObject *obj, QEvent *event) { // 指定某个控件 if (obj == ui->frameTop || obj == ui->lblLogoText || obj == ui->lblLogoImage) { // QEvent::MouseButtonPress,QEvent::MouseButtonDblClick if (event->type() == QEvent::MouseButtonDblClick) { QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); if (mouseEvent->button() == Qt::LeftButton) { // QMessageBox::information(this, "点击", "点击了我", QMessageBox::Yes | QMessageBox::No | QMessageBox::Yes); if (!this->isMaximized()) { this->showMaximized(); } else { this->showNormal(); } return true; } else { return false; } } else { return false; } } else { // pass the event on to the parent class return Widget::eventFilter(obj, event); } }
效果:
ESC 键退出全屏
// 按键:(esc--退出全屏) void Widget::keyPressEvent(QKeyEvent *event) { switch (event->key()) { case Qt::Key_Escape: if (this->isMaximized()) { this->showNormal(); } break; default: QWidget::keyPressEvent(event); } }
项目实战——Qt实现FFmpeg音视频转码器(二)https://developer.aliyun.com/article/1474014