每个主流平台基本都有自己的音视频开发库(API),用以处理音视频数据,比如:
但是有一个跨平台的库:FFmpeg 库。
其实只要你掌握了FFmpeg,也可以很快上手其他音视频开发库,因为底层原理都是一样的,你最终操作的都是一样的数据,比如MP3、MP4文件。
补充:openGL 是什么东西呢?
同理我们也选择可以 跨平台开发的 GUI 界面开发库,QT。
第一种方式:下载源码,将ffmpeg 的所有源码加入到我们的工程当中。(不推荐使用这种方法,因为源码太庞大了,并且里面有很多的代码我们是不需要的。)
下载地址:Download FFmpeg
第二种下载方式:下载库文件,我们将源码编译成 x86、arm 等等平台的动态库。
1、我们目前是新手,可能编译会不通过。
2、所以我们直接使用别人编译好的动态链接库。(官网就有提供编译好的动态库,体积大一点)
3、等我们技术达到之后,可以自己对源码进行裁剪,然后编译出属于自己的动态库。
第一个链接:(我是使用这个链接进行下载)
shared:exe应用程序和动态库放到了一起。(所以 exe 的大小小一点)
没有shared:静态编译,体积很大。
!!! 一定要注意:从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
需要先注册,再进行登录。
先注册,再登录
下一步
选择安装路径
勾选MinGW 64bit编译器(我电脑的系统是64bit)。
勾选编译器
如果后期想阅读Qt源码,就选择勾选Qt源码。
勾选源码
默认已经勾选了QtCreator。
默认已经勾选QtCreator
许可协议
开始菜单快捷方式
解决中文乱码的问题
工具 -> 选项。
文本编辑器 -> 行为 -> 文本编码 -> 默认编码。
设置为UTF-8
新建一个有界面的应用程序。
设为默认的路径
qmake就是Mingw的编译系统。
这个不用管,一些基本的配置。(自动帮忙创建一个 MainWindow 的一个类)
选择使用 MinGW 的编译器,
在Windows中,我们最终是通过调用FFmpeg动态库(dll)中的函数来操作音视频数据,使用dll的其中一种方式是需要用到3种文件:
.h:头文件(Header File)
.dll :动态链接库(Dynamic Link Library)
.lib
或 .dll.a
:(动态链接库的)导入库(Import Library)
值得一提的是,在Windows中,静态链接库(Static Link Library)的扩展名也是.lib、.dll.a。静态链接库和导入库的区别是:
exe在寻找dll文件时,大概按照以下优先级顺序去查找(这里只列出了大概的搜索路径,并没有写全):
Windows的System目录
C:/Windows/System
C:/Windows/System32
Windows目录
C:/Windows
环境变量Path中的路径
%FFMPEG_HOME%/bin
目录配置到 Path
变量中第1种方式需要在每一个Qt程序中都拷贝一份FFmpeg的dll文件。
第2~4种方式可以让多个Qt程序共用同一份FFmpeg的dll文件。
与上一个配置环境变量的作用不同,这个是指导 程序的链接过程,是否能找到对应的动态库。
.pro
文件是Qt项目的主配置文件。(相当于 linux 当中的 makefile
文件,用来指导编译)
# 包含了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 的库函数
INCLUDEPATH
、LIBS
、是 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:设置需要链接的导入库名称
libavcodec.dll.a
就写成 avcodec
!!!:有 4 种方式来进行 dll 文件配置。(放到 xxx.exe
程序目录下面、放在windows 默认的搜寻路径下面,修改环境变量的值)
Qt程序编译成功后,会生成一个exe文件
为了保证exe在运行时能成功调用FFmpeg的函数,那么就得让 exe 能够找到 FFmpeg的dll文件(动态库文件)。可以将 FFMPEG_HOME/bin
目录中的所有dll文件拷贝到exe文件所在的目录中,exe在运行的时候,能自动找到跟它同一目录下的dll文件。
运行程序后,如果能在控制台看到4.3.2字样的输出信息,说明FFmpeg已经集成成功。
#include "mainwindow.h"
#include
#include // 利用打印函数
// ffmpeg 是纯 C 语言的代码,在 C++ 当中不能直接进行 include
extern "C" {
#include
}
int main(int argc, char *argv[])
{
qDebug() << "yeahhh"<< av_version_info();
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
(0)当我们创建一个项目的时候,会发生什么?
当我们编译一个程序的时候会发生什么?
(1)程序运行会弹出一个窗口,那么窗口来自于哪里呢?(来自于这个 ui 文件)
单击ui文件,就会出现整个页面的布局。
(2)mainwindow.h 和 mainwindow.cpp 两个文件