音视频流媒体开发-目录
iOS知识点-目录
Android-目录
Flutter-目录
数据结构与算法-目录
uni-pp-目录
1. FFmpeg命令行环境搭建
FFMPEG官网:http://ffmpeg.org/
1. 1下载4.2.1版本源码
源码:https://ffmpeg.org/releases/ffmpeg-4.2.1.tar.bz2
1.2 下载4.2.1编译好的文件
下载已经编译好的FFMPEG,因为官方的链接已经不维护,所以这里我们从音视频VIP群文件进行下载,群文件提供的是32bit版本(API和64bit是一样的)
文件说明:
- Shared:ffmpeg-4.2.1-win32-shared.zip 包含FFMPEG的dll库文件
-
Dev:ffmpeg-4.2.1-win32-dev.zip包含FFMPEG的lib文件/头文件,以及example范例。
Static:ffmpeg-4.2.1-win32-static.zip 包含了FFMPEG的官方文档
两种lib的区别
静态库(.lib)
- 函数和数据被编译进一个二进制文件(通常扩展名为.lib)。
- 在使用静态库的情况下,在编译链接可执行文件时,链接库从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.EXE文件)
- 当发布产品时,只需要发布这个可执行文件,并不需要发布被使用的静态库
动态库(.lib和.dll)
- 在使用动态库的时候,编译后往往提供两个文件:一个引入库(.lib)文件(也称“导入库文件”)和一个DLL(.dll)文件。当然到了后面会告诉你如果只提供一个DLL文件,使用显示连接的方式也可以调用,只是稍加麻烦而已。
- 虽然引入库的后缀名也是“lib”,但是,动态库的引入库文件和静态库文件有着本质的区别。对于一个dll文件来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。
我们目前主要是使用32位的版本。
注意:有其他链接机构提供了编译好的64bit版本,该链接仅供参考,大家先使用我们提供的32bit版本进行学习。
1. https://www.gyan.dev/ffmpeg/builds/#release-builds
不同release的区别:
- libraries in essentials build
avisynth+ libaom libass libfreetype libfribidi libgme libgsm libmp3lame libopencore-amrnb libopencore-amrwb libopenjpeg libopenmpt libopus librubberband libspeex libsrt libssh libtheora libvidstab libvmaf libvo-amrwbenc libvorbis libvpx libwebp libx264 libx265 libxvid libzimg libzmq mediafoundation sdl2
- additional libraries in full build
chromaprint frei0r ladspa libbluray libbs2b libcaca libcdio libdav1d libdavs2 libflite libilbc libjxl liblensfun libmodplug libmysofa libplacebo librav1e librist libshaderc libshine libsnappy libsoxr libsvtav1 libtwolame libuavs3d libxavs2 libzvbi opencl vulkan
- hardware-support libraries in all builds
amf cuda cuvid d3d11va dxva2 libmfx nvdec nvenc
2.https://github.com/BtbN/FFmpeg-Builds/releases提供的是64bit的
gpl 包括所有依赖项,甚至那些需要完整 GPL 而不仅仅是 LGPL 的依赖项。
lgpl 缺少仅 GPL 的库。最突出的是 libx264 和 libx265。
gpl-shared 与 gpl 相同,但带有 libav* 系列共享库而不是纯静态可执行文件。
lgpl-shared 再次相同,但具有 lgpl 依赖项集。
如果要从该链接下载编译好的库,建议下载
1.3 FFmpeg命令行环境搭建
解压ffmpeg-4.2.1-win32-shared.zip
1. 拷贝可执行文件到C:\Windows
2. 拷贝动态链接库到C:\Windows\SysWOW64
(WoW64 (Windows On Windows64 [1] )是一个Windows操作系统的子系统,被设计用来处理许多在32-bit Windows和64-bit Windows之间的不同的问题,使得可以在64-bit Windows中运行32-bit程序。)
解压SDL2
解压SDL2-2.0.10.rar
把SDL2.dll也拷贝到C:\Windows\SysWOW64目录
3.打开cmd命令行窗口
输入ffmpeg -version测试,打印版本号4.2.1即可。
对于命令行实战中遇到FFmpeg版本号不同的时候不用担心,之前录制FFmpeg命令行实战的时候最新的版本是4.1,现在用4.2.1版本测试是没有任何问题。
2. VS2015安装
第三方下载:http://www.xz7.com/downinfo/202013.html
Enterprise: HM6NR-QXX7C-DFW2Y-8B82K-WTYJV
设置环境变量
D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
如果在命令行输入cl提示找不到,在环境变量写为:
D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\Hostx64\x64
其他版本,比如vs2019
设置环境变量: 系统属性 -> 高级 -> 环境变量
PATH对应:
C:\Program Files (x86)\Microsoft Visual tudio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64
3. QT 5.10安装
下载版本:QT版本 5.10.1
下载地址:http://download.qt.io/official_releases/qt/5.10/5.10.1/
选择该版本
直接下载地址:http://iso.mirrors.ustc.edu.cn/qtproject/archive/qt/5.10/5.10.1/qt-opensource-windows-x86-5.10.1.exe
下载地址:
Running Windows Runtime device detection.
No winrtrunner.exe found.
Project ERROR: Cannot run compiler 'cl'. Output:
===================
===================
Maybe you forgot to setup the environment?
Error while parsing file C:\Users\32687\Documents\qt-c\qt-c.pro. Giving up.
Project ERROR: Cannot run compiler 'cl'. Output:
===================
===================
Maybe you forgot to setup the environment?
Error while parsing file D:\0voice\av_media\qt\qt-c\qt-c.pro. Giving up.
3.1 安装CDB调试器步骤(MSVC编译器调试用)
先关闭Qt Creator
msvc编译器使用windbg下的cdb调试器 所以需要安装windbg
官网下载链接:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-tools
Qt Creator 安装SDK,在MSVC编译模式下使用CDB调试器
https://www.cnblogs.com/lixuejian/p/12915174.html
一定要安装好该调试器才能 MSVC2015 32bit/64bit才能调试。
3.2 直接使用FFmpeg官方编译的库
刚打开QT Creator的界面
2 新建工程
3 选择Non-Qt Project
4 填写项目名称以及路径,如下所示就创建了一个叫ffmpeg-version的工程。
到此创建了一个基本的工程。
注意:需要使用C++时则选择
引用FFMPEG库
将ffmpeg-4.2.1-win32-dev拷贝到ffmpeg-version目录下
在ffmpeg-version.pro里面添加ffmpeg头文件和库文件路径
即是
win32 {
INCLUDEPATH += $$PWD/ffmpeg-4.2.1-win32-dev/include
LIBS += $$PWD/ffmpeg-4.2.1-win32-dev/lib/avformat.lib \
$$PWD/ffmpeg-4.2.1-win32-dev/lib/avcodec.lib \
$$PWD/ffmpeg-4.2.1-win32-dev/lib/avdevice.lib \
$$PWD/ffmpeg-4.2.1-win32-dev/lib/avfilter.lib \
$$PWD/ffmpeg-4.2.1-win32-dev/lib/avutil.lib \
$$PWD/ffmpeg-4.2.1-win32-dev/lib/postproc.lib \
$$PWD/ffmpeg-4.2.1-win32-dev/lib/swresample.lib \
$$PWD/ffmpeg-4.2.1-win32-dev/lib/swscale.lib
}
LIBS的多行引用一定要记得带斜杠,否则后续的引用无效。
修改main.c文件
#include <stdio.h> // 包含ffmpeg头文件
#include "libavutil/avutil.h"
int main() {
printf("Hello FFMPEG, version is %s\n", av_version_info()); return 0;
}
执行程序
显示 Hello FFMPEG, version is 4.2.1
如果不能正常运行则是因为没有ffmpeg库对应的 dll:
4. Windows编译FFmpeg
4.1 编译环境
MSYS2 (Minimal SYStem 2)是一个MSYS的独立改写版本,主要用于 shell 命令行开发环境。同时它也是一个在Cygwin(POSIX 兼容性层) 和 MinGW-w64(从"MinGW-生成")基础上产生的,追求更好的互操作性的 Windows 软件。
MSYS2 是MSYS的一个升级版,准确的说是集成了panman和Mingw-64的Cygwin升级版, 提供了bash shell等linux环境、版本控制软件(git/hg)和MinGW-w64 工具链。与MSYS最大的区别是移植了Arch linux的软件包管理系统Pacman(其实是与Cygwin的区别)。
- 下载安装MSYS2(按照官网安装到自己指定的目录下,本人安装于D:/msys64)
- 安装完成之后,先把安装目录下的msys2_shell.cmd中注释掉的
rem set MSYS2_PATH_TYPE=inherit
改成set MSYS2_PATH_TYPE=inherit
,这是为了将vs的环境继承给MSYS2。
MSYS2可以选择msys或者MinGW-w64环境来编译,不过在msys下使用gcc编译出来的exe和dll依赖msys-2.0.dll,而MinGW-w64下编译出来的文件不需要依赖这个dll,从程序的运行效率来看,不依赖这个dll的程序的效率应该更高。所以选择MinGW-w64来编译更佳。
4.2 修改pacman的源
pacman是一个软件包管理器,用来在MSYS2中安装软件,但是默认的国外的源下载安装包时非常缓慢,大概只有十几二十KB的速度,而且还容易下载中断出错,所以需要修改为国内源,国内源可以选择中科大的源。
按照MSYS2镜像提示修改。具体如下:
注意:是在文件夹打开文件进行编辑,不是在shell窗口编辑。
编辑 /etc/pacman.d/mirrorlist.mingw32
,在文件开头添加:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686/
Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686/
编辑 /etc/pacman.d/mirrorlist.mingw64
,在文件开头添加:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64/
Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64/
编辑 /etc/pacman.d/mirrorlist.msys
,在文件开头添加:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch/
Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch/
3.启动命令行窗口,在窗口中输入:
#进入msys2安装目录
D:
cd D:\msys64
#如果要打开msys2的mingw64窗口
msys2_shell.cmd -mingw64
#如果要打开msys2的msys窗口
#msys2_shell.cmd
然后在msys2的shell中执行:
pacman -Sy
刷新软件包数据。
4.3 安装编译环境
gcc编译器、git等
msys2 遇到两类开发环境:
- MSYS2 自带的开发环境,安装的包叫 msys2-devel
- MinGW-w64 的安装
这两者有什么区别呢?
一言以蔽之,前者编译出来的可执行文件,要依赖 MSYS2 提供的动态链接库,而后者不需要。下面详细说明一下:
(1) MSYS2 下的 gcc 编译环境,编译的可执行文件要依赖于 msys-2.0.dll,这个 DLL 提供了 Linux 下编程的提供的函数和接口,例如 fork 函数。
这个编译环境对于编译基于 Linux 下编写的软件,是非常适合的。例如编译 GNU 提供的各种工具。例如,你想编译最新版本的 GNU grep 工具,MSYS2 下的这个环境是非常适合的。
(2)用 MinGW64 的编译环境,不再依赖于 msys-2.0.dll,如果源代码就是基于 windows 开发的,那使用 MinGW 的编译环境比较好,编译出来的可执行文件,不用再依赖 MSYS 提供的动态链接库。当然,前提是代码中不能使用 Linux 的东西,即 POSIX 的那套东西。
4.3.1安装mingw-w64
要先修改 msys64\etc\pacman.conf(大概39行),修改后:
SigLevel = Never
#SigLevel = Required DatabaseOptional
这里我们只用MinGW
如果选择MinGW-w64编译则打开MSYS2 MinGW64
,在shell窗口中输入:
pacman -S mingw-w64-x86_64-toolchain
然后默认全部安装即可(直接回车)。
而如果选择msys编译则打开MSYS2 MSYS2
,在shell窗口中输入:
pacman -S msys2-devel
或者
pacman -S make gcc diffutils pkg-config
然后默认全部安装即可。
4.3.2 安装git
安装git:任一方式打开shell窗口输入:
pacman -S git
4.3.3 安装make等工具
pacman -S make
pacman -S automake
pacman -S autoconf
pacman -S perl
pacman -S libtool
pacman -S mingw-w64-i686-cmake
pacman -S pkg-config
如果需要编译出ffplayer的话,还需要安装SDL
pacman -S mingw-w64-x86_64-SDL2
4.4 编译环境的其他准备工作
1.重命名link.exe
重命名msys64/usr/bin/link.exe
为msys64/usr/bin/link.bak
, 避免和MSVC 的link.exe抵触。
2.启动命令行窗口,在窗口中输入:
#进入msys2安装目录
D:
cd D:\msys64
#如果要打开msys2的mingw64窗口
msys2_shell.cmd -mingw64
#如果要打开msys2的msys窗口
#msys2_shell.cmd
3.下载和安装YASM
pacman -S yasm
4.检查编译环境工具
mingw64的shell窗口输入:
which cl link yasm cpp
看返回结果,没有no的结果一般就没问题。
5.修改支持中文显示
窗口右键->Options->Text,然后locale选择:zh_CN,Character set 选择 UTF-8。
6.安装nasm
编译当前最新x264时需要用到nasm。
pacman -S nasm
4.5 编译第三方库
4.5.1 下载和编译x264
1.1。MinGW-w64版本
下载x264或者使用
将下载下的放置于/home/32687/ffmpeg,把第三方库编译的库文件放在 /home/32687/ffmpeg/build
git clone http://git.videolan.org/git/x264.git
或者用码云的链接
git clone https://gitee.com/mirrors_addons/x264.git
cd进入x264目录下:
./configure --prefix=/home/32687/ffmpeg/build/libx264 --host=x86_64-w64-mingw32 --enable-static --extra-ldflags=-Wl,--output-def=libx264.def
make
make install
2.生成libx264.lib
上面编译出来的结果没有包含lib文件,需要自己手工生成。
configure时我们生成了libx264.def
此时就派上用场。
cp ./libx264.def /home/32687/ffmpeg/build/libx264/lib/
cd /home/32687/ffmpeg/build/libx264/lib
#若要生成64位lib文件则输入如下命令:
lib /machine:X64 /def:libx264.def
#若要生成32位lib文件则输入如下命令:
#lib /machine:i386 /def:libx264.def
即得到libx264``.lib
,然后将/home/32687/ffmpeg/build/libx264/bin/libx264-161.dll (具体名字和x264版本有关)
改名或者复制一份为libx264.dll
。
如果想在程序中直接使用x264的话,将include中的.h头文件、libx264.lib
和libx264.dll
复制到项目中对应位置,并且在程序中添加头文件,然后就可以使用x264中的方法了。
加上
./configure --prefix=/home/32687/ffmpeg/build/libx264 --host=x86_64-w64-mingw32 --enable-shared --enable-static --extra-ldflags=-Wl,--output-def=libx264.def
libx264官网下载
https://www.videolan.org/developers/x264.html
4.5.2 下载和编译fdk-aac
下载fdk-aac
git clone --depth 1 https://gitee.com/mirrors/fdk-aac.git
cd fdk-aac/
编译fdk-aac
./autogen.sh
./configure --prefix=/home/32687/ffmpeg/build/libfdk-aac --enable-static --enable-shared
make -j4
make install
查看是否编译成功
动态库
$ find -name *.dll
./.libs/libfdk-aac-2.dll
静态库
$ find -name *.a
./.libs/libfdk-aac.a
./.libs/libfdk-aac.dll.a
libfdk_aac官网下载
https://sourceforge.net/projects/opencore-amr/files/fdk-aac/
4.5.3 下载编译mp3
下载
git clone --depth 1 https://gitee.com/hqiu/lame.git
编译
./configure --prefix=/home/32687/ffmpeg/build/libmp3lame --disable-shared --disable-frontend --enable-static
make -j4
make install
查找.a静态库
$ find -name *.a
./libmp3lame/.libs/libmp3lame.a
./libmp3lame/vector/.libs/liblamevectorroutines.a
./mpglib/.libs/libmpgdecoder.a
去查看一下
alang@AlanGe MINGW64 /home/32687/ffmpeg/lame
$ cd ..
alang@AlanGe MINGW64 /home/32687/ffmpeg
$ cd build/
alang@AlanGe MINGW64 /home/32687/ffmpeg/build
$ ls
libfdk-aac libmp3lame libx264
alang@AlanGe MINGW64 /home/32687/ffmpeg/build
$ cd libmp3lame/
alang@AlanGe MINGW64 /home/32687/ffmpeg/build/libmp3lame
$ ls
include lib share
alang@AlanGe MINGW64 /home/32687/ffmpeg/build/libmp3lame
$ cd lib/
alang@AlanGe MINGW64 /home/32687/ffmpeg/build/libmp3lame/lib
$ ls
libmp3lame.a libmp3lame.la
libmp3lame官网下载(选择版本>= 3.98.3)
https://sourceforge.net/projects/lame/files/lame/
4.5.4 下载编译libvpx
git clone --depth 1 https://github.com/webmproject/libvpx.git
cd libvpx
./configure --prefix=/home/32687/ffmpeg/build/libvpx --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm
make -j4
make install
4.6 下载和编译ffmpeg
1.下载ffmpeg
git clone git://source.ffmpeg.org/ffmpeg.git
或者码云的链接
git clone https://gitee.com/mirrors/ffmpeg.git
cd ffmpeg
# 查看版本
git branch -a
# 选择4.2版本
git checkout remotes/origin/release/4.2
git checkout remotes/origin/release/4.2
由于ffmpeg比较大,更好的选择官网下载ffmpeg。
2.编译ffmpeg
创建一个build.sh
将下载好的ffmpeg与x264放在一个目录下,本人是/home/32687/ffmpeg。
build_ffmpeg.sh内容是:
./configure \
--prefix=/home/32687/ffmpeg/build/ffmepg-4.2 \
--arch=x86_64 \
--enable-shared \
--enable-gpl \
--enable-libfdk-aac \
--enable-nonfree \
--enable-libvpx \
--enable-libx264 \
--enable-libmp3lame \
--extra-cflags="-I/home/32687/ffmpeg/build/libfdk-aac/include" \
--extra-ldflags="-L/home/liaoqingfu/build/libfdk-aac/lib" \
--extra-cflags="-I/home/liaoqingfu/build/libvpx/include" \
--extra-ldflags="-L/home/liaoqingfu/build/libvpx/lib" \
--extra-cflags="-I/home/liaoqingfu/build/x264/include" \
--extra-ldflags="-L/home/liaoqingfu/build/x264/lib" \
--extra-cflags="-I/home/liaoqingfu/build/libmp3lame/include" \
--extra-ldflags="-L/home/liaoqingfu/build/libmp3lame/lib"
执行:
sh build_ffmpeg.sh
然后
make -j8
make install
测试
拷贝一个MP4文件到bin目录下,用ffplay播放
$ ffplay.exe believe.mp4 -x 800 -y 480
4.7 MinGW与MSVC编译的区别
首先,MSVC是指微软的VC编译器,需要安装微软的VS软件,若是感觉软件比较庞大,可以安装visualcppbuildtools_full,不过也很大哈!
然后,MinGW是指是Minimalist GNU on Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时库。感觉跨平台型更好呢
二:设置环境变量继承自Windows
找到msys2_shell.cmd中的
rem set MSYS2_PATH_TYPE=inherit
去掉rem,取消这一句的注释,使MSYS2的环境变量继承自系统
5 QT使用MSVC2015 64bit调用我们编译的ffmpeg库
xxx.pro范例
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += \
main.c
INCLUDEPATH += \
$$PWD/ffmepg-4.2/include
LIBS += $$PWD/ffmepg-4.2/bin/avformat.lib \
$$PWD/ffmepg-4.2/bin/avcodec.lib \
$$PWD/ffmepg-4.2/bin/avdevice.lib \
$$PWD/ffmepg-4.2/bin/avfilter.lib \
$$PWD/ffmepg-4.2/bin/avutil.lib \
$$PWD/ffmepg-4.2/bin/swresample.lib \
$$PWD/ffmepg-4.2/bin/swscale.lib
测试文件
#include <stdio.h>
// 包含ffmpeg头文件
#include "libavutil/avutil.h"
int main()
{
printf("Hello FFMPEG, version is %s\n", av_version_info());
return 0;
}
5.QT使用MSVC2015 64bit调用我们编译的ffmpeg库
(1)进到ffmpeg编译目录,先把需要的dll都放到对应bin目录,怎么把需要的dlI找出来呢?就是执行ffplay/ffmpeg/ffprobe
D:\Ovoicelav_media\ffmpeg_windows\ffmpeg_clffmepg-4.2\bin
缺什么,就用Everything搜索,拷贝到上面那个目录
(2)把ffmpeg-4.2拷贝到我们工程目录
(3)修改工程的pro文件,添加头文件和库文件支持
(4)修改main.c,一定要把build-xoox-Debug目录的过程文件先删除,否则出现"libavutil/avutil.h"找不到的情况
(5)把\ffmepg-4.2\bin下面的所有d川拷贝到build-xxx-Debug目录
dll包括ffmpeg的,也包括其他第三方的(步骤1收集到的dll)
(6)才能正常运行和debug程序
编译32bit参考
https://www.pianshen.com/article/67241334192/
或者MINGW-w64 32位开发工具链的安装
pacman -Syu mingw-w64-i686-toolchain
pacman -S msys/gcc