用 Visual Studio 2019 编译 FFmpeg 简单教程

  • Post author:
  • Post category:其他


需要的东西:

● Visual Studio 2019

这个自行解决吧,本人用的是社区版

● MSYS 环境,去 https://www.msys2.org/ 下载

本人下载的是【msys2-x86_64-20210725.exe】

● yasm.exe,去 http://yasm.tortall.net/Download.html 下载

本人下载的是【yasm-1.3.0-win64.exe】

● FFmpeg源码,去

Download FFmpeg

就选择 FFmpeg 4.4 “Rao” 吧

● 如果要编译 ffplay,去

Simple DirectMedia Layer – Homepage

本人下载使用的是【SDL2-devel-2.0.14-VC.zip】

一、配置MSYS2 环境

● 双击下载下来的可执行程序【msys2-x86_64-20210725.exe】,使用默认,一直点击“下一步”直至安装完毕。默认安装目录是【C:\msys64】。

● 然后,把【


yasm-1.3.0-win64.exe


】复制到【


C:\msys64\usr\bin


】下,改名为【


yasm.exe


】。

● 把【


C:\msys64\usr\bin\


】下的


link.exe


改为其他名,比如【


link_old




.exe


】,虽然不耽误本教程所涉及的东西的结果,但改不改,随看官喜欢了。

● 修改文件【C:\msys64\msys2_shell.cmd】,改之前先备份一下该文件。

把第17行前面的

rem

删掉,修改后如图:

MSYS安装完后,开始菜单上应该会创建4个快捷方式:

这些快捷方式指向了同一个msys2_shell.cmd,不过参数不同。

C:\msys64\msys2_shell.cmd -mingw32

C:\msys64\msys2_shell.cmd -mingw64

C:\msys64\msys2_shell.cmd -ucrt64

C:\msys64\msys2_shell.cmd -msys


2022年10月新版:msys2-x86_64-20221028.exe,安装向导生成的快捷方式指向的是独立的可执行文件,这样本文方法则无效了。经过测试,发现可以修改快捷方式(注意备份),按照上面的修改就可以了。不知道上述方式还能有效坚持到哪个版本……(lll¬ω¬)

所以用关键字【”


MINGW32


“】(有引号哦),从头搜索文件【C:\msys64\msys2_shell.cmd】的内容,在如下位置找到:

在 101 行下面插入下面内容:

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat

这是32位编译环境,如果要想编译64位的话,在104行下面,插入下面内容:

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat

如图:

● 本人编译32位的,所以,通过快捷方式【MSYS2 MinGW 32-bit】启动 MSYS2 环境。

执行命令”cl” 就是 vc用的编译器 cl.exe。

● 但这个时候,没有包:gcc、pkg-config、diffutils、make,其实就是常见编译工具。通过执行命令安装:

pacman -S gcc pkg-config diffutils make

这个时候,本教程需要的编译环境,就配置好了,如有其他需求,再另行相应配置。

二、编译ffmpeg, ffprobe

编译环境配置好后,解压 ffmpeg 源码到任意目录,然后从 msys2 环境进入该目录,执行配置命令:

$ ./configure –enable-shared –toolchain=msvc –enable-gpl

因为本教程仅为一般目的而编译ffmpeg,所以,配置命令就是这么简单,各位按需修改,

–enable-shared     构建共享库

–toolchain=msvc   使用vc

显然,“使用vc”这个参数是必须的,不然一切可能就更简单了。上述命令执行后,正常情况是等一会,看你的机器快慢了,然后输出一堆简报式内容。

接着,命令:

make -j4

这就是 make 了,成功后,源码目录下会生成 ffmpeg.exe、ffprobe.exe可执行文件,而 libavcodec、libavdevice 等子目录下会生成 avdevice.lib、avdevice-58.dll,avcodec.lib、avcodec-58.dll 等 ffmpeg 共享库文件。

那 ffplay.exe 呢,其实刚编译成功后发现没有它,我也挺惊讶的,不过马上就释然了,你都没放置、指定SDL2库,它咋能编译出来啊?不过我没去研究如何在这里编译出来,因为我本来的目的是在Visual Studio 中F5 编译启动调试运行。本节内容至少要成功走过一遍,再继续后面的内容。

三、建立 Visual Studio 解决方案

利用向导,建立3个空的控制台工程。分别命名为ffmpeg, ffprobe, ffplay。

在任意目录下建立解决方案都行,不用复制移动文件,全是通过【右键工程项目结点】->【添加】->【现有项】这个过程把原有源码文件添加进新建的工程里,如图,红色圈内的目录是源码目录,选中的那个就是VS解决方案目录,其他的可以忽略,你可以参考这个:

目前添加的源码文件,都在这个目录下,所以路径前缀就省了:

(略…)\ffmpeg-4.4\fftools\

● ffmpeg 需要文件:

cmdutils.h  cmdutils.c  ffmpeg.c  ffmpeg.h

ffmpeg_filter.c  ffmpeg_hw.c  ffmpeg_opt.c

● ffprobe 需要文件:

cmdutils.h  cmdutils.c  ffprobe.c

● ffplay 需要文件:

cmdutils.h  cmdutils.c  ffplay.c

设置好附加包含目录,附加库目录,附加依赖项,就可以编译了。

我下的版本,用 Visual Studio 2019 编译会出现若干编译错误:

● config.h(9,1): error C2001: 常量中有换行符

与文件保存编码有关,这个文件使用脚本生成的,其在VS中查看,编码是【Unicode (UTF-8 无签名) – 代码页 65001】,其实就是没有BOM,换成【Unicode (UTF-8 带签名) – 代码页 65001】即可。

ffmpeg_opt.c(448): error C4703: 使用了可能未初始化的本地指针变量“allow_unused”

这个顾名思义,F12定位到声名之处,改为【


char *allow_unused = NULL;


】即可。还有几处都是未初始化, 初始化为NULL即可。

cmdutils.obj : error LNK2019: 无法解析的外部符号 _avresample_version,函数 _print_all_libs_info 中引用了该符号

这个其实挺奇妙的,不知道为啥,不过这两函数真没啥用,在 cmdutils.c 文件的 print_all_libs_info 函数内,注释掉第 1137 行:

//PRINT_LIB_INFO(avresample, AVRESAMPLE, flags, level);

四、完

源码工程可以参考

《用VisualStudio2019编译FFmpeg简单教程》一文的配套工程-编解码文档类资源-CSDN下载



版权声明:本文为fly4free原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。