windows环境编译ffmpeg +visual studio 2022

最近在配置ffmpeg环境,记录一下坑点。

系统环境

visual stdio 2022 安装c++桌面开发人员版 大概8g 实际下载2g左右,配置齐全其余不选。

然后环境配置,这里我使用别人的图,路劲都差不多。找到VS即可

PATH配置:

编译

MSYS2 是一个在 Windows 上运行的 Unix 环境和软件发行版。它提供了一个基于 Cygwin 的 Bash shell 和一组常用的 Unix 工具,帮助开发者在 Windows 上使用 Unix 风格的工作流程。

MSYS2 的主要特点包括:

  1. 基于 Cygwin 构建,提供了一个完整的 Bash shell 环境。

  2. 集成了 MinGW-w64 工具链,支持在 Windows 上编译 C/C++ 程序。

  3. 拥有丰富的软件包仓库,可以通过 pacman 包管理器安装各种 Unix 工具。

  4. 兼容性强,可以与 Visual Studio、Git 等 Windows 开发工具无缝集成。

  5. 易于安装和更新,能够快速建立开发环境。

在使用 ffmpeg 等开源软件时,MSYS2 环境可以提供以下便利:

  1. 提供 Bash shell 及常用 Unix 命令,方便执行编译等操作。

  2. 集成了 MinGW 工具链,能够直接在 Windows 上编译 ffmpeg 源代码。

  3. 可以通过 pacman 安装 ffmpeg 所需的依赖库,简化编译配置。

  4. 与 Windows 开发工具良好兼容,方便开发者的整体工作流程。

总之,MSYS2 是 Windows 平台上非常有价值的 Unix 开发环境,在使用 ffmpeg 等开源软件时可以发挥重要作用。如果您还有其他问题,欢迎继续询问。

简单理解:msys2能够在windows正常使用linux子系统,黑窗口编程。

MSYS2开发环境搭建

cpp 复制代码
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

cpp 复制代码
提前在/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

cpp 复制代码
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编译文件分析

  1. libx265.dll

    • 这是 x265 编码器的动态链接库文件。

    • 它提供了 x265 编码器的动态链接 API,可以被其他程序调用使用。

    • 如果你需要在程序中使用 x265 编码器,可以链接和加载这个 DLL 文件。

  2. libx265.explibx265.lib

    • 这两个文件是为 libx265.dll 服务的。

    • libx265.exp 描述了 DLL 中公开的函数和变量。

    • libx265.lib 是静态链接库文件,在链接其他程序时使用它来链接 libx265.dll

  3. libx265.pdb

    • 这是 libx265.dll 的程序数据库文件。

    • 它包含了动态链接库的调试信息,可用于调试 libx265.dll

  4. x265-static.lib

    • 这是 x265 编码器的静态链接库文件。

    • 如果你需要在程序中静态链接 x265 编码器,可以使用这个文件。

  5. x265.exe

    • 这是 x265 编码器的独立可执行文件。

    • 它可以直接用于命令行编码视频文件。

  6. x265.h

    • 这是 x265 编码器的头文件。

    • 它定义了 x265 API 的函数和数据结构。

    • 如果你需要在程序中使用 x265 编码器,需要包含这个头文件。

  7. x265.pc

    • 这是 x265 的 pkg-config 文件。

    • 它提供了一些编译和链接 x265 的相关信息。

  8. x265.pdb

    • 这是 x265.exe 可执行文件的程序数据库文件。

    • 它包含了可执行文件的调试信息,可用于调试 x265.exe

  9. x265_config.h

    • 这是 x265 编码器的配置头文件。

    • 它定义了一些编译时的宏和选项。

可以理解为

static版本是静态库,可以单独使用,缺点是编译时代码量会增大。

dll版本有两个文件 lib是桥梁 dll是动态库 优点是动态加载,不会增加编译时间。

在使用时需要修改.pc文件prefix=路劲字段

3.下载编译 fdk-aac

cpp 复制代码
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

cpp 复制代码
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

cpp 复制代码
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博客

相关推荐
算法歌者16 分钟前
Visual Studio 项目 .gitignore 文件指南
git·visual studio
不要数手指啦28 分钟前
Apifox使用方法
windows
翻滚吧键盘1 小时前
idea中ctrl+/注释,总是出现在最前行
java·ide·intellij-idea
Sapphire~10 小时前
odoo-049 Pycharm 中 git stash 后有pyc 文件,如何删除pyc文件
ide·git·pycharm
heart000_110 小时前
IDEA 插件推荐:提升编程效率
java·ide·intellij-idea
IT专业服务商11 小时前
联想 SR550 服务器,配置 RAID 5教程!
运维·服务器·windows·microsoft·硬件架构
海尔辛11 小时前
学习黑客5 分钟小白弄懂Windows Desktop GUI
windows·学习
笨鸭先游11 小时前
Android Studio的jks文件
android·ide·android studio
gushansanren11 小时前
基于WSL用MSVC编译ffmpeg7.1
windows·ffmpeg
伐尘12 小时前
【Qt】编译 Qt 5.15.x For Windows 基础教程 Visual Studio 2019 MSVC142 x64
windows·qt·visual studio