一、前言
本系列文章是对音视频技能入门常识的整理和温习,为进一步深入系统研究音视频技能巩固根底。文章列表:
- 01-音视频技能中心常识|了解音频技能【移动通讯技能的开展、声响的实质、深入了解音频】
- 02-音视频技能中心常识|建立开发环境【FFmpeg与Qt、Windows开发环境建立、Mac开发环境建立、Qt开发根底】
- 03-音视频技能中心常识|Qt开发根底【
.pro
文件的装备、Qt控件根底、信号与槽】 - 04-音视频技能中心常识|音频录制【命令行、C++编程】
- 05-音视频技能中心常识|音频播映【播映PCM、WAV、PCM转WAV、PCM转WAV、播映WAV】
- 06-音视频技能中心常识|音频重采样【音频重采样简介、用命令行进行重采样、经过编程重采样】
- 07-音视频技能中心常识|AAC编码【AAC编码器解码器、编译FFmpeg、AAC编码实战、AAC解码实战】
- 08-音视频技能中心常识|成像技能【重识图片、详解YUV、视频录制、显现BMP图片、显现YUV图片】
- 09-音视频技能中心常识|视频编码解码【了解H.264编码、H.264编码、H.264编码解码】
- 10-音视频技能中心常识|RTMP服务器建立【流媒体、服务器环境】
二、FFmpeg与Qt
1. 为什么挑选FFmpeg?
每个主流渠道根本都有自己的音视频开发库(API),用以处理音视频数据,比方:
- iOS:AVFoundation、AudioUnit等
- Android:MediaPlayer、MediaCodec等
- Windows:DirectShow等
- …
为了让一切渠道的开发者都能够学习到音视频开发的通用技能,本教程首要解说跨渠道的音视频开发库FFmpeg。其实只要你掌握了FFmpeg,也能够很快上手其他音视频开发库,因为底层原理都是相同的,你终究操作的都是相同的数据,比方MP3、MP4文件。
2. FFmpeg简介
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组件
3. Qt
假如要想开发一个播映器,肯定得编写界面,同样为了确保跨渠道开发,这儿选用的GUI库是Qt,官方的开发东西QtCreator是跨渠道的(支撑Windows、Mac、Linux)。Qt开发选用的编程言语是C++。
如若你没有掌握C++言语,或许现已对C++语法现已淡忘,欢迎参阅我这几篇文章进行快速温习:
- 01-C++中心语法|C++概述【C++简介、C++起源、可移植性和标准、为什么C++会成功、从一个简单的程序开端认识C++】
- 02-C++中心语法|C++对C的扩展【::效果域运算符、名字操控、struct类型加强、C/C++中的const、引证(reference)、函数】
- 03-C++中心语法|面向目标1【 C++编程标准、类和目标、面向目标程序设计事例、目标的结构和析构、C++面向目标模型初探】
- 04-C++中心语法|面向目标2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转化、 C++标准、过错&&反常、智能指针】
- 05-C++中心语法|面向目标3【 承继和派生、多态、静态成员、const成员、引证类型成员、VS的内存窗口】
三、Windows开发环境建立
1. FFMpeg下载
网上现已有编译好的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:链接时需求用到的库文件
2. Qt下载
本教程中挑选5.14.2版别(从5.15版别开端是收费版别)。
- 下载地址:download.qt.io/archive/qt/…
- Windows系统挑选下载:qt-opensource-windows-x86-5.14.2.exe
3. Qt开发
3.1 第一个Qt项目
翻开QtCreator,文件 -> 新建文件或项目。
Application -> Qt Widgets Application。
设置项目称号和项目的寄存途径。
QtCreator默许会创建一个MainWindow类(主窗口)。
勾选MinGW编译器。
双击翻开mainwindow.ui文件,能够往右边的主窗口中添加一些界面元素(比方按钮)。
点击左下角的运转按钮(绿色三角形),即可看到一个窗口界面,这个便是QtCreator默许创建的主窗口(MainWindow目标)。
3.2 消除警告
每次运转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();
}
3.3 集成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中)
3.2.1 修正**.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
3.2.2 调用函数
在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();
}
3.2.3 复制dll文件
Qt程序编译成功后,会生成一个exe文件
- exe是Windows中的一种可执行文件
- 咱们编写的程序代码终究都存在了exe文件中
为了确保exe在运转时能成功调用FFmpeg的函数,那么就得让exe能够找到FFmpeg的dll文件(动态库文件)。能够将**%FFMPEG_HOME%/bin**目录中的一切dll文件复制到exe文件地点的目录中,exe在运转的时分,能主动找到跟它同一目录下的dll文件。
能够经过检查构建目录得知exe文件地点的目录。
运转程序后,假如能在操控台看到4.3.2字样的输出信息,阐明FFmpeg现已集成成功。
3.2.4 dll的查找次序
exe在寻觅dll文件时,大约按照以下优先级次序去查找(这儿只列出了大约的查找途径,并没有写全):
-
exe地点的目录
-
Windows的System目录
- C:/Windows/System
- C:/Windows/System32
-
Windows目录
- C:/Windows
-
环境变量Path中的途径
- 所以能够考虑将**%FFMPEG_HOME%/bin**目录装备到Path变量中
- 置于如何装备Windows的环境变量Path,这是根本开发常识了,就不再解说了
第1种方式需求在每一个Qt程序中都复制一份FFmpeg的dll文件,第2~4种方式能够让多个Qt程序共用同一份FFmpeg的dll文件。
3.3 .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
3.4 常用快捷键
- 字体缩放:Ctrl + 鼠标滚轮
- 帮助文档:F1
- 注释:Ctrl + /
- 同名的.h、.cpp文件之间切换:F4
四、Mac开发环境建立
在不同的Mac环境下,实践出来的效果或许跟本教程会有所差异。我的Mac环境是:Intel CPU、macOS Big Sur(11.2.2)。
1. FFMpeg装置
在Mac环境中,直接运用Homebrew装置FFmpeg即可。还没有装置Homebrew,或许嫌Homebrew下载速度慢的童鞋,能够参阅这篇文章:《Mac装置Homebrew》。
brew install ffmpeg
装置完毕后,假如能成功在命令行检查FFmpeg的版别号,那阐明现已装置成功。
ffmpeg -version
1.1 目录结构
经过brew install装置的软件会寄存到 /usr/local/Cellar 目录中,经过以下命令能够翻开FFmpeg的装置目录。
cd /usr/local/Cellar/ffmpeg
open .
-
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
2.1 装备
经过brew装置的Qt和Qt Creator是分隔的,需求在Qt Creator中设置一下Qt的途径。
Qt的途径是在 /usr/local 中,默许是躲藏的。
- 能够运用快捷键 Command + Shift + . 显现躲藏文件和文件夹
- 能够运用快捷键 Command + Shift + G 手动输入Qt的文件夹:/usr/local/Cellar/qt
挑选bin目录下的qmake。
设置64bit那一项为默许开发环境。
滚动到底下,挑选刚才设置的Qt版别。
3. Qt开发
3.1 新建项目
新建项目的操作和Windows版别差不多。
运转后的效果如下图所示。
3.2 设置头文件途径
INCLUDEPATH += /usr/local/Cellar/ffmpeg/版别号/include
3.3 设置库文件途径
**注意:结合ffmpeg的lib目录下的库列表,获取自己当前项目需求的库即可 **
LIBS += -L /usr/local/Cellar/ffmpeg/版别号/lib\
-
-
-lavcodec \
-
-
-
-lavdevice \
-
-
-
-lavfilter \
-
-
-
-lavformat \
-
-
-
-lavutil \
-
-
-
-lpostproc \
-
-
-
-lswscale \
-
-
-
....
-
# 设置头文件途径
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 <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();
}
专题系列文章
1. 前常识
- 01-探求iOS底层原理|总述
- 02-探求iOS底层原理|编译器LLVM项目【Clang、SwiftC、优化器、LLVM】
- 03-探求iOS底层原理|LLDB
- 04-探求iOS底层原理|ARM64汇编
2. 根据OC言语探求iOS底层原理
- 05-探求iOS底层原理|OC的实质
- 06-探求iOS底层原理|OC目标的实质
- 07-探求iOS底层原理|几种OC目标【实例目标、类目标、元类】、目标的isa指针、superclass、目标的办法调用、Class的底层实质
- 08-探求iOS底层原理|Category底层结构、App启动时Class与Category装载过程、load 和 initialize 执行、关联目标
- 09-探求iOS底层原理|KVO
- 10-探求iOS底层原理|KVC
- 11-探求iOS底层原理|探求Block的实质|【Block的数据类型(实质)与内存布局、变量捕获、Block的品种、内存办理、Block的修饰符、循环引证】
- 12-探求iOS底层原理|Runtime1【isa详解、class的结构、办法缓存cache_t】
- 13-探求iOS底层原理|Runtime2【音讯处理(发送、转发)&&动态办法解析、super的实质】
- 14-探求iOS底层原理|Runtime3【Runtime的相关运用】
- 15-探求iOS底层原理|RunLoop【两种RunloopMode、RunLoopMode中的Source0、Source1、Timer、Observer】
- 16-探求iOS底层原理|RunLoop的运用
- 17-探求iOS底层原理|多线程技能的底层原理【GCD源码剖析1:主行列、串行行列&&并行行列、全局并发行列】
- 18-探求iOS底层原理|多线程技能【GCD源码剖析1:dispatch_get_global_queue与dispatch_(a)sync、单例、线程死锁】
- 19-探求iOS底层原理|多线程技能【GCD源码剖析2:栅栏函数dispatch_barrier_(a)sync、信号量dispatch_semaphore】
- 20-探求iOS底层原理|多线程技能【GCD源码剖析3:线程调度组dispatch_group、事情源dispatch Source】
- 21-探求iOS底层原理|多线程技能【线程锁:自旋锁、互斥锁、递归锁】
- 22-探求iOS底层原理|多线程技能【原子锁atomic、gcd Timer、NSTimer、CADisplayLink】
- 23-探求iOS底层原理|内存办理【Mach-O文件、Tagged Pointer、目标的内存办理、copy、引证计数、weak指针、autorelease
3. 根据Swift言语探求iOS底层原理
关于函数
、枚举
、可选项
、结构体
、类
、闭包
、特点
、办法
、swift多态原理
、String
、Array
、Dictionary
、引证计数
、MetaData
等Swift根本语法和相关的底层原理文章有如下几篇:
- 01-Swift5常用中心语法|了解Swift【Swift简介、Swift的版别、Swift编译原理】
- 02-Swift5常用中心语法|根底语法【Playground、常量与变量、常见数据类型、字面量、元组、流程操控、函数、枚举、可选项、guard句子、区间】
- 03-Swift5常用中心语法|面向目标【闭包、结构体、类、枚举】
- 04-Swift5常用中心语法|面向目标【特点、inout、类型特点、单例模式、办法、下标、承继、初始化】
- 05-Swift5常用中心语法|高级语法【可选链、协议、过错处理、泛型、String与Array、高级运算符、扩展、拜访操控、内存办理、字面量、模式匹配】
- 06-Swift5常用中心语法|编程范式与Swift源码【从OC到Swift、函数式编程、面向协议编程、呼应式编程、Swift源码剖析】
4. C++中心语法
- 01-C++中心语法|C++概述【C++简介、C++起源、可移植性和标准、为什么C++会成功、从一个简单的程序开端认识C++】
- 02-C++中心语法|C++对C的扩展【::效果域运算符、名字操控、struct类型加强、C/C++中的const、引证(reference)、函数】
- 03-C++中心语法|面向目标1【 C++编程标准、类和目标、面向目标程序设计事例、目标的结构和析构、C++面向目标模型初探】
- 04-C++中心语法|面向目标2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转化、 C++标准、过错&&反常、智能指针】
- 05-C++中心语法|面向目标3【 承继和派生、多态、静态成员、const成员、引证类型成员、VS的内存窗口】
5. Vue全家桶
- 01-Vue全家桶中心常识|Vue根底【Vue概述、Vue根本运用、Vue模板语法、根底事例、Vue常用特性、归纳事例】
- 02-Vue全家桶中心常识|Vue常用特性【表单操作、自定义指令、计算特点、侦听器、过滤器、生命周期、归纳事例】
- 03-Vue全家桶中心常识|组件化开发【组件化开发思维、组件注册、Vue调试东西用法、组件间数据交互、组件插槽、根据组件的
- 04-Vue全家桶中心常识|多线程与网络【前后端交互模式、promise用法、fetch、axios、归纳事例】
- 05-Vue全家桶中心常识|Vue Router【根本运用、嵌套路由、动态路由匹配、命名路由、编程式导航、根据vue-router的事例】
- 06-Vue全家桶中心常识|前端工程化【模块化相关标准、webpack、Vue 单文件组件、Vue 脚手架、Element-UI 的根本运用】
- 07-Vue全家桶中心常识|Vuex【Vuex的根本运用、Vuex中的中心特性、vuex事例】
6. 音视频技能中心常识
- 01-音视频技能中心常识|了解音频技能【移动通讯技能的开展、声响的实质、深入了解音频】
- 02-音视频技能中心常识|建立开发环境【FFmpeg与Qt、Windows开发环境建立、Mac开发环境建立、Qt开发根底】
- 03-音视频技能中心常识|Qt开发根底【
.pro
文件的装备、Qt控件根底、信号与槽】 - 04-音视频技能中心常识|音频录制【命令行、C++编程】
- 05-音视频技能中心常识|音频播映【播映PCM、WAV、PCM转WAV、PCM转WAV、播映WAV】
- 06-音视频技能中心常识|音频重采样【音频重采样简介、用命令行进行重采样、经过编程重采样】
- 07-音视频技能中心常识|AAC编码【AAC编码器解码器、编译FFmpeg、AAC编码实战、AAC解码实战】
- 08-音视频技能中心常识|成像技能【重识图片、详解YUV、视频录制、显现BMP图片、显现YUV图片】
- 09-音视频技能中心常识|视频编码解码【了解H.264编码、H.264编码、H.264编码解码】
- 10-音视频技能中心常识|RTMP服务器建立【流媒体、服务器环境】
其它底层原理专题
1. 底层原理相关专题
- 01-计算机原理|计算机图形烘托原理这篇文章
- 02-计算机原理|移动终端屏幕成像与卡顿
2. iOS相关专题
- 01-iOS底层原理|iOS的各个烘托结构以及iOS图层烘托原理
- 02-iOS底层原理|iOS动画烘托原理
- 03-iOS底层原理|iOS OffScreen Rendering 离屏烘托原理
- 04-iOS底层原理|因CPU、GPU资源消耗导致卡顿的原因和解决计划
3. webApp相关专题
- 01-Web和类RN大前端的烘托原理
4. 跨渠道开发计划相关专题
- 01-Flutter页面烘托原理
5. 阶段性总结:Native、WebApp、跨渠道开发三种计划功能比较
- 01-Native、WebApp、跨渠道开发三种计划功能比较
6. Android、HarmonyOS页面烘托专题
- 01-Android页面烘托原理
- 02-HarmonyOS页面烘托原理 (
待输出
)
7. 小程序页面烘托专题
- 01-小程序结构烘托原理