iOS音视频开发(二)开发库的选择及Mac/Windows环境搭建
一、各平台特有音视频开发库
- 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
目录结构:
通过brew install安装的软件会存放到 /usr/local/Cellar 目录中,通过以下命令可以打开FFmpeg的安装目录:
cd /usr/local/Cellar/ffmpeg
bin:有编译好的可执行程序:ffmpeg、ffplay等,可以直接在命令行上使用,比如:
ffplay xx.mp4:可以直接播放某个视频
ffmpeg -version:可以查看FFmpeg的版本号
include:开发时需要包含的头文件
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 | # 设置头文件路径 |
打印FFmpeg版本号:
1 | #include "mainwindow.h" |
Windows环境配置
下载
网上已经有编译好的FFmpeg,目前最新的Release版本是4.3.2,可以直接下载到项目中进行开发使用。
- Windows版本下载:ffmpeg-4.3.2-2021-02-27-full_build-shared.7z
- 源码下载:ffmpeg-4.3.2.tar.xz
- 网上编译好的FFmpeg一般是完整版,体积比较大
- 日后我们可以根据实际需要,对FFmpeg的源码进行裁剪后再进行重新编译
解压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)
- 有编译好的可执行程序:ffmpeg.exe、ffplay.exe、ffprobe.exe,可以直接在命令行上使用,比如
- doc:FFmpeg的使用文档
- include:开发时需要包含的头文件
- lib:链接时需要用到的库文件
Qt
如果要想开发一个播放器,肯定得编写界面,同样为了保证跨平台开发,这里采用的GUI库是Qt,官方的开发工具QtCreator是跨平台的(支持Windows、Mac、Linux)。Qt开发采用的编程语言是C++。
下载
本教程中选择5.14.2版本(从5.15版本开始是收费版本)。
- 下载地址:https://download.qt.io/archive/qt/5.14/5.14.2/
- Windows系统选择下载:qt-opensource-windows-x86-5.14.2.exe
安装
需要先注册,再进行登录。
勾选MinGW 64bit编译器(我电脑的系统是64bit)。
如果后期想阅读Qt源码,就选择勾选Qt源码。
默认已经勾选了QtCreator。
解决控制台中文乱码
工具 -> 选项。
文本编辑器 -> 行为 -> 文本编码 -> 默认编码。
开发初探
第一个Qt项目
打开QtCreator,文件 -> 新建文件或项目。
Application -> Qt Widgets Application。
设置项目名称和项目的存放路径。
QtCreator默认会创建一个MainWindow类(主窗口)。
勾选MinGW编译器。
双击打开mainwindow.ui文件,可以往右边的主窗口中添加一些界面元素(比如按钮)。
点击左下角的运行按钮(绿色三角形),即可看到一个窗口界面,这个就是QtCreator默认创建的主窗口(MainWindow对象)。
消除警告
每次运行Qt程序,你的控制台可能都会出现以下警告信息:QT_DEVICE_PIXEL_RATIO已经过期。
1 | Warning: QT_DEVICE_PIXEL_RATIO is deprecated. Instead use: |
解决方案:设置环境变量QT_SCALE_FACTOR为1即可。
1 |
|
集成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 | 设置头文件的目录,以便编译器能够找到头文件 |
- #号后面的内容是注释
- %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 |
|
拷贝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文件时,大概按照以下优先级顺序去查找(这里只列出了大概的搜索路径,并没有写全):
exe所在的目录
Windows的System目录
- C:/Windows/System
- C:/Windows/System32
Windows目录
- C:/Windows
环境变量Path中的路径
所以可以考虑将**%FFMPEG_HOME%/bin**目录配置到Path变量中
置于如何配置Windows的环境变量Path,这是基本开发常识了,就不再讲解了
Windows的环境变量Path: 此电脑—-属性—–高级—-环境变量:添加路径
第1种方式需要在每一个Qt程序中都拷贝一份FFmpeg的dll文件,第2~4种方式可以让多个Qt程序共用同一份FFmpeg的dll文件。
.pro文件
.pro文件是Qt项目的 主配置文件 。
1 | 包含了core、gui两个模块 |
常用快捷键
- 字体缩放:Ctrl + 鼠标滚轮
- 帮助文档:F1
- 注释:Ctrl + /
- 同名的.h、.cpp文件之间切换:F4