一、各平台特有音视频开发库

  • iOS:AVFoundation,AudioUnit等
  • Android:MediaPlayer、MediaCodec等
  • Windows:Directshow等

二、跨平台开发库:FFmpeg

  • 音视频开发选择基于C语言的FFmpeg

  • GUI图形界面的开发选择基于C++的Qt(QtCreator)


三、Mac环境配置

1. FFmpeg安装
  • 在Mac环境中,直接使用Homebrew安装FFmpeg即可: brew install ffmpeg

  • FFmpeg版本查看: ffmpeg -version

  • 目录结构:

    1. 通过brew install安装的软件会存放到 /usr/local/Cellar 目录中,通过以下命令可以打开FFmpeg的安装目录:

      cd /usr/local/Cellar/ffmpeg

    2. bin:有编译好的可执行程序:ffmpeg、ffplay等,可以直接在命令行上使用,比如:

      ffplay xx.mp4:可以直接播放某个视频

      ffmpeg -version:可以查看FFmpeg的版本号

    3. include:开发时需要包含的头文件

    4. lib:链接时需要用到的库文件


2. Qt安装
  • 通过brew install安装Qt,最终被安装在/usr/local/Cellar/qt目录:

    brew install qt

  • 通过brew install –cask安装Qt Creator,最终被安装在/usr/local/Caskroom/qt-creator目录

    brew install –cask qt-creator

  • 相关配置:通过brew安装的Qt和Qt Creator是分开的,需要在Qt Creator中设置一下Qt的路径,将两者联系起来

具体配置流程:

​ 点击Qt Creator的偏好设置:在Qt Versions中添加本地对应的Qt路径

Qt的路径是在/usr/local中,默认是隐藏的:

  • 可以使用快捷键Command + Shift + .显示隐藏文件和文件夹
  • 可以使用快捷键Command + Shift + G手动输入Qt的文件夹:/usr/local/Cellar/qt

选择bin目录下的qmake:

设置64bit那一项为默认开发环境:在Kits选项下设置默认的开发环境,并选择之前设置的指定版本的Qt

滚动到底下,选择刚才设置的Qt版本:


3. 开发
3.1新建项目:如图选择

运行后的效果如下图所示:

3.2 集成FFmpeg到Qt项目中

集成FFmpeg的操作,修改.pro文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 设置头文件路径
INCLUDEPATH += /usr/local/Cellar/ffmpeg/4.4/include

# 设置库文件路径
LIBS += -L/usr/local/Cellar/ffmpeg/4.3.2/lib \
-lavcodec \
-lavdevice \
-lavfilter \
-lavformat \
-lavutil \
-lpostproc \
-lswscale \
-lswresample \
-lavresample

打印FFmpeg版本号:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "mainwindow.h"

#include <QApplication>
#include <QDebug>

extern "C" {
#include <libavcodec/avcodec.h>
}

int main(int argc, char *argv[]) {
// 打印版本号
qDebug() << av_version_info();

QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}



Windows环境配置

下载

网上已经有编译好的FFmpeg,目前最新的Release版本是4.3.2,可以直接下载到项目中进行开发使用。

解压ffmpeg-4.3.2-2021-02-27-full_build-shared.7z文件后,目录结构如下所示:

  • bin
    • 有编译好的可执行程序:ffmpeg.exe、ffplay.exe、ffprobe.exe,可以直接在命令行上使用,比如
      • ffplay xx.mp4:可以直接播放某个视频
      • ffmpeg -version:可以查看FFmpeg的版本号
    • 有运行时需要用到的动态库文件(*.dll)
  • doc:FFmpeg的使用文档
  • include:开发时需要包含的头文件
  • lib:链接时需要用到的库文件

目录结构

Qt

如果要想开发一个播放器,肯定得编写界面,同样为了保证跨平台开发,这里采用的GUI库是Qt,官方的开发工具QtCreator是跨平台的(支持Windows、Mac、Linux)。Qt开发采用的编程语言是C++。

下载

本教程中选择5.14.2版本(从5.15版本开始是收费版本)。

qt安装包

安装

Next

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

下一步

下一步

选择安装路径

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

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

默认已经勾选了QtCreator。
默认已经勾选QtCreator

许可协议

开始菜单快捷方式

安装

解决控制台中文乱码

工具 -> 选项。

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

设置为UTF-8

开发初探

第一个Qt项目

打开QtCreator,文件 -> 新建文件或项目。

新建项目

Application -> Qt Widgets Application。

Qt Widgets Application

设置项目名称和项目的存放路径。
项目名称和项目的存放路径
下一步

QtCreator默认会创建一个MainWindow类(主窗口)。
下一步
下一步

勾选MinGW编译器。
下一步
完成

双击打开mainwindow.ui文件,可以往右边的主窗口中添加一些界面元素(比如按钮)。
双击打开mainwindow.ui文件
拖拽

点击左下角的运行按钮(绿色三角形),即可看到一个窗口界面,这个就是QtCreator默认创建的主窗口(MainWindow对象)。


消除警告

每次运行Qt程序,你的控制台可能都会出现以下警告信息:QT_DEVICE_PIXEL_RATIO已经过期。

1
2
3
4
Warning: QT_DEVICE_PIXEL_RATIO is deprecated. Instead use:
QT_AUTO_SCREEN_SCALE_FACTOR to enable platform plugin controlled per-screen factors.
QT_SCREEN_SCALE_FACTORS to set per-screen DPI.
QT_SCALE_FACTOR to set the application global scale factor.

解决方案:设置环境变量QT_SCALE_FACTOR为1即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "mainwindow.h"

#include <QApplication>

// 导入头文件【也可以不导入,因为<QApplication>中已经包含了<QByteArray>】
// #include <QByteArray>

int main(int argc, char *argv[]) {
// 通过qputenv函数设置QT_SCALE_FACTOR为1
qputenv("QT_SCALE_FACTOR", QByteArray("1"));

QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

集成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编译器中
    • 包含了dll中函数的入口,用于辅助找到并调用dll中的函数
    • 最终需要链接到Windows程序中(比如合并到exe文件中)

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

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

修改**.pro**文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# 设置头文件的目录,以便编译器能够找到头文件
INCLUDEPATH += %FFMPEG_HOME%/include

# 设置导入库的目录和需要链接的导入库
LIBS += -L%FFMPEG_HOME%/lib \
-lavcodec \
-lavdevice \
-lavfilter \
-lavformat \
-lavutil \
-lpostproc \
-lswscale \
-lswresample
  • #号后面的内容是注释
  • %FFMPEG_HOME%表示ffmpeg-4.3.2-2021-02-27-full_build-shared.7z解压后的目录
    • 需要根据你的实际情况修改为真实的路径
  • -L:设置导入库的目录,以便编译器能够找到导入库
  • -l:设置需要链接的导入库名称
    • 导入库名称需要去掉文件名前面的lib,比如libavcodec.dll.a就写成avcodec

调用函数

main.cpp中调用av_version_info函数,获取FFmpeg的版本信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "mainwindow.h"

#include <QApplication>

// 为了使用qDebug函数
#include <QDebug>

// FFmpeg是C语言库
// 有了extern "C",才能在C++中导入C语言函数
extern "C" {
#include <libavcodec/avcodec.h>
}

int main(int argc, char *argv[]) {
// 打印版本信息
qDebug() << av_version_info();

QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

拷贝dll文件

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

  • exe是Windows中的一种可执行文件
  • 我们编写的程序代码最终都存在了exe文件中

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

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

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

根据dll在Windows中的搜索顺序,将所需的动态库设置成“系统动态库”

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

  1. exe所在的目录

  2. Windows的System目录

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

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

    • 所以可以考虑将**%FFMPEG_HOME%/bin**目录配置到Path变量中

    • 置于如何配置Windows的环境变量Path,这是基本开发常识了,就不再讲解了

      Windows的环境变量Path: 此电脑—-属性—–高级—-环境变量:添加路径

第1种方式需要在每一个Qt程序中都拷贝一份FFmpeg的dll文件,第2~4种方式可以让多个Qt程序共用同一份FFmpeg的dll文件。

.pro文件

.pro文件是Qt项目的 主配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 包含了core、gui两个模块
QT += core gui

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

# 启用c++11版本语法
CONFIG += c++11

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

# 头文件
HEADERS += \
mainwindow.h

# ui文件
FORMS += \
mainwindow.ui

常用快捷键

  • 字体缩放:Ctrl + 鼠标滚轮
  • 帮助文档:F1
  • 注释:Ctrl + /
  • 同名的.h、.cpp文件之间切换:F4