开发环境搭建

1、开发库的选择

(1)音视频开发库

每个主流平台基本都有自己的音视频开发库(API),用以处理音视频数据,比如:

  • iOS:AVFoundationAudioUnit
  • Android:MediaPlayerMediaCodec
  • Windows:DirectShow

但是有一个跨平台的库:FFmpeg 库。

其实只要你掌握了FFmpeg,也可以很快上手其他音视频开发库,因为底层原理都是一样的,你最终操作的都是一样的数据,比如MP3、MP4文件。


补充:openGL 是什么东西呢?

  • openGL 是一个 画图 的库

(2)GUI 界面开发库

同理我们也选择可以 跨平台开发的 GUI 界面开发库,QT

  • Windows:MFC

2、下载安装环境

(1)安装 ffmpeg

第一种方式:下载源码,将ffmpeg 的所有源码加入到我们的工程当中。(不推荐使用这种方法,因为源码太庞大了,并且里面有很多的代码我们是不需要的。)

下载地址:Download FFmpeg

  • snapshot:快照版,不是正式版本。
  • releases:发布版,就是正式版本,我们可以点击 release。
    image-20210812133649637
    在这里插入图片描述

第二种下载方式:下载库文件,我们将源码编译成 x86、arm 等等平台的动态库

1、我们目前是新手,可能编译会不通过
2、所以我们直接使用别人编译好的动态链接库。(官网就有提供编译好的动态库,体积大一点)
3、等我们技术达到之后,可以自己对源码进行裁剪,然后编译出属于自己的动态库

在这里插入图片描述
第一个链接:(我是使用这个链接进行下载)
在这里插入图片描述

  • 7z 、zip:压缩算法不同,压缩大小不同而已。里面的内容一样。
  • essentials:必要的组件,东西可能不全。
  • full:全面的,里面的库文件比较全。
  • shared:有动态链接库。(我们选取这一个)
    在这里插入图片描述

第二个链接:(我没有使用这个)
在这里插入图片描述

  • shared :代表里面的应用程序:ffmpeg、ffplay、ffprobe 使用的动态链接库。
  • 没有带 shared 后缀:说明不是使用动态链接库。
  • gpl、lgpl:代表不同的开源协议。

shared:exe应用程序和动态库放到了一起。(所以 exe 的大小小一点)
在这里插入图片描述
没有shared:静态编译,体积很大。
在这里插入图片描述


(2)安装 QT

!!! 一定要注意:从5.15版本开始是收费版本,我们下载 5.14.2

下载地址:https://download.qt.io/archive/qt/5.14/5.14.2/
Windows系统选择下载:qt-opensource-windows-x86-5.14.2.exe

在这里插入图片描述

Next

Next

需要先注册,再进行登录。

先注册,再登录

先注册,再登录

下一步
下一步
下一步

下一步

选择安装路径

选择安装路径

勾选MinGW 64bit编译器(我电脑的系统是64bit)。

勾选编译器

勾选编译器

如果后期想阅读Qt源码,就选择勾选Qt源码。

勾选源码

勾选源码

默认已经勾选了QtCreator。

默认已经勾选QtCreator

默认已经勾选QtCreator

许可协议

许可协议

开始菜单快捷方式

开始菜单快捷方式

安装


解决中文乱码的问题
工具 -> 选项。

img

文本编辑器 -> 行为 -> 文本编码 -> 默认编码。

设置为UTF-8

设置为UTF-8

(3)新建一个 qt 项目

新建一个有界面的应用程序。
在这里插入图片描述
设为默认的路径
在这里插入图片描述
qmake就是Mingw的编译系统。
在这里插入图片描述
这个不用管,一些基本的配置。(自动帮忙创建一个 MainWindow 的一个类)
在这里插入图片描述
在这里插入图片描述
选择使用 MinGW 的编译器,
在这里插入图片描述
在这里插入图片描述


3、将 ffmpeg 的功能集成到 QT 项目当中

在Windows中,我们最终是通过调用FFmpeg动态库(dll)中的函数来操作音视频数据,使用dll的其中一种方式是需要用到3种文件:

  • .h:头文件(Header File)

    • 包含了函数的声明
    • 通过*#include*去导入相应的头文件
  • .dll :动态链接库(Dynamic Link Library)

    • 包含了函数的具体实现代码
    • Windows程序会在运行过程中,动态调用dll中的函数
  • .lib.dll.a:(动态链接库的)导入库(Import Library)

    • .lib:用于MSVC编译器中(微软 编译器)
    • .dll.a:用于MinGW编译器中(g++ 编译器)
    • 包含了dll中函数的入口,用于辅助找到并调用dll中的函数,里面只存放索引信息。最终需要链接到Windows程序中(比如合并到exe文件中)
    • 本质:!!!! 是一个静态库文件,这一部分是要放到 exe 文件当中去。然后指引 exe 程序去寻找 dll 文件当中的函数体。

值得一提的是,在Windows中,静态链接库(Static Link Library)的扩展名也是.lib、.dll.a。静态链接库和导入库的区别是:

  • 静态链接库:包含了函数的具体实现代码
  • 导入库:不包含函数的具体实现代码(函数的具体实现代码存储在dll中)

在这里插入图片描述


(0)dll的搜索顺序(exe运行的时候)

  • 指导 windows 程序运行的时候,是否可以找到对应的动态链接库。

exe在寻找dll文件时,大概按照以下优先级顺序去查找(这里只列出了大概的搜索路径,并没有写全):

  1. xxx.exe 自己所在的目录
    在这里插入图片描述

  2. Windows的System目录

    • C:/Windows/System
    • C:/Windows/System32
  3. Windows目录

    • C:/Windows
  4. 环境变量Path中的路径

    • 所以可以考虑将 %FFMPEG_HOME%/bin 目录配置到 Path 变量中
    • 置于如何配置Windows的环境变量Path,这是基本开发常识了,就不再讲解了
      在这里插入图片描述

第1种方式需要在每一个Qt程序中都拷贝一份FFmpeg的dll文件。

第2~4种方式可以让多个Qt程序共用同一份FFmpeg的dll文件。


(2).pro文件( exe 编译的时候)

与上一个配置环境变量的作用不同,这个是指导 程序的链接过程,是否能找到对应的动态库。

.pro 文件是Qt项目的主配置文件。(相当于 linux 当中的 makefile 文件,用来指导编译)

image-20211020171747176

# 包含了core、gui两个模块
QT       += core gui

# 高于4版本,就包含widgets模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

# 源代码
SOURCES += \
    main.cpp \
    mainwindow.cpp

# 头文件
HEADERS += \
    mainwindow.h

# ui文件
FORMS += \
    mainwindow.ui

修该 .pro 文件,以便于我们的项目支持 ffmpeg 的库函数

  • 这个 .pro 文件的配置,是指导程序编译的时候,可以找到对应的动态库。之前配置的环境变量,是指导 windows 运行程序的时候,可以找到对应的动态库。
  • INCLUDEPATHLIBS、是 QT 内部自己定义的环境变量。用来存放头文件路径、库文件路径。
  • FFMPEG_HOME :我们自己定义的变量,用来标记我们的主目录。
win32: {
    FFMPEG_HOME=D:\SF\ffmpeg\MJ\ffmpeg-4.3.2-2021-02-27-full_build-shared
    #设置 ffmpeg 的头文件
    INCLUDEPATH += $$FFMPEG_HOME/include

    #设置导入库的目录一边程序可以找到导入库
    # -L :指定导入库的目录
    # -l :指定要导入的 库名称
    LIBS +=  -L$$FFMPEG_HOME/lib \
             -lavcodec \
             -lavdevice \
             -lavfilter \
            -lavformat \
            -lavutil \
            -lpostproc \
            -lswresample \
            -lswscale
}
  • # 号后面的内容是注释

  • $$FFMPEG_HOME 表示对环境变量值的引用,相当于原地展开。

  • -L:设置导入库的目录,以便编译器能够找到导入库。(exe 程序编译的时候只需要包含 xxx.dll.a 静态导入库,运行的时候才需要 xxx.dll 文件)

  • -l:设置需要链接的导入库名称

    • 导入库名称需要去掉文件名前面的lib,比如 libavcodec.dll.a 就写成 avcodec

(3)配置对应的 dll 文件

!!!:有 4 种方式来进行 dll 文件配置。(放到 xxx.exe 程序目录下面、放在windows 默认的搜寻路径下面,修改环境变量的值)

Qt程序编译成功后,会生成一个exe文件

  • exe是Windows中的一种可执行文件,类似于下载的 ffmpeg.exe、ffplay.exe 程序。
  • 我们编写的程序代码最终都存在了exe文件中

为了保证exe在运行时能成功调用FFmpeg的函数,那么就得让 exe 能够找到 FFmpeg的dll文件(动态库文件)。可以将 FFMPEG_HOME/bin 目录中的所有dll文件拷贝到exe文件所在的目录中,exe在运行的时候,能自动找到跟它同一目录下的dll文件。

img
可以通过查看构建目录得知exe文件所在的目录
img

运行程序后,如果能在控制台看到4.3.2字样的输出信息,说明FFmpeg已经集成成功。

img


(4)使用 ffmpeg API

  • 打印 av_version_info 的版本:
#include "mainwindow.h"
#include <QApplication>
#include <QDebug>   // 利用打印函数

// ffmpeg 是纯 C 语言的代码,在 C++ 当中不能直接进行 include
extern "C" {
#include <libavcodec/avcodec.h>
}

int main(int argc, char *argv[])
{
    qDebug() << "yeahhh"<< av_version_info();

    QApplication a(argc, argv);
    MainWindow w;

    w.show();

    return a.exec();
}

在这里插入图片描述


4、补充

1、简单分析 qt 项目

(0)当我们创建一个项目的时候,会发生什么?

  • qtcreate 会帮我们将文件进行分类。
  • xxx.pro 文件,双击我们可以直接打开所建立的 QT 工程。
    在这里插入图片描述

当我们编译一个程序的时候会发生什么?

  • 产生 .exe 文件、.o 文件
    在这里插入图片描述
    在这里插入图片描述

(1)程序运行会弹出一个窗口,那么窗口来自于哪里呢?(来自于这个 ui 文件)
在这里插入图片描述
单击ui文件,就会出现整个页面的布局。
在这里插入图片描述
(2)mainwindow.h 和 mainwindow.cpp 两个文件

  • mainwindow.h 当中实现类的声明
  • mainwindow.cpp 当中实现对应的函数体在这里插入图片描述
    在这里插入图片描述
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐