项目实战——Qt实现FFmpeg音视频转码器(一)

简介: 项目实战——Qt实现FFmpeg音视频转码器(一)

前言

本文记录使用 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

目录
相关文章
|
6天前
|
编解码
项目实战——Qt实现FFmpeg音视频转码器(二)
项目实战——Qt实现FFmpeg音视频转码器(二)
44 0
|
6天前
ffmpeg 命令提取音视频数据-ffmpeg导出h265裸流-ffmpeg导出h264裸流
ffmpeg 命令提取音视频数据-ffmpeg导出h265裸流-ffmpeg导出h264裸流
77 0
|
3天前
|
存储 缓存 调度
FFmpeg开发笔记(十九)FFmpeg开启两个线程分别解码音视频
《FFmpeg开发实战》第10章示例playsync.c在处理音频流和视频流交错的文件时能实现同步播放,但对于分开存储的格式,会出现先播放全部声音再快速播放视频的问题。为解决此问题,需改造程序,增加音频处理线程和队列,以及相关锁,先将音视频帧读入缓存,再按时间戳播放。改造包括声明新变量、初始化线程和锁、修改数据包处理方式等。代码修改后在playsync2.c中,编译运行成功,控制台显示日志,SDL窗口播放视频并同步音频,证明改造有效。
11 0
FFmpeg开发笔记(十九)FFmpeg开启两个线程分别解码音视频
|
6天前
|
编解码 安全 计算机视觉
FFMPEG常用命令 音视频合并
FFMPEG常用命令 音视频合并
11 2
|
6天前
|
存储 编解码 缓存
ffmpeg音视频同步
ffmpeg音视频同步
14 0
|
6天前
|
Web App开发 编解码 vr&ar
使用FFmpeg从音视频处理到流媒体技术的探索和实战应用
使用FFmpeg从音视频处理到流媒体技术的探索和实战应用
49 2
|
6天前
|
编解码 API 开发工具
FFmpeg获取音视频流信息
FFmpeg获取音视频流信息
13 1
FFmpeg获取音视频流信息
|
6天前
|
存储 编解码 算法
【ffmpeg音视频同步】解决ffmpeg音视频中多线程之间的数据同步问题
【ffmpeg音视频同步】解决ffmpeg音视频中多线程之间的数据同步问题
55 2
|
6天前
|
存储 缓存 算法
ffmpeg 音视频同步进阶 剖析:ffmpeg音视频同步中特殊情况处理策略
ffmpeg 音视频同步进阶 剖析:ffmpeg音视频同步中特殊情况处理策略
44 0
|
6天前
|
存储 算法 前端开发
深入理解FFmpeg音视频编程:处理封装、解码、播放 队列与回放策略
深入理解FFmpeg音视频编程:处理封装、解码、播放 队列与回放策略
38 0

推荐镜像

更多