工具和源码准备

  1. ffmpeg https://ffmpeg.org/download.html#releases
  2. libx264 https://www.videolan.org/developers/x264.html
  3. libx265 https://www.videolan.org/developers/x265.html
  4. MSYS2 官网地址:https://www.msys2.org/
    (MSYS 2.0 提供了 pacman 软件管理器,通过它来安装依赖的软件。msys2不可以安装在FAT*格式的分区上。msys2不可以安装在winXP系统上
  5. VS2015
  6. CMAKE
    (a)关于VS版本:VS2010不支持C99,现在很多开源代码(比如x264,ffmpeg)中的C代码都采用c99规范,而vs2010,vs2012都不支持c99规范,从vs2013开始才部分支持c99规范。如果是VS2010编译,需要先采用C99 to C89 转换工具进行预处理)
    (b)VS需要使用英文语言包。否则后面编译ffmpeg会大量报错,命令行 error D8000:cl

编译方式

很多教程用 MinGW 来编译,最后编译出来的静态库是后缀 .a 的形式。
但是Windows 下的静态库是 .lib,如果直接用 CMake 去链接 .a 形式库肯定不行。
需要先把 .a 库转成 .def 文件,然后再把 .def 文件转成 .lib 文件,甚至再把 .lib 文件转成 .dll 的动态库,此方法比较麻烦。因此windows平台下建议用MSVC编译,而不是MinGW编译。

启动环境

开始菜单中找到并打开Visual Studio 2015 Command line。

Visual Studio Command line分为32位版本和64位版本。
用32位版本编译的程序就是32位的。用64位版本编译的程序就是64位的。编译出来的exe或者dll可以用dumpbin判断是32位还是64位。
查看32位还是64位:
dumpbin /headers libx264.dll
查看符号清单(导出函数):
dumpbin /exports libx264.dll > libx264-exports.txt

在Visual Studio 2015 Command line命令行终端中,进入到 MSYS 安装目录,打开 msys2_shell.cmd ,如下命令

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>c:/msys64/msys2_shell.cmd -use-full-path

注意-use-full-path的使用。因为在调用msys时如果不添加-use-full-path ,后面在msys2的shell中就会不认cc=cl。即无法在msys中使用MSVC。一下方法是等价的。建议第二种。

  • msys2_shell.cmd 中取消一行的注释:set MSYS2_PATH_TYPE=inherit
  • 调用msys2_shell.cmd时使用-use-full-path参数
  • 在windows系统的环境变量中添加 MSYS2_PATH_TYPE=inherit

MSYS2窗口打开后,先把基本的环境安装好

pacman -Syu
pacman -S make
pacman -S diffutils
pacman -S yasm
pacman -S nasm

x264

在该窗口中进入到 LibX264 的源码目录下,把如下代码保存成 .sh 文件并执行:

OPTIONS="--enable-shared 
        --enable-static  
      "
BUILD_DIR="./../build32"

CC=cl ./configure $OPTIONS --prefix=$BUILD_DIR/

make -j 16
make install
make clean

注意 configure 命令前缀有个 CC=cl ,代表使用 MSVC 来编译了。
将编译后的 libx264.dll.lib 改成 libx264.lib,这就是静态库了。如果不修改名字,后续FFMPEG编译的时候会提示找不到libx264。
编译完成之后,打开生成路径下/lib/pkgconfig/x264.pc文件。检查一下prefix的路径。建议直接改成绝对路径。pc文件后面编译ffmpeg要用到。
如果要编译

x265

x265采用cmake编译。相比x264而言,其build目录下已经把各个平台的sh文件提供了:
image.png
在msys2窗口中cd进入msys-cl目录,打开make-Makefiles.sh稍作修改如下:

#!/bin/sh
# This is to generate visual studio builds with required environment variables set in this shell, useful for ffmpeg integration
# Run this from within an MSYS bash shell

INSTALL_DIR="./../../../build32/"

if cl; then
    echo 
else
    echo "please launch msys from 'visual studio command prompt'"
    exit 1
fi

cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR -DCMAKE_CXX_FLAGS="-DWIN32 -D_WINDOWS -W4 -GR -EHsc" -DCMAKE_C_FLAGS="-DWIN32 -D_WINDOWS -W4"  ../../source

if [ -e Makefile ]
then
    nmake
fi

nmake install

相比默认的sh, 添加如下三行:

INSTALL_DIR="./../../../build32/"
-DCMAKE_INSTALL_PREFIX=$INSTALL_DIR
nmake install

然后在MSYS2下执行sh make-Makefiles.sh。一键等待即可。
如果要编译64位的x265,把make-Makefiles-64bit.sh作类似修改,从visual studio command line 64位进入,打开msys2, 再执行sh make-Makefiles-64bit.sh即可。

ffmpeg

继续在 MSYS 2.0 窗口中进入到下载好 FFmpeg 的源码目录,将如下代码保存成 .sh 文件并执行:

X264_INSTALL="/d/zsc/VSCODE_CPP_DIR/FFMPEG-H264-TEST/x264-master/build32"
X265_INSTALL="/d/zsc/VSCODE_CPP_DIR/FFMPEG-H264-TEST/x265-master/build32"

X264_INCLUDE=$X264_INSTALL/include
X264_LIB=$X264_INSTALL/lib
X264_BIN=$X264_INSTALL/bin

X265_INCLUDE=$X265_INSTALL/include
X265_LIB=$X265_INSTALL/lib
X265_BIN=$X265_INSTALL/bin

export PATH=$X264_BIN:$PATH
export PATH=$X265_BIN:$PATH

export PKG_CONFIG_PATH=$X264_LIB/pkgconfig:$PKG_CONFIG_PATH
export PKG_CONFIG_PATH=$X265_LIB/pkgconfig:$PKG_CONFIG_PATH

echo $PKG_CONFIG_PATH

BUILD_DIR="../build32"

OPTIONS="--toolchain=msvc 
         --arch=x86 
         --enable-yasm  
         --enable-asm 
         --enable-shared 
         --enable-static 
         --disable-programs 
         --enable-swresample 
         --enable-swscale 
         --enable-gpl 
         --enable-libx264 
         --enable-libx265   
         --enable-ffmpeg 
         --enable-ffplay 
         "

CC=cl ./configure $OPTIONS --prefix=$BUILD_DIR/

make -j 16
make install
make clean

经过十几分钟的等待,编译出ffmpeg库:
image.png
--arch=x86 表示编译32位的ffmpeg库。也可以从visual studio command line 64位进入,打开msys2,改sh,编译64位的ffmpeg库(x264 x265也得用64位的dll)。


熊吉
1 声望0 粉丝