编译ffmpeg(二)

上一篇说了下linux平台下ffmpeg编译的问题

这里来看看windows平台的ffmpeg编译的问题。我们要编译windows平台下使用的ffmpeg,无外乎是两种方式,一种交叉编译,一种本地编译。交叉编译的话,就是在其他环境下编译windows平台适用的程序或者库。我们需要做的就是安装好交叉编译环境。另外一种本地编译,因为ffmpeg代码的特殊性,我们需要在windows系统里安装类unix环境。也就是在网上经常看到的msys一类的软件。

闲话不多说   我们来看看官网是怎么说的吧(感觉有点过时,读懂个意思就好)

从之前的那个网页( https://www.ffmpeg.org/platform.html )可以看到在Windows上有有以下方式
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运行库
VC运行库,是 Visual   C++ 的运行库。很多程序在编制的时候,使用了微软的运行库,大大减少了软件的编码量,却提高了兼容性。但运行的时候,需要这些运行库。这些运行库简称就是MSVC。

我们就来按照WIKI的四个来一个个编译
1.MinGW+MSYS
为了在Windows上编译FFMPEG,需要安装MinGW环境和一些严格需要的工具。
官方的wiki上面说我们的编译器有两种选择
  1. MinGW-w64
  2. MinGW "mainline"
在wiki也说了   两个的功能都是提供需要的gcc   不过较为推荐前者, 前者比后者的最新版本稍多一些,而且提供了更多的库兼容性,比如DirectShow头,所以最好使用mingw-w64。
我这边直接下载了在线安装包  但是在安装的时候   提示我已经下载过了  一直没办法安装  
后来我重新下载了一遍    又奇迹般的好了  下载地址( http://mingw-w64.org/doku.php/download
我的安装路径是默认的   没有去管
C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0
之后就是添加系统变量啥的   关于这个的安装  网上一大堆资料  这里就不细说

之后就是MSYS了   这个其实就是提供了几个gnu的工具  
在WIKI也有两个推荐   MSys or MSYS2
我自己用的是MSYS2  下载地址( https://msys2.github.io/ .
关于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

等弄好以后  就直接git下软件      git clone https://github.com/mxe/mxe.git
在上边的所有的依赖项  都需要安装   如果源里面没有那就自己去下载就好
确保都安装完了   在根据官网教程来安装( http://mxe.cc/#tutorial
我这边也省的的麻烦  就直接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
这种方式同样需要几种要求  
我的系统是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需要些什么
对于在MSVC2012之前的VS   就需要  C99-to-C89 Converter & Wrapper      msinttypes
其他的还是msys和yasm
wiki主要讲的还是老版本编译ffmpeg的过程  其实基本的步骤和上面的差不多   
我这里就不多说了



总结:
基本上是把所有的编译方式都试了一遍,除了交叉编译的那个   因为mxe安装了一天一夜  还没安装好  我也没时间陪她玩
还有就是在本机编译使用mingww64+msys2的那个没有编译成功以外  基本都试过了一遍
linux平台   成功
Windows平台    基本成功


猜你喜欢

转载自blog.csdn.net/cyq129445/article/details/80885093
今日推荐