所需工具:
- win10
- ffmpeg3.36.tar.gz。 或其他版本,下载地址:Index of /releases
- msys2。 下载地址:http://www.msys2.org。
- Visual Studio 2017。
1. 安装MSYS
MSYS2像是windows下的一个子系统,它把windows里面的命令进行封装,并穿上了一层linux命令的外衣,使得在msys中可以使用linux命令,但实际执行的是windows的命令。
下载后,按照提示进行安装。我是直接安装在E盘:E:/MSYS2。
将安装目录放在系统的环境变量中:E:/MSYS2。
1.1)修改msys的镜像源
目标文件为"msys64\etc\pacman.d\mirrorlist.msys",将内容改为:
##
## MSYS2 repository mirrorlist
##
## Primary
## msys2.org
Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch/
Server = http://repo.msys2.org/msys/$arch
Server = http://downloads.sourceforge.net/project/msys2/REPOS/MSYS2/$arch
Server = http://www2.futureware.at/~nickoe/msys2-mirror/msys/$arch/
然后保存。
1.2)配置msys2的cmd.
使用记事本或Notepad++打开 msys2 安装目录下的 "msys2_shell.cmd" 文件,将里面的第17行, "rem set MSYS2_PATH_TYPE=inherit" 改成 "set MSYS2_PATH_TYPE=inherit",然后点击保存。
1.3)下载编译ffmpeg需要的工具
主要需要:make, gcc, diffutils, yasm, pkg-config, 这四个工具。
双击"msys2_shell.cmd"文件,打开 shell 窗口,在 shell 中输入下面命令:
pacman -S make gcc diffutils yasm pkg-config
pacman 是msys下的安装api的工具。
1.4) 修改"E:\Windows Kits\10\Include\10.0.17763.0\um\winsock.h"代码
这应该是安装VS2017时配置的文件夹,大家可以找找自己放在什么位置。用notepad++打开winsock.h, 在首行添加“#include<winsock2.h>”,如下:
否则,会报错。
2. 编译ffmpeg
2.1)修改ffmpeg代码
cd 到 ffmpeg 源码目录进行编译。我是把ffmpeg源码文件夹放在了msys里面的home文件夹下,具体路径为:E:\MSYS2\home\wzg16\ffmpeg。
(1)修改"ffmpeg/config.h"
用notepad++打开"ffmpeg/config.h",搜索“CC_IDENT”,把包含这个字符的行用“//”注释掉,或者把里面的汉字删除, 否则在编译中会报错。
(2)修改 "E:\MSYS2\home\wzg16\ffmpeg\ffprobe.c"
用notepad++打开ffmpeg\ffprobe.c,搜索“CC_IDENT”,把包含这个字符的行用“//”注释掉,一共是一行:
//print_str("compiler_ident", CC_IDENT); // 我的这一句在2968行
(3)修改 "E:\MSYS2\home\wzg16\ffmpeg\cmdutils.c"
用notepad++打开ffmpeg\cmdutils.c,搜索“CC_IDENT”,把包含这个字符的行用“//”注释掉,一共是一行:
//av_log(NULL, level, "%sbuilt with %s\n", indent, CC_IDENT);//第1119行
(3)不修改会带来以下错误。
如果以上两行代码不注释,会在编译过程中带来以下error,错误原因是CC_IDENT宏没有被定义。
fftools/ffprobe.c(3047): error C2001: 常量中有换行符
...
fftools/cmdutils.c(1119): error C2065: “slib”: 未声明的标识符
fftools/cmdutils.c(1119): error C2296: “%”: 非法,左操作数包含“char [138]”类型
fftools/cmdutils.c(1119): error C2059: 语法错误:“数字上的错误后缀”
fftools/cmdutils.c(1119): error C2059: 语法错误:“%”
fftools/cmdutils.c(1119): error C2017: 非法的转义序列
fftools/cmdutils.c(1119): error C2001: 常量中有换行符
fftools/cmdutils.c(1150): error C2143: 语法错误: 缺少“)”(在“*”的前面)
fftools/cmdutils.c(1150): error C2143: 语法错误: 缺少“{”(在“*”的前面)
...
2.2)打开VS2017的cmd,进入msys
点击电脑的开始菜单,依次找到 "Visual Studio 2017" -> "x86 Native Tools Command Prompt For VS 2017)"(x86编译出来的库是32位,x64编译出来的是64位的)。
在弹出的窗口中,输入"msys2_shell.cmd"。
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v16.6.5
** Copyright (c) 2020 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x86'
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community>msys2_shell.cmd
此时会打开一个新的窗口,如下图所示:
通过cd命令,进入ffmepg文件夹。
注意:msys里面,是以home为根目录的。
我是把ffmepg解压后放在home文件夹下,所以,cd命令是:
cd ffmpeg/
2.3)开始编译
编译命令如下:
./configure --toolchain=msvc --enable-shared --prefix=windows # 安装在当前目录的windows文件夹下
make -j 12 # -j 12 表示12线程 # 如果不执行步骤2.1,这里会报错。
make install
编译命令中,--prefix=windows,用于指定了编译结果的存放目录在ffmpeg源码文件夹下,创建了一个名为“windows”的文件夹。等待一段时间,编译结束。
2.4)编译结果:
编译成功后,如下所示:
- bin :该目录存放了 dll 和 lib 文件,例如:avcodec.lib、avcodec-58.dll
- include:该目录存放了头文件,例如:libavcodec/avcodec.h
- lib:该目录存放了 pkgconfig 文件
- share:该目录存放了一些示例代码,例如:muxing.c
参考:
【FFmpeg笔记】04-Win10编译ffmpeg4.2.1(For Windows)_win10 安装ffmpeg4.2-CSDN博客
VS2015编译ffmpeg 3.4.2报错“slib”: 未声明的标识符_vs2017 编译的ffmpeg “slib”: 未声明的标识符-CSDN博客