1、开发库的选择
(1)音视频开发库
每个主流平台基本都有自己的音视频开发库(API),用以处理音视频数据,比如:
iOS:AVFoundation、AudioUnit 等
Android:MediaPlayer、MediaCodec 等
Windows:DirectShow 等
但是有一个跨平台的库:FFmpeg 库。
其实只要你掌握了FFmpeg,也可以很快上手其他音视频开发库,因为底层原理都是一样的,你最终操作的都是一样的数据,比如MP3、MP4文件。
2)GUI 界面开发库
同理我们也选择可以 跨平台开发的 GUI 界面开发库,QT。
- Windows:MFC
2、下载安装环境
(1)安装 ffmpeg
第一种方式:下载源码,将ffmpeg 的所有源码加入到我们的工程当中。(不推荐使用这种方法,因为源码太庞大了,并且里面有很多的代码我们是不需要的。)
下载地址:Download FFmpeg
snapshot:快照版,不是正式版本。
releases:发布版,就是正式版本,我们可以点击 release。
1、我们目前是新手,可能编译会不通过。
2、所以我们直接使用别人编译好的动态链接库。(官网就有提供编译好的动态库,体积大一点)
3、等我们技术达到之后,可以自己对源码进行裁剪,然后编译出属于自己的动态库。
第一个链接:(我是使用这个链接进行下载)
- 7z 、zip:压缩算法不同,压缩大小不同而已。里面的内容一样。
- essentials:必要的组件,东西可能不全。
- full:全面的,里面的库文件比较全。
- shared:有动态链接库。(我们选取这一个)
- shared :代表里面的应用程序:ffmpeg、ffplay、ffprobe 使用的动态链接库。
- 没有带 shared 后缀:说明不是使用动态链接库。
- gpl、lgpl:代表不同的开源协议。
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文件时,大概按照以下优先级顺序去查找(这里只列出了大概的搜索路径,并没有写全):
环境变量Path中的路径
所以可以考虑将 %FFMPEG_HOME%/bin 目录配置到 Path 变量中
置于如何配置Windows的环境变量Path,这是基本开发常识了,就不再讲解了
2).pro文件( exe 编译的时候)
与上一个配置环境变量的作用不同,这个是指导 程序的链接过程,是否能找到对应的动态库。
.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 的库函数
这个 .pro 文件的配置,是指导程序编译的时候,可以找到对应的动态库。之前配置的环境变量,是指导 windows 运行程序的时候,可以找到对应的动态库。
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:设置需要链接的导入库名称
导入库名称需要去掉文件名前面的lib,比如 libavcodec.dll.a 就写成 avcodec
- 打印 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();
}
控制台输出: