CompileFFmpeg4Windows

最近项目需要想整一下windows下面的FFmpeg编译,当然可以直接下载官方编译好的库,有个缺点就是官方的是默认的编译配置,所以如果我们想自定义配置ffmpeg的编译参数,还是得自己亲自来编译,官方提供三个版本的编译:

  • static:只有编译完成的exe程序;
  • shared:包含dllexe;
  • dev: 包含头文件.h,libdll.a

先来几个参考网站,

1、官方编译网站

2、Microsoft官方实例

编译需要的原料:

1、FFmpeg源码 —————– 官方下载

2、MSYS2(编译环境) ————-MSYS2官方下载

3、YASM ————————官方下载地址

4、gas-preprocessor ————下载地址

安装msys2

msys2类似于cygwin(可以在windows上配置linux环境)和mingw(git的bash环境),安装完成之后,先需要把安装目录下的msys2_shell.cmd中注释掉的rem set MSYS2_PATH_TYPE=inherit,改成set MSYS2_PATH_TYPE=inherit,主要是将vs的环境继承给msys2;接着打开msys2的shell,安装4个编译工具,

1
pacman -S make gcc perl diffutils

如果之前安装了cygwin,这里的安装可能会出现冲突问题,导致cygwin的bash窗口中没法使用一些命令,如:ls等等,一般会报错:

1
2
3
4
5
6
7
1 [main] ls (138392) D:\msys64\usr\bin\ls.exe: *** fatal error - cygheap base mismatch detected - 0x180305408/0x1802FE408.
This problem is probably due to using incompatible versions of the cygwin DLL.
Search for cygwin1.dll using the Windows Start->Find/Search facility
and delete all but the most recent version. The most recent version *should*
reside in x:\cygwin\bin, where 'x' is the drive on which you have
installed the cygwin distribution. Rebooting is also suggested if you
are unable to find another cygwin DLL.

这时候我们需要在我的电脑中改变一下环境变量,在Path中将D:\cygwin64\bin提到D:\msys64\usr\bin前面,没有的话可以先配置

替换yasm

将下载的yasm-**-win64.exe改成yasm.exe,替换msys安装目录x:\msys64\usr\bin\yasm.exe,可以做个备份把原来的改成yasm.bak

安装gas-preprocessor

将下载的gas-preprocessor.pl放到msys2安装目录下面x:\msys64\usr\bin\gas-preprocessor.pl

从VS的命令窗口重新启动msys2的bash窗口

这一步没有把握正确,编译很容易出错,例如cl is unable to create an executable file.正确的启动步骤是:先去打开VS的工具命令提示符,C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2015\Visual Studio Tools\Windows Desktop Command Prompts,然后在命名窗口中使用命令符打开msys2的bash窗口,
我安装在D盘,依次执行命令如下:

1
2
3
D:
cd msys64
msys2_shell.cmd

在bash窗口中先检查,安装环境是否已经正确配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ which cl
/d/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/amd64_x86/cl
$ which link
/d/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/amd64_x86/link
$ which yasm
/usr/bin/yasm
$ which cpp
/usr/bin/cpp
$ which gas-preprocessor.pl
/usr/bin/gas-preprocessor.pl

正确配置之后就可以进行编译了。

开始编译

编译ffmpeg,有两种方式,

微软官方Demo

可以按照微软官方的Demo教程来编译,先使用git下载,

1
2
3
git clone git://github.com/microsoft/FFmpegInterop.git
cd FFmpegInterop
git clone git://source.ffmpeg.org/ffmpeg.git

下载完成之后,目录结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.
├── ARM
├── BuildFFmpeg.bat
├── Debug
├── FFmpegConfig.sh
├── FFmpegInterop
├── FFmpegInterop.pfx
├── FFmpegWin10.VC.db
├── FFmpegWin10.sln
├── FFmpegWin8.1.sln
├── LICENSE
├── README.md
├── Samples
├── Tests
├── UpgradeLog.htm
├── ffmpeg
└── ipch

直接在bash窗口中进入,执行执行编译相应版本的命令就行了

1
2
3
4
5
BuildFFmpeg.bat win10 - Build for Windows 10 ARM, x64, and x86
BuildFFmpeg.bat phone8.1 ARM - Build for Windows Phone 8.1 ARM only
BuildFFmpeg.bat win8.1 x86 x64 - Build for Windows 8.1 x86 and x64 only
BuildFFmpeg.bat phone8.1 win10 ARM - Build for Windows 10 and Windows Phone 8.1 ARM only
BuildFFmpeg.bat win8.1 phone8.1 win10 - Build all architecture for all target platform

手动编译

首先步骤是./configure配置编译参数,可以参考微软Demo中的脚本FFmpegConfig.sh,先进入下载的FFmepg源码目录,
比如编译Win10的x64版本,

1
2
3
4
5
6
7
8
9
10
11
12
13
./configure \
--toolchain=msvc \
--disable-programs \
--disable-d3d11va \
--disable-dxva2 \
--arch=x86_64 \
--enable-shared \
--enable-cross-compile \
--target-os=win32 \
--extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_APP -D_WIN32_WINNT=0x0A00" \
--extra-ldflags="-APPCONTAINER WindowsApp.lib" \
--prefix=./Build/Windows10/x64
make install

编译完成之后,ffmpeg的编译库就在Build/Windows10/x64目录下面,目录结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
.
├── bin
│?? ├── avcodec-57.dll
│?? ├── avcodec.lib
│?? ├── avdevice-57.dll
│?? ├── avdevice.lib
│?? ├── avfilter-6.dll
│?? ├── avfilter.lib
│?? ├── avformat-57.dll
│?? ├── avformat.lib
│?? ├── avutil-55.dll
│?? ├── avutil.lib
│?? ├── swresample-2.dll
│?? ├── swresample.lib
│?? ├── swscale-4.dll
│?? └── swscale.lib
├── include
│?? ├── libavcodec
│?? ├── libavdevice
│?? ├── libavfilter
│?? ├── libavformat
│?? ├── libavutil
│?? ├── libswresample
│?? └── libswscale
└── lib
├── avcodec-57.def
├── avdevice-57.def
├── avfilter-6.def
├── avformat-57.def
├── avutil-55.def
├── pkgconfig
├── swresample-2.def
└── swscale-4.def
11 directories, 21 files