腾讯课堂 零声教育 音视频高级教程 Windows ffmpeg6.0开发环境搭建
- QQ 326873713 (该qq只服务付费课程的学员,不提供免费答疑,有课程购买意愿再加QQ)
- 音视频课程地址:[音视频流媒体高级开发课程]
开发环境 Win10
- vs2019
- Qt5.15.2
- ffmpeg6.0
注:msys2部分组件的安装其实是没有必要的,因为这里编译实际是用的vs2019编译器,使用vs2019编译器则在项目开发时只需要引用ffmpeg相关的库即可。
1 Windows安装需要的软件和依赖
Visual Studio 2019 社区版 + QT5.15.2
- Visual Studio 2019 (使用community 社区版本即可)
- Ensure that the Desktop development with C++ workload is selected when installing Visual Studio.
- vs2019社区版本下载地址 https://www.jb51.net/softs/700418.html
- 下载最新的Windows 10 SDK (minimum 10.0.20348.0). 最新版本SDK地址
- Qt5 (为VS2019版本获取MSVC包)
- 使用 Qt 5.15.2
- CEF Wrapper 4638 库(目前不需要):https://cdn-fastly.obsproject.com/downloads/cef_binary_4638_windows_x64.zip
- Windows版本的CMake (3.16 ,或者更高版本)
- Windows版本的Git ,用于下载FFmpeg等
注意:
- 安装Visual Studio 2019,必须勾选Desktop development with C++
- QT的版本务必使用QT5.15.2,其他版本不保证编译成功。
VS2019安装环境变量设置
设置环境变量
其他版本,比如vs2019
设置环境变量: 系统属性 -> 高级 -> 环境变量
PATH对应:
C:\Program Files (x86)\Microsoft Visual tudio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64
安装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才能调试。
2 MSYS2开发环境搭建
2.1 MSYS2 和 MinGW64 的区别和联系?
MSYS 相当于操作系统(如Windows),这个操作系统提供的软件、接口等和Linux相似。
MinGW 相当于开发工具包(如MSVC),这个开发工具包可以运行在 MSYS 下,包里的工具也可以运行在Windows下,编译结果是Windows程序。
参考自:使用MSYS的一些经验 - 知乎 (zhihu.com)
参考:windows下mingw和msys https://www.jianshu.com/p/3cb5819d04b6
我们后续Windows平台编译器版本统一使用VS2019,所以在使用MSYS2编译FFmpeg的时使用vs2019的环境变量。
2.2 MSYS2安装
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的区别)。
下载地址:https://www.msys2.org/
建议通过阿里云的链接更快速下载:https://mirrors.aliyun.com/msys2/distrib/x86_64/msys2-x86_64-20230318.exe。
下载后直接按步骤安装就行,本人安装于D:/msys64,后续也以该目录进行讲解。
2.3 MSYS2配置
修改msys2_shell.cmd
- 安装完成之后,先把安装目录下的msys2_shell.cmd中注释掉的
rem set MSYS2_PATH_TYPE=inherit
改成set MSYS2_PATH_TYPE=inherit
,这是为了将vs的环境继承给MSYS2。
修改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/
修改验证方式
要先修改 msys64\etc*pacman.conf(大概40行),修改后:*
SigLevel = Never
#SigLevel = Required
#LocalFileSigLevel = Optional
通过vs2019命令行启动msys2
D:\msys64\msys2_shell.cmd 文件修改完毕,通过x64 Native Tools Command Prompt for VS 2019 这个命令工具打开命令行窗口:
点击 x64 Native Tools Command Prompt for VS 2019 打开命令行,目的是让 msys2 来继承vs2019 的环境变量,即是set MSYS2_PATH_TYPE=inherit 的意义。
启动后的界面:
**启动命令行窗口,**在窗口中输入:
#进入msys2安装目录
D:
cd D:\msys64
#如果要打开msys2的mingw64窗口
msys2_shell.cmd -mingw64
#如果要打开msys2的msys窗口
#msys2_shell.cmd
效果如下所示:
然后在msys2的shell中执行:
pacman -Sy
刷新软件包数据。
2.4 安装编译环境
2.4.1安装mingw-w64
在前面的基础上在shell窗口中输入:
pacman -S mingw-w64-x86_64-toolchain
然后默认全部安装即可(直接回车)。
2.4.2 安装git
安装git:任一方式打开shell窗口输入:
pacman -S git
2.4.3 安装make等工具
pacman -S make
pacman -S automake
pacman -S autoconf
pacman -S perl
pacman -S libtool
pacman -S mingw-w64-i686-cmake
# 这里应该是安装的 x86_64的cmake,课上安装mingw-w64-i686-cmake 虽然也没影响编译
pacman -S mingw-w64-x86_64-cmake
pacman -S pkg-config
如果需要编译出ffplayer的话,还需要安装SDL
pacman -S mingw-w64-x86_64-SDL2
2.4.4 安装YASM
pacman -S yasm
2.4.5 安装nasm
编译当前最新x264时需要用到nasm。
pacman -S nasm
2.4.6 修改支持中文显示
窗口右键->Options->Text,然后locale选择:zh_CN,Character set 选择 UTF-8。
3 源码编译第三方库和FFmpeg
3.1 创建ffmpeg目录
在home目录下创建
ffmpeg6.0_sources:用于下载源文件
cd ~
mkdir ffmpeg6.0_sources
这里增加6.0的标识是为了和其他ffmpeg版本做区分。
3.2 源码编译第三方库
3.2.1 libx264
H.264视频编码器。更多信息和使用范例参考H.264 Encoding Guide
要求编译ffmpeg时配置:–enable-gpl --enable-libx264.
使用源码进行编译:
cd ~/ffmpeg6.0_sources
git clone --depth 1 https://github.com/mirror/x264.git
cd x264
CC=cl ./configure --enable-shared
make
make install
cp /usr/local/lib/libx264.dll.lib /usr/local/lib/libx264.lib
默认安装到: /usr/local/lib,需要注意到是被安装的文件名为libx264.dll.lib,需要自己手动改名为libx264.lib
3.2.2 libx265
H.265/HEVC 视频编码器, 更多信息和使用范例参考H.265 Encoding Guide。
要求编译ffmpeg时配置:–enable-gpl --enable-libx265.
x265的安装和x264有区别,x265不要使用 msys2 当中的cmake, 因为msys-cl 目录下生成的make-Makefiles.sh 文件是VS调用的Makefile文件,而不是make的,并且稍候要使用nmake来进行编译。
修改文件:如果发现 msys的 usr/bin目录下已经包含cmake, 则将其改名:ccmake.exe
mv /mingw64/bin/cmake.exe /mingw64/bin/ccmake.exe
编译项目:
cd ~/ffmpeg6.0_sources
git clone https://gitee.com/mirrors_videolan/x265.git
cd x265/build/msys-cl
./make-Makefiles.sh
# 将编译好的文件拷贝到需要的目录,这里如果直接使用nmake install安装则实际是安装到vs2019对应的安装路径,所以手动拷贝
cp x265.exe libx265.dll /usr/local/bin
# 这里改下名字,265是打开x265.lib
cp libx265.lib /usr/local/lib/x265.lib
cp x265-static.lib /usr/local/lib/
cp x265_config.h /usr/local/include/
cp ../../source/x265.h /usr/local/include/
cp x265.pc /usr/local/lib/pkgconfig/
然后进到/usr/local/lib/pkgconfig/目录修改x265.pc的配置,将其
prefix=C:/Program Files (x86)/x265
改成
prefix=/usr/local
3.2.3 libfdk-aac
AAC音频编码器. 更多信息和使用范例参考AAC Audio Encoding Guide。
要求编译ffmpeg时配置:–enable-libfdk-aac ( 如果你已经配置了 --enable-gpl则需要加上–enable-nonfree).
cd ~/ffmpeg6.0_sources
git clone https://github.com/mstorsjo/fdk-aac.git fdk-aac-2.0.1
cd fdk-aac-2.0.1
git checkout v2.0.1
# 先把msys2的link改名,因为这里需要使用vs2019的link
mv /usr/bin/link.exe /usr/bin/link-bk.exe
# 编译
nmake -f Makefile.vc all
# 安装,安装后fdk相关的头文件、库文件就和x264 x265同样的目录了
nmake -f Makefile.vc prefix=/usr/local install
# 恢复link.exe
mv /usr/bin/link-bk.exe /usr/bin/link.exe
然后在/usr/local/lib/pkgconfig目录 创建fdk-aac.pc并添加以下内容:
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: Fraunhofer FDK AAC Codec Library
Description: AAC codec library
Version: 2.0.1
Libs: -L${libdir} -lfdk-aac
Libs.private:
Cflags: -I${includedir}
3.2.4 配置SDL2
记得ffmpeg配置支持 --enable-sdl2
sdl2下载 下载VC版本,解压并放到D:\msys64\usr\local对应的目录。
1 配置sdl2对msvc可见
显然,sdl2头文件和库文件必须让编译器可以找到, 可以把头文件目录添加到INCLUDE环境变量,将库文件目录添加到LIB环境变量 在MSYS2控制台执行。
比如:
export INCLUDE=$INCLUDE";D:\msys64\usr\local\include\SDL2"
export LIB=$LIB";D:\msys64\usr\local\lib"
将对应的文件路径替换成自己的文件路径。
然后可以通过echo $LIB 查看情况。
2 配置sdl2对pkg-config可见
在D:\msys64\usr\local\lib\pkgconfig目录新建sdl2.pc 文件,编辑如下
prefix==/usr/local
exec_prefix=${prefix}
libdir=${prefix}/lib
includedir=${prefix}/include
Name: sdl2
Description: Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer.
Version: 2.26.5
Requires:
Conflicts:
Libs: -L${libdir} -lSDL2main -lSDL2
Cflags: -I${includedir}
3.3 源码编译FFmpeg
3.3.1 下载和编译源码
下载代码
cd ~/ffmpeg6.0_sources
git clone https://github.com/FFmpeg/FFmpeg.git
cd FFmpeg
git checkout remotes/origin/release/6.0
# 返回上一级别
cd ..
# 拷贝一份ffmpeg源码,因为原始的ffmpeg编译代码在msvc编译器有些地方报错,需要做修改
cp -arf FFmpeg ffmpeg6.0
github不稳定,有时候连不上,有时候速度又还挺快的。
修改ffmpeg6.0目录的源码
fftools\ffprobe.c注释
fftools\opt_common.c注释
进入ffmpeg6.0代码编译
cd ffmpeg6.0
CC=cl.exe PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/ ./configure --toolchain=msvc --enable-shared --enable-ffplay --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-sdl2 --enable-gpl --enable-nonfree --disable-optimizations --disable-stripping
这里没有做编译优化,目的是学习过程中方便debug ffmpeg api源码。
报错分析:
3.3.2 测试ffmpeg命令
(ffmpeg命令都会正常,不需要测试)
测试ffplay是否正常(有一个能正常播放就行),链接不保证都有效(网上的链接经常失效, 也可以播放本地文件测试)
ffplay.exe http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4
ffplay.exe http://mirror.aarnet.edu.au/pub/TED-talks/911Mothers_2010W-480p.mp4
如果需要更多的视频测试文件,可以到https://sample-videos.com/index.php#sample-mp4-video下载。