一、安装FFmpeg
1、安装
- 在Mac环境中,直接使用Homebrew安装FFmpeg即可。
brew install ffmpeg
- 安装完毕后,如果能成功在命令行查看FFmpeg的版本号,那说明已经安装成功。
ffmpeg -version
2、目录结构
- 可以查看
FFmpeg
安装路径
which ffmpeg
- 查看文件
open /usr/local/bin
- 右键点击
ffmpeg
, 点击显示原身
- 可以跳转到
ffmpeg
具体的安装位置
Homebrew
安装的FFmpeg
就存放在了/usr/local/Cellar/ffmpeg
路径下, 安装的版本是4.3.2
bin
: 有编译好的可执行程序: ffmpeg、ffplay等,可以直接在命令行上使用,比如ffplay xx.mp4
: 可以直接播放某个视频ffmpeg -version
: 可以查看FFmpeg的版本号
include
: 开发时需要包含的头文件lib
: 链接时需要用到的库文件
二、QT
- 如果要想开发一个播放器,肯定得编写界面,同样为了保证跨平台开发,这里采用的GUI库是
Qt
,官方的开发工具QtCreator是跨平台的(支持Windows、Mac、Linux)。Qt开发采用的编程语言是C++。 - 本教程中选择5.14.2版本(从5.15版本开始是收费版本),
macOS Big Sur 版本11.1
以上, 可以安装这个包https://d13lb3tujbc8s0.cloudfront.net/onlineinstallers/qt-unified-mac-x64-4.0.0-online.dmg
, 选择5.15
即可
1、官网下载
- 可以在官网下载Mac版本的安装包
- 下载后一步步安装即可
2、Homebrew下载
- 通过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
3、配置
- 通过brew安装的Qt和Qt Creator是分开的,需要在Qt Creator中设置一下Qt的路径。
- 打开
QT Creator
的偏好设置
- 找到
Kits
的Qt Versions
, 点击添加
- Qt的路径是在
/usr/local
中,默认是隐藏的。- 可以使用快捷键
Command + Shift + .
显示隐藏文件和文件夹 - 可以使用快捷键
Command + Shift + G
手动输入Qt的文件夹:/usr/local/Cellar/qt
- 可以使用快捷键
- 可以看到
qt
的文件夹
- 选择
bin
目录下的qmake
- 接着配置
构建套件
三、开发
1、新建项目
- 创建项目后, 如下所示
- 点击构建
- 消除版本警告, 在
test.pro
文件中添加CONFIG+=sdk_no_version_check
2、集成FFmpeg到Qt项目中
- 集成FFmpeg需要修改.pro文件
# 设置头文件路径
INCLUDEPATH += /usr/local/Cellar/ffmpeg/4.3.2/include
# 设置库文件路径
LIBS += -L /usr/local/Cellar/ffmpeg/4.3.2/lib \
-lavcodec \
-lavdevice \
-lavfilter \
-lavformat \
-lavutil \
-lpostproc \
-lswscale \
-lswresample \
-lavresample
- 程序中打印FFmpeg版本号
#include "mainwindow.h"
#include <QDebug>
// ffmpeg是C语言的库, 所以需要使用 extern 导入
extern "C" {
#include <libavcodec/avcodec.h>
}
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
qDebug() << av_version_info();
}
QT
是跨平台的, 如果需要在不同平台导入不同的路径, 还可以使用下面的方式导入
- 也可以将路径抽取出来导入
四、开发基础
1、控件基本使用
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// 设置窗口标题
setWindowTitle("主窗口");
// 设置窗口大小
// 窗口可以通过拖拽边缘进行自由伸缩
// resize(400, 400);
// 设置窗口的固定大小
// 窗口不能通过拖拽边缘进行自由伸缩
setFixedSize(400, 400);
// 设置窗口的位置
// 以父控件的左上角为坐标原点
// 没有父控件,就以屏幕的左上角作为坐标原点
move(100, 100);
}
2、添加子控件
#include <QPushButton>
// 创建按钮
QPushButton *btn = new QPushButton;
// 设置按钮的文字
btn->setText("登录");
// 设置父控件为当前窗口
btn->setParent(this);
// 设置按钮的位置和大小
btn->move(50, 50);
btn->resize(100, 50);
// 创建第2个按钮
new QPushButton("注册", this);
3、C++的实例对象
- 在很多语言中, 创建的实例对象都是存储在
内存堆区
里 - 但是C++, 可以在
栈区
存储实例对象
1) 堆区存储实例对象
- 使用关键字
new
创建的实例对象, 存在堆区中
// 创建按钮, 在堆区中
QPushButton *btn = new QPushButton;
// 设置按钮的文字
btn->setText("登录");
// 设置父控件为当前窗口
btn->setParent(this);
// 设置按钮的位置和大小
btn->move(50, 50);
btn->resize(100, 50);
// 创建第2个按钮
new QPushButton("注册", this);
2) 栈区存储实例对象
- 在
main.cpp
文件中, 代码如下
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
- 其中的
MainWindow w;
这一句, 就是在栈区创建了一个MainWindow
类型的实例对象w
- 当
main
函数结束时,w
被释放 QApplication a(argc, argv);
这一句是在栈区创建QApplication
类型的实例变量a
return a.exec();
这一句是main
函数的返回,a.exec();
中会调用运行循环
, 保证main
函数无法结束, 所以w
永远不会释放(程序关闭后, 依然会释放)
3) 添加到主窗口上的实例对象, 不能创建在栈区中
- 在C++中没有高级的内存管理方式(例如OC中的引用计数), 我们创建在
栈区
创建的实例变量, 当作用域
结束后, 就会被释放
创建在
堆区
中的实例变量, 需要我们手动释放, 不过QT
已经帮我们做了处理, 当主窗口释放时, 会自动释放
添加到主窗口的所有子控件