最近在配置ffmpeg环境,记录一下坑点。
系统环境
visual stdio 2022 安装c++桌面开发人员版 大概8g 实际下载2g左右,配置齐全其余不选。
然后环境配置,这里我使用别人的图,路劲都差不多。找到VS即可
PATH配置:
编译
MSYS2 是一个在 Windows 上运行的 Unix 环境和软件发行版。它提供了一个基于 Cygwin 的 Bash shell 和一组常用的 Unix 工具,帮助开发者在 Windows 上使用 Unix 风格的工作流程。
MSYS2 的主要特点包括:
-
基于 Cygwin 构建,提供了一个完整的 Bash shell 环境。
-
集成了 MinGW-w64 工具链,支持在 Windows 上编译 C/C++ 程序。
-
拥有丰富的软件包仓库,可以通过 pacman 包管理器安装各种 Unix 工具。
-
兼容性强,可以与 Visual Studio、Git 等 Windows 开发工具无缝集成。
-
易于安装和更新,能够快速建立开发环境。
在使用 ffmpeg 等开源软件时,MSYS2 环境可以提供以下便利:
-
提供 Bash shell 及常用 Unix 命令,方便执行编译等操作。
-
集成了 MinGW 工具链,能够直接在 Windows 上编译 ffmpeg 源代码。
-
可以通过 pacman 安装 ffmpeg 所需的依赖库,简化编译配置。
-
与 Windows 开发工具良好兼容,方便开发者的整体工作流程。
总之,MSYS2 是 Windows 平台上非常有价值的 Unix 开发环境,在使用 ffmpeg 等开源软件时可以发挥重要作用。如果您还有其他问题,欢迎继续询问。
简单理解:msys2能够在windows正常使用linux子系统,黑窗口编程。
MSYS2开发环境搭建
1.下载链接
https://www.msys2.org/
下载安装MSYS2(按照官⽹安装到⾃⼰指定的⽬录下,本⼈安装于D:/msys64)
2.安装完成之后,先把安装⽬录下的msys2_shell.cmd中注释掉的
rem set MSYS2_PATH_TYPE=inherit 改成
set MSYS2_PATH_TYPE=inherit
这是为了将vs的环境继承给MSYS2。
2.1 修改pacman的源 加入国内包下载域
cd msys64\etc\pacman.d\
编辑 /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.修改验证方式
要先修改 msys64\etc\pacman.conf(大概40行),修改后:
SigLevel = Never
#SigLevel = Required
#LocalFileSigLevel = Optional
4.启动msys2
通过x64 Native Tools Command Prompt for VS 2019 这个命令工具打开命令行窗口: 4.1
点击 x64 Native Tools Command Prompt for VS 2019 打开命令行,目的是让 msys2 来继承vs2019 的环境变量,即是set MSYS2_PATH_TYPE=inherit 的意义。
启动后的界面:
D:
cd D:\msys64
msys2_shell.cmd -mingw64
源码编译第三方库和FFmpeg
1.x264
提前在/home/jbj/ffmpeg/build 创建
mkdir libmp3lame libfdk-aac libvpx
cd ~/ffmpeg
git clone --depth 1 https://github.com/mirror/x264.git
cd x264
进入cmd 输入模式一切运行正常
cmd
powershell
CC=cl ./configure --enable-shared --prefix=...
make
make install
cp /usr/local/lib/libx264.dll.lib /usr/local/lib/libx264.lib
2.x265
2.x265
cd ~/ffmpeg6.0_sources
git clone https://gitee.com/mirrors_videolan/x265.git
cd x265/build/msys-cl
进入cmd 输入模式一切运行正常
cmd
powershell
./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/
这里插入一条将项目变为动静态库方法
方法1 :编译好后存在下列文件,cp到目录
cp ./libx264.def /home/jbj/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
方法2: 使用vs 重新生成项目,问题在于没有.sin,那就可以构建它
x265举例 下列命令会以source 源代码构架一个符合vs的工程 得到工程之后重新生成 在debug就有了lib dll等等文件 .pc在工程目录
cmake -G "Visual Studio 17 2022" -S ./source -B ./build/project
d----- 2024-08-08 13:49 .git
d----- 2024-08-08 13:49 build
d----- 2024-08-08 13:49 doc
d----- 2024-08-08 13:49 source
-a---- 2024-08-08 13:49 122 .hgignore
-a---- 2024-08-08 13:49 18120 COPYING
-a---- 2024-08-08 13:49 826 readme.rst
-a---- 2024-08-08 13:49 125 x265Version.txt
vs编译文件分析
-
libx265.dll
:-
这是 x265 编码器的动态链接库文件。
-
它提供了 x265 编码器的动态链接 API,可以被其他程序调用使用。
-
如果你需要在程序中使用 x265 编码器,可以链接和加载这个 DLL 文件。
-
-
libx265.exp
和libx265.lib
:-
这两个文件是为
libx265.dll
服务的。 -
libx265.exp
描述了 DLL 中公开的函数和变量。 -
libx265.lib
是静态链接库文件,在链接其他程序时使用它来链接libx265.dll
。
-
-
libx265.pdb
:-
这是
libx265.dll
的程序数据库文件。 -
它包含了动态链接库的调试信息,可用于调试
libx265.dll
。
-
-
x265-static.lib
:-
这是 x265 编码器的静态链接库文件。
-
如果你需要在程序中静态链接 x265 编码器,可以使用这个文件。
-
-
x265.exe
:-
这是 x265 编码器的独立可执行文件。
-
它可以直接用于命令行编码视频文件。
-
-
x265.h
:-
这是 x265 编码器的头文件。
-
它定义了 x265 API 的函数和数据结构。
-
如果你需要在程序中使用 x265 编码器,需要包含这个头文件。
-
-
x265.pc
:-
这是 x265 的 pkg-config 文件。
-
它提供了一些编译和链接 x265 的相关信息。
-
-
x265.pdb
:-
这是
x265.exe
可执行文件的程序数据库文件。 -
它包含了可执行文件的调试信息,可用于调试
x265.exe
。
-
-
x265_config.h
:-
这是 x265 编码器的配置头文件。
-
它定义了一些编译时的宏和选项。
-
可以理解为
static版本是静态库,可以单独使用,缺点是编译时代码量会增大。
dll版本有两个文件 lib是桥梁 dll是动态库 优点是动态加载,不会增加编译时间。
在使用时需要修改.pc文件prefix=路劲字段
3.下载编译 fdk-aac
3.下载编译 fdk-aac
cd ~/ffmpeg
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
# 编译 在windows黑创进行 cmd powershell
nmake -f Makefile.vc all
# 安装,安装后fdk相关的头文件、库文件就和x264 x265同样的目录了
nmake -f Makefile.vc prefix=/usr/local install
然后在/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}
4.配置SDL2
4.配置SDL2
https://www.yuque.com/linuxer/uv7x5q/hpato3deri5zbqfk?singleDoc#UmVM9
下载 SDL2-devel-2.30.6-VC.zip
cp SDL2-devel-2.30.6-VC/include/ /usr/local/include/sdl2/
cp SDL2-devel-2.30.6-VC/lib/ /usr/local/include/lib/
cp SDL2-devel-2.30.6-VC/lib/pkgconfig/sdl2.pc /usr/local/include/lib/sdl2.pc
配置sdl2对pkg-config
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}
vim ~/.barsh
export INCLUDE=$INCUDLE"/usr/local/include/SDL2"
export LIB=$LIB";/usr/local/lib"
5.源码编译FFmpeg
5.源码编译FFmpeg
cd ~/ffmpeg
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
修改ffmpeg6.0目录的源码fftools\ffprobe.c注释
如图1
fftools\opt_common.c注释
如图2
进入ffmpeg6.0代码编译
cd ffmpeg6.0
编译 在windows黑创进行 cmd powershell
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
make
make install
测试ffmpeg命令 一条行就是成功
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
总结:
1.坑有点多,主要出现在路劲上。比如export LIB=$LIB";D:\msys64\usr\local\lib" 加入了也没什么用,应该是msys2子系统不能识别D:xxxx 使用/usr/local/lib这种方法就可以。
2.在编译三方库时不是很顺利,CC=cl --toolchain=msvc 反正关于msvc编译器的命令,就有问题。 比如在msys2黑窗口 使用CC=cl 有可能引发声明了但未定义的问题(有cl命令但是就是报cl无法使用),猜测是有命令但是没有识别到命令动态库 建议在windows黑窗口使用 因为windwos肯定能寻到vs命令,就不需要太在意环境问题。 比如: CC=cl ./configure --enable-shared 参数.... --prefix=../../../usr/local/ 一定要用这种安装路劲方式,绝对路劲不行。
参考学习
VS2019 | Visual Studio编译器cl.exe环境变量配置 | cl命令行选项 | fatal error C1034:不包括路径集_visual studio2019环境变量设置-CSDN博客
Windows11编译x265源码生成Visual Studio工程详细步骤_windows x265-CSDN博客
Windows使用MSYS2编译x265并集成进ffmpeg_windows编译ffmpeg集成x265-CSDN博客
Windows使用MSYS2编译x265并集成进ffmpeg_windows编译ffmpeg集成x265-CSDN博客
ffmpeg5.0+h264+h265 windows下编译方法-CSDN博客