上一篇说了下linux平台下ffmpeg编译的问题
这里来看看windows平台的ffmpeg编译的问题。我们要编译windows平台下使用的ffmpeg,无外乎是两种方式,一种交叉编译,一种本地编译。交叉编译的话,就是在其他环境下编译windows平台适用的程序或者库。我们需要做的就是安装好交叉编译环境。另外一种本地编译,因为ffmpeg代码的特殊性,我们需要在windows系统里安装类unix环境。也就是在网上经常看到的msys一类的软件。
闲话不多说 我们来看看官网是怎么说的吧(感觉有点过时,读懂个意思就好)
![](https://i-blog.csdnimg.cn/blog_migrate/8946000bc1293cd6f7e8c337536b5aec.png)
1.本地编译 使用(MinGW OR MinGW-w64)+
MSYS2
2.Microsoft Visual C++ OR Intel C++ 编译
3.Windows和linux 交叉编译
4.
CygWin下的编译
5.
Windows在cygwin下的交叉编译
从ffmpeg的wiki来看 也有好几个(突然好想哭的感觉)
![](https://i-blog.csdnimg.cn/blog_migrate/19d357cb84b9f3180af8c4b77b2e5838.png)
1.
使用windows/mingw/msys编译ffmpeg
2.交叉编译
3.
编译Windows应用程序的FFMPEG
4.
用msvc编译ffmpeg
不管怎样 我们都需要知道里面的一些知识点
类似什么
MinGW MSYS
CygWin
msvc 你要是啥也不知道 那也没办法 问度娘来的总轻松一些
我自己有一篇笔记“
Cygwin、Msys、MinGW、Msys2的区别与联系
” 如果忘了可以看下
而msvc其实就是
MSVC,就是微软(MS)的VC运行库
我们就来按照WIKI的四个来一个个编译
1.MinGW+MSYS
为了在Windows上编译FFMPEG,需要安装MinGW环境和一些严格需要的工具。
官方的wiki上面说我们的编译器有两种选择
- MinGW-w64
- MinGW "mainline"
在wiki也说了 两个的功能都是提供需要的gcc 不过较为推荐前者,
前者比后者的最新版本稍多一些,而且提供了更多的库兼容性,比如DirectShow头,所以最好使用mingw-w64。
我这边直接下载了在线安装包 但是在安装的时候 提示我已经下载过了 一直没办法安装
我的安装路径是默认的 没有去管
C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0
之后就是添加系统变量啥的 关于这个的安装 网上一大堆资料 这里就不细说
之后就是MSYS了 这个其实就是提供了几个gnu的工具
在WIKI也有两个推荐
MSys or MSYS2
关于MYSY的使用 WIKI上面说:
在msys 2安装中运行mingw 32_shell.bat或mingw 64_shell命令。请注意不要运行msys 2 shell,因为这将导致ffmpeg的构建出问题。
之后就是在MSYS上面安装一些需要的package
pacman -S make
pacman -S diffutils
pacman -S yasm
注意:wiki上面 这部分后面的安装MinGW只是说也可以直接在Msys上面直接安装 我们上面已经安装了 就不要自找麻烦了
到此为止我认为就可以了 毕竟我现在只是测试 什么git、sdl都不用 只要能够编译ffmpeg就好了
但是 我在Msys提供的那个壳子上开始编译的时候 它提示我不能用gcc
仔细一想 确实两个软件之间没有建立什么联系 人家msys也不知道你有没有安装MinGW 如果你在壳子里面自己安装了那还好说
所以我就把MinGW安装好的文件夹 和Msys目录下的mingww64文件夹合并了
如果对这两个软件有点糊涂 可以来看下我的另一篇笔记“
Windows下搭建类UNIX环境 : Msys2+MinGW-w64
”
只要在壳子上 你能够用gcc就说明可以了 gcc -v
之后直接编译ffmpeg就好了 wiki上面还写了一些其他的依赖库的问题 可以参考一下
之前make的时候 直接出现了错误 说是找不到什么dll 我后面也没去管 直接去弄后边的几种方法 结果发现 后边的几种方法都用不了 没办法 我就先把之前做的当做理论自学一遍
晚上 我重新来了一遍 git了下ffmpeg的3.2.2版本的代码
我也不用mingw_w64的gcc编码器 直接用Msys2来安装一个
我们的
mingw_w64的gcc版本可以来看下
![](https://i-blog.csdnimg.cn/blog_migrate/8de112c11a09dd3d366366c25f460225.png)
pacman -S make diffutils yasm mingw-w64-x86_64-gcc
安装的有点久
下面来看一下gcc的版本
![](https://i-blog.csdnimg.cn/blog_migrate/2b543d6ee23e20cf84bcd94d42db9584.png)
当然 我为了以防万一 还安装了pkg-config(
pacman -S pkg-config
)
接下来 我把从网上下载的
yasm-1.3.0-win64.exe
替换掉msys2安装的那个 yasm.exe
在壳子上转到代码目录
直接./configure --enable-shared
make
make install
之后就在msys安装目录下的usr/local目录下看到编译好的东西了
这个也算是比较简单 只是我之前一直在兜圈子 有点蒙
这个是我直接安装msys,在壳子上安装需要的东西 之后直接编译(3.2.2版本的ffmpeg)
下面还是这种编译方式 只不过 我们的编译器使用的是
mingw_w64
我们之前已经安装好了 在cmd上也可以看到gcc
下面就直接来安装msys 最简化安装 在什么都没安装的情况下
MinGW安装好的文件夹 和Msys目录下的mingww64文件夹合并
之后我们运行msys2.exe 这边直接是不知道gcc
![](https://i-blog.csdnimg.cn/blog_migrate/9e48fff26253fdbc4562fe81bf014ba5.png)
运行mingw64.exe
![](https://i-blog.csdnimg.cn/blog_migrate/8c63e0b9d691d573873b27d45c0f2781.png)
在之后就安装几个必要的包 (
pacman -S make diffutils yasm
pkg-config
)
之后 一样的 把那个yasm.exe替换掉
直接去代码的目录去编译
./configure --enable-shared
make
还是出了之前的问题
![](https://i-blog.csdnimg.cn/blog_migrate/5cc9097302435db90b602a6698b54c27.png)
gcc直接报了这个错 我也是没有找到什么处理办法 如果有高人知道怎么弄这个 麻烦告诉我一下
那我换一个版本的代码试一下 现在3.2.2 会报这类的错误 那我试一下其他版本
2.8.9
直接连configure都不通过 (奇了怪了)
3.4.1
configure是可以 之后就来make
同样 也是报错
gcc.exe: error: libavcod: No such file or directory
4.0.1
首先 configure是可以通过的 就看make了
![](https://i-blog.csdnimg.cn/blog_migrate/4a62f311b8a61ffc53271eaa94dd51da.png)
我也是呵呵了 难道这个mingww64的gcc我装的有问题 不可能所有版本都出问题啊
(提示的错误都是gcc.exe 也就是我们的mingww64没有安装好)
暂时先算了吧 我先试下其他的(这种方法可以编译 只不过是使用msys2里边的gcc)
2.
交叉编译
交叉编译的话 首先也是自动交叉编译环境的问题
在WIKI上面提及的两个环境工程分别是MXE 和 Win-builds
比较推荐的就是MXE 说的是前者的依赖包什么的比后者多 而且前者支持MinGW、MinGW-w64
关于如何使用MXE可以看官网的教程 我是参考一篇博客来入门的,可以看笔记“
Linux下编译静态MinGW环境,编译windows平台Qt程序(使用MXE)
”
要安装MXE 需要安装一些基础包
yum install \
autoconf \
automake \
bash \
bison \
bzip2 \
flex \
gcc-c++ \
gdk-pixbuf2-devel \
gettext \
git \
gperf \
intltool \
libtool \
make \
openssl-devel \
p7zip \
patch \
perl \
pkgconfig \
python \
ruby \
scons \
sed \
unzip \
wget \
xz
在上边的所有的依赖项 都需要安装 如果源里面没有那就自己去下载就好
我这边也省的的麻烦 就直接make了
等make完了 我们就有了一个强大的交叉编译环境
不过需要注意下环境变量的问题
剩下的可以根据ffmpeg的wiki来了
由于时间的问题就不展开细说了
我们来看下面的两种
关于交叉编译环境 我也是醉了 为了安装mxe 我也是折腾了半小时(公司网络也是醉了,只能用VPN)
等安装好以后 就直接make(我想不麻烦 就直接编一个强大的交叉编译环境 反正等待的时间可以做点其他事)
结果悲剧了 我这边make了一个白天 出了问题
![](https://i-blog.csdnimg.cn/blog_migrate/bacd0a7fc45ee1dbcb35aa500fc15869.png)
没办法 解决这个问题吧 看着也不算太难
基本就是换一个automake版本就好了 可是 centos7的源里面没有1.15的版本 我就自己去下载了一个
之后直接解压
记住 解压以后一定要注意系统能不能使用到你的这个automake
还有 我这边只是把bin下面的路径 赋值到了$PATH里面 share里边的没有弄 后面导致了一个问题
之后我把share里边的东西 拷贝到/usr/share里边 就没有再说automake的问题了
可惜 后面还是出了一个问题(问题是一步一步解决的 解决一个就可以)
possibly undefined macro: AC_PROG_LIBTOOL If this token and others are legitimate, please use
这个问题网上解决办法挺多的
直接yum install libtool 就好了
之后就可以继续make mxe了(时间依旧巨长 所以要找个网络环境好点的服务器)
3.
编译Windows应用程序的FFMPEG
这种方式同样需要几种要求
- For Windows 10: Microsoft Visual Studio 2015 (tested with Visual Studio 2015 RTM)
- For Windows 8.1: Microsoft Visual Studio 2013 (use MSVC 2013 Update 3 RTM or newer)
- MSYS2 (GNU Make environment)
- YASM (x86 assembly code compiler)
- gas-preprocessor.pl (ARM assembly pre-processor)
我的系统是win10 也装了VS2015 之前也装了MSYS2
之后的还要两种
我们先从Msys2的配置来看 在这边需要安装 make gcc perl diffutils
最后的编译总是出问题 现在还不清楚./configure 后面的参数如何配置 毕竟出现过cl一类的错误
![](https://i-blog.csdnimg.cn/blog_migrate/12afa3de68deaefaa49e1cc06afa818d.png)
就说明那是平台一类的问题
后面用最简的(
./configure --toolchain=msvc
)也没有走过make的坎
![](https://i-blog.csdnimg.cn/blog_migrate/78b16d5fad995b74634eaf7dc1e8e936.png)
最后我直接参考了其他的资料重新安装了一遍(可以参考下“
win10 msys2 vs2015 ffmpeg3.2.2 编译
”和“
VS2015编译ffmpeg 3.4.2
”两篇笔记)
我把之前的msys2卸载以后 重新安装
之后就是在壳子里面直接安装需要的组件
pacman -S make gcc diffutils pkg-config
把msys2 里面的link.exe 改名(WIKI里面也有说)
之后把下载的yasm程序拷贝到msys2的相应目录下边 这几个步骤 wiki上面也有
之后配置msys2的命令脚本
msys2_shell.cmd
按照wiki改就好 删掉
rem set MSYS2_PATH_TYPE=inherit 前面的rem
之后直接在msys2的目录进入命令行模式
输入:
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat"
之后再输入:
msys2_shell.cmd -mingw64
我们可以来检查下必要的组件是否安装好了(
which cl link yasm cpp
)
如果显示了具体的路径 就说明可以(这些步骤 wiki里面也是有的)只是没有去管一个
gas-preprocessor.pl
文件
这里我们需要修改下msys2的显示设置(确实会出现乱码 要不到时候出错 你都不知道错在哪)
在msys2窗口上右击鼠标,选择[Options]菜单,选择[Text],locale选择:zh_CN,Character set 选择 GBK。
![](https://i-blog.csdnimg.cn/blog_migrate/84c77c3749ca8af2ef47a90a8798ddad.png)
之后就到ffmpeg的目录里边去
./configure --toolchain=msvc --arch=x86 --enable-yasm --enable-asm --enable-shared --disable-static
make
可惜啊 出了问题 显示的问题看着还很多
之后我看着错误的地方 去注释了两行代码 就可以make通过了
一个是
cmdutils.c 一个是
ffprobe.c
编辑文件 搜索
CC_IDENT 就会发祥只有两行出现了 注释它就好 前面的在1149行 后面的在3052行
make完了以后就直接
make install
我们就可以在msys2 下面的usr/local
下面看到我们编译好的文件了
4.
用msvc编译ffmpeg
这种方式其实就和上面的差不了多少 只不过 wiki里面也提及了对于老版本的VS需要些什么
其他的还是msys和yasm
wiki主要讲的还是老版本编译ffmpeg的过程 其实基本的步骤和上面的差不多
我这里就不多说了
总结:
基本上是把所有的编译方式都试了一遍,除了交叉编译的那个 因为mxe安装了一天一夜 还没安装好 我也没时间陪她玩
还有就是在本机编译使用mingww64+msys2的那个没有编译成功以外 基本都试过了一遍
linux平台 成功
Windows平台 基本成功