FFmpeg

为什么选择FFmpeg?

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

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

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

简介

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版本开始是收费版本)。

安装

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

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

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

默认已经勾选了QtCreator。

解决控制台中文乱码

工具 -> 选项。

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

开发初探

第一个Qt项目

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

Application -> Qt Widgets Application。

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



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



勾选MinGW编译器。



双击打开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

04_QT_Windows开发环境搭建的更多相关文章

  1. python开发环境搭建

    虽然网上有很多python开发环境搭建的文章,不过重复造轮子还是要的,记录一下过程,方便自己以后配置,也方便正在学习中的同事配置他们的环境. 1.准备好安装包 1)上python官网下载python运 ...

  2. IntelliJ IDEA安装及jsp开发环境搭建

    一.前言 现在.net国内市场不怎么好,公司整个.net组技术转型,就个人来说还是更喜欢.net,毕竟不是什么公司都像微软一样财大气粗开发出VS这样的宇宙级IDE供开发者使用,双击sln即可打开项目, ...

  3. Qt for Android开发环境搭建及测试过程记录

    最近学习了Qt的QML编程技术,感觉相较于以前的QtGUI来说更方便一些,使用QML可以将界面与业务逻辑解耦,便于开发. QML支持跨平台,包括支持Android平台,因此可以使用Qt的QML进行An ...

  4. node.js之开发环境搭建

    一.安装linux系统 (已安装linux可跳此步骤) 虚拟机推荐选择:VirtualBox 或者 Vmware (专业版永久激活码:5A02H-AU243-TZJ49-GTC7K-3C61N) 我这 ...

  5. TODO:小程序开发环境搭建

    TODO:小程序开发环境搭建 1.第一步当然是要先注册小程序了 2.登录到小程序 a)完善小程序信息,如名称,图标,描述 3.绑定开发者 4.获取AppID,并设置服务器信息 5.下载并安装开发者工具 ...

  6. Eclipse中Python开发环境搭建

    Eclipse中Python开发环境搭建  目 录  1.背景介绍 2.Python安装 3.插件PyDev安装 4.测试Demo演示 一.背景介绍 Eclipse是一款基于Java的可扩展开发平台. ...

  7. Windows 10 IoT Serials 1 - 针对Minnow Board MAX的Windows 10 IoT开发环境搭建

    目前,微软针对Windows IoT计划支持的硬件包括树莓派2,Minnow Board MAX 和Galileo (Gen 1和Gen 2).其中,Galileo (Gen 1和Gen 2)运行的是 ...

  8. Eclipse swt开发环境搭建

    原料: eclipse swt.下载链接为: Eclipse 4.6.2 Release Build: 4.6.2 配置说明: Developing SWT applications using Ec ...

  9. Ionic- Android 开发环境搭建

    Ionic- Android 开发环境搭建 为时一周的IONIC ADNROID 环境终于在各种处理错误中搭建成功,以下记录下搭建过程中遇到的各种情况的处理办法. 一 首先,当然是enviroment ...

  10. visual studio 2015 + Cordova 开发环境搭建

    简单的写一些,备忘,太折腾了,特别是通过代理上网的我们国内的开发者 1.当然是安装Visual Studio 2015,别忘了选择Tools For Apache Cordova. 对于通过Proxy ...

随机推荐

  1. Program文件的作用

    Program.cs文件分析 Program.cs文件是至关重要的一个文件,它包含应用程序启动的代码,还可以配置所需要的服务和应用管道的中间件. 需要掌握: 6.0版本前后生成的Program.cs文 ...

  2. [FATAL] [DBT-06103] 端口 (1,521) 已在使用

    今天参考之前文章 Oracle 19c快速安装部署 在一个新的环境进行安装时,发现配置数据库时报错1521端口被占用: [root@OEL7 media]# /etc/init.d/oracledb_ ...

  3. offline 2 online | 重要性采样,把 offline + online 数据化为 on-policy samples

    论文标题:Offline-to-Online Reinforcement Learning via Balanced Replay and Pessimistic Q-Ensemble CoRL 20 ...

  4. Markdown:简洁高效的文本标记语言

    引言 在当今信息爆炸的时代,我们需要一种简洁.高效的文本标记语言来排版和发布内容.Markdown应运而生,它是一种轻量级的文本标记语言,以其简单易学.易读易写的特点,成为了广大写作者的首选工具.本文 ...

  5. NC14352 旅行

    题目链接 题目 题目描述 小z放假了,准备到R城市旅行,其中这个城市有N个旅游景点.小z时间有限,只能在三个旅行景点进行游玩.小明租了辆车,司机很善良,说咱不计路程,只要你一次性缴费足够,我就带你走遍 ...

  6. Educational Codeforces Round 136 (Rated for Div. 2) A-E

    比赛链接 A 题解 知识点:模拟. 所有点都跑一遍即可. 另外可以不模拟, \(\geq 2*2\) 的情况都可以摆在 \((2,2)\) 这个点,其他摆在 \((1,1)\) . 时间复杂度 \(O ...

  7. NC21467 [NOIP2018]货币系统

    题目链接 题目 题目描述 在网友的国度中共有n种不同面额的货币,第i种货币的面额为a[i],你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为n.面额数组为a[1..n]的货币系统记作(n, ...

  8. OpenStack调度器

    计算使用 nova-scheduler 服务来确定如何调度计算请求 默认配置中,调度程序会考虑以下所有条件的主机: 位于请求的可用区 (map_az_to_placement_aggregate) 放 ...

  9. Oracle设置和删除不可用列

    Oracle设置和删除不可用列 1.不可用列是什么? 就是表中的1个或多个列被ALTER TABLE-SET UNUSED 语句设置为无法再被程序利用的列. 2.使用场景? If you are co ...

  10. 开源开发者的狂欢,STRK开了一个好头!附领取价值800元的web3空投教程

    这两天在Github和推特上最热闹的事情便是知名ETH(以太坊)二层公链项目STRK给所有gtihub上排名前5000的开源项目的项目贡献者提供了价值800元的代币空投,其中不乏前端程序员.大学生等w ...