本文目录

    阅读(9038)  评论(0)      编辑收藏举报

【秒懂音视频开发】04_Windows开发环境搭建


FFmpeg

为什么选择FFmpeg?

每个主流平台基本都有自己的音视频开发库(API),用以处理音视频数据,比如:

  • iOS:AVFoundation、AudioUnit等
  • Android:MediaPlayer、MediaCodec等
  • Windows:DirectShow等
  • ...

为了让所有平台的开发者都能够学习到音视频开发的通用技术,本教程主要讲解跨平台的音视频开发库FFmpeg。其实只要你掌握了FFmpeg,也可以很快上手其他音视频开发库,因为底层原理都是一样的,你最终操作的都是一样的数据,比如MP3、MP4文件。

简介

FFmpeg的Logo
FFmpeg的Logo

FFmpeg的名字由FF和mpeg组成。

  • FF是Fast Forward(译为:快进、快速前进)的简称
  • mpeg来源于Moving Picture Experts Group(简称:MPEG,译为:动态影像专家小组)
    • MPEG是源自ISO与IEC等国际组织的工作小组
    • MPEG的其中一项工作是:制定音视频相关的标准(比如压缩标准)

有很多知名项目都采用了FFmpeg,比如:

  • Google Chrome:浏览器
  • Firefox:浏览器
  • VLC:跨平台播放器
  • MPlayer
  • ijkplayer:bilibili团队开发的Android/iOS播放器框架
  • Perian:Apple公司的QuickTime组件

下载

网上已经有编译好的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安装包
qt安装包

安装

Next
Next

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

先注册,再登录
先注册,再登录

下一步
下一步

下一步
下一步

选择安装路径
选择安装路径

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

勾选编译器
勾选编译器

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

勾选源码
勾选源码

默认已经勾选了QtCreator。

默认已经勾选QtCreator
默认已经勾选QtCreator

许可协议
许可协议

开始菜单快捷方式
开始菜单快捷方式

安装
安装

解决控制台中文乱码

工具 -> 选项。

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

设置为UTF-8
设置为UTF-8

开发初探

第一个Qt项目

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

新建项目
新建项目

Application -> Qt Widgets Application。

Qt Widgets Application
Qt Widgets Application

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

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

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

下一步
下一步
下一步
下一步

勾选MinGW编译器。

下一步
下一步
完成
完成

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

双击打开mainwindow.ui文件
双击打开mainwindow.ui文件
拖拽
拖拽

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

消除警告

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

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即可。

#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文件

# 设置头文件的目录,以便编译器能够找到头文件
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的版本信息。

#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的搜索顺序

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,这是基本开发常识了,就不再讲解了

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

.pro文件

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

# 包含了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

常用快捷键

  • 字体缩放:Ctrl + 鼠标滚轮
  • 帮助文档:F1
  • 注释:Ctrl + /
  • 同名的.h、.cpp文件之间切换:F4
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示
顶部