上一篇说了下linux平台下ffmpeg编译的问题
这里来看看windows平台的ffmpeg编译的问题。我们要编译windows平台下使用的ffmpeg,无外乎是两种方式,一种交叉编译,一种本地编译。交叉编译的话,就是在其他环境下编译windows平台适用的程序或者库。我们需要做的就是安装好交叉编译环境。另外一种本地编译,因为ffmpeg代码的特殊性,我们需要在windows系统里安装类unix环境。也就是在网上经常看到的msys一类的软件。
闲话不多说 我们来看看官网是怎么说的吧(感觉有点过时,读懂个意思就好)
1.本地编译 使用(MinGW OR MinGW-w64)+
MSYS2
2.Microsoft Visual C++ OR Intel C++ 编译
3.Windows和linux 交叉编译
4.
CygWin下的编译
5.
Windows在cygwin下的交叉编译
从ffmpeg的wiki来看 也有好几个(突然好想哭的感觉)
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版本可以来看下
pacman -S make diffutils yasm mingw-w64-x86_64-gcc
安装的有点久
下面来看一下gcc的版本
当然 我为了以防万一 还安装了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
运行mingw64.exe
在之后就安装几个必要的包 (
pacman -S make diffutils yasm
pkg-config
)
之后 一样的 把那个yasm.exe替换掉
直接去代码的目录去编译
./configure --enable-shared
make
还是出了之前的问题
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了
我也是呵呵了 难道这个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了一个白天 出了问题
没办法 解决这个问题吧 看着也不算太难
基本就是换一个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一类的错误
就说明那是平台一类的问题
后面用最简的(
./configure --toolchain=msvc
)也没有走过make的坎
最后我直接参考了其他的资料重新安装了一遍(可以参考下“
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。
之后就到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平台 基本成功