windows下使用msys64编译FFmpeg代码

背景

配置编译环境

1. 安装 MSYS2, 64 位版本 http://www.msys2.org/
2. 安装基本环境:
   pacman -S vim
   pacman -S git
   pacman -S --disable-download-timeout base-devel
3. 安装 MinGW:
	pacman -S --disable-download-timeout gcc
    pacman -S --disable-download-timeout mingw-w64-x86_64-toolchain
    pacman -S --disable-download-timeout yasm
	pacman -S --disable-download-timeout nasm
4. 修改 msys2_shell.cmd 文件:
    取消:  rem set MSYS2_PATH_TYPE=inherit 的注释.
    添加:  call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
5. msys64\usr\bin\link.exe 改名 glink.exe, 避免和 VC 的 link 程序冲突.
   拷贝 msys64\mingw64\bin\tclsh.exe 到 msys64/usr/bin/tclsh.exe
6. 安装依赖包
    pacman -S openssl
    pacman -S libopenssl

编译FFmpeg代码

  • FFmpeg不依赖任何库先编译
    1. configure指令

      ./configure --disable-static --enable-shared --toolchain=msvc --arch=x86_64
      
    2. make -j4
      这里编译会遇到问题:
      tv_sec定义找不到
      找不到timespec定义,那我们把他定义在avutil的time.h中

      libavutil time.h中增加timespec定义
      #ifndef _CRT_NO_TIME_T
      struct timespec
      {
      	time_t tv_sec;  // Seconds - >= 0
      	long   tv_nsec; // Nanoseconds - [0, 999999999]
      };
      #endif
      
  • 配置PKG_CONFIG_PATH,否则pkg-config可能找不到编译完的开源库
      PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
    
  • 编译x264代码
    1. 下载 git clone https://code.videolan.org/videolan/x264.git

    2. configure

       ./configure --enable-shared --host=x86_64-w64-mingw64
       静态链接方式:
       ./configure --enable-static --host=x86_64-w64-mingw64
      
    3. make -j4
      这里报错
      libx264.a(win32thread.o):win32thread.c:(.text+0x60):对‘_beginthreadex’未定义的引用
      libx264.a(win32thread.o):win32thread.c:(.text+0x60): 截断重寻址至相符: R_X86_64_PC32 针对未定义的符号 _beginthreadex
      collect2: 错误:ld 返回 1
      解决:
      启动mingw64.exe进行编译,成功。

    4. make install

    5. 修改 /usr/local/lib/pkgconfig 下的x264.pc,

      ln -s /usr/local/lib/libx264.dll.a libx264.lib
      
  • x265
    1. 下载:https://bitbucket.org/multicoreware/x265/downloads/
    2. 运行 x265_3.2.1\build\vc15-x86_64\make-solutions.bat 生成 VC 工程
    3. 打开工程编译 64 位 Release
    4. 拷贝 x265.pc 到 /usr/local/lib/pkgconfig 下
      拷贝 libx265.lib 到 /usr/local/lib 下
      拷贝 x265.h, x265_config.h 到 /usr/local/include 下
  • nv硬件加速
    1. 下载: git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
    2. 下载 SDK 并解压
      2.1 拷贝 include 目录下的文件到 /usr/local/include
      2.2 拷贝 lib\x64 下的文件到 /usr/local/lib
    3. make -j4
    4. make install
  • mp3lame
    1. 下载 https://sourceforge.net/projects/lame/files/lame/ 3.100版本
    2. ./configure --prefix=/usr/local/
    3. make 这个时候会报错
      在这里插入图片描述
      去frontend目录下将lametime.c的第139行注释掉再编译。
    4. 注意在编译FFmpeg时启用了–enable-libmp3lame的话会报错
      编译FFmpeg enable mp3lame
      处理方法是configure再增加指令 --extra-libs="-lm"
      原因是在libmp3lame.la文件中有这么一句话:
       # Libraries that this one depends upon.
      dependency_libs=' -lm'
      

    结果发现还是不行,之后从ffbuild下的config.log中找问题,自己测试指令,发现测试是可以通过的。
    之后修改mp3lame.pc
    bash 将 Libs: -L${exec_prefix}/lib -lmp3lame 修改为 Libs: -L${exec_prefix}/lib -llibmp3lame
    很奇怪,pkg-config能识别到mp3lame但configure就是不行,直接在configure后面加上–extra-ldflags="-L/usr/local/lib"测试发现也不行。
    最终解决办法:
    1. mp3lame通过visual studio编译,编译结束后,将lib dll移动到/usr/local/bin和/usr/local/lib目录下。
    2. 修改configure文件6334行,配置libmp3lam的地方,改为
    enabled libmp3lame && require “libmp3lame >= 3.98.3” lame/lame.h lame_set_VBR_quality /usr/local/lib/libmp3lame.lib
    3. configure 增加 --enable-libmp3lame, make, make install
    4. 编译结束后ffmpeg --codecs > codecs.txt 查找mp3关键字,发现libmp3lame即成功。

  • SDL2
    1. 下载
    2. 使用visual studio 2013编译后将文件移动到/usr/local/bin 和 /usr/local/lib目录下
    3. 按照x264.pc规则创建SDL2.pc,内容如下:
      prefix=/usr/local
      exec_prefix=${prefix}
      libdir=${exec_prefix}/lib
      includedir=${prefix}/include/SDL2
      
      Name: SDL2
      Description: Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer.
      Version: 2.0.12
      Libs: -L${libdir} -lSDL2
      Libs.private: 
      Cflags: -I${includedir}
      
    4. configure 加入 --enable-sdl2这样就能编译出ffplay了。
  • opencore-amr
    1. 下载:https://sourceforge.net/projects/opencore-amr/files/
    2. 编译 configure --prefix=/usr/local, make -j4, make install。
    3. 将.a软连接生成lib
      ln -s /usr/local/lib/libopencore-amrnb.a /usr/local/lib/libopencore-amrnb.lib
      ln -s /usr/local/lib/libopencore-amrwb.a /usr/local/lib/libopencore-amrwb.lib
      
    4. FFmpeg目录 configure 搜索opencore-amr修改
      #enabled libopencore_amrnb && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
      enabled libopencore_amrnb && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init /usr/local/lib/libopencore-amrnb.lib
      #enabled libopencore_amrwb && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
      enabled libopencore_amrwb && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init /usr/local/lib/libopencore-amrwb.lib
      
    5. configure加入–enable-libopencore-amrnb --enable-libopencore-amrwb --enable-vsersion3
  • openjpeg
    1. 下载:https://github.com/uclouvain/openjpeg
    2. 使用cmake进行工程配置,编译,将编译好的openjp2.lib openjp2.dll移动到/usr/local/lib 和/usr/loca/bin下面。头文件也对应移动过去(编译INSTALL工程,直接拷贝即可)
    3. 查看configure文件关于openjpeg的得知也需要写.pc文件,那么创建openjpeg.pc
      prefix=/usr/local
      exec_prefix=${prefix}
      libdir=${exec_prefix}/lib
      includedir=${prefix}/include/openjpeg-2.3
      
      Name: openjpeg
      Description: OpenJPEG is an open-source JPEG 2000 codec written in C language.
      Version: 2.3
      Libs: -L${libdir} -lopenjp2
      Libs.private: 
      Cflags: -I${includedir}
      

最终指令

 ./configure --disable-static --enable-shared --toolchain=msvc --arch=x86_64 --enable-gpl --enable-libx264 --enable-libx265  --enable-encoder=libx264 --enable-encoder=libx265   --enable-sdl2 --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-version3 --enable-libopenjpeg

后话:依赖库静态编译
–pkg-config-flags="–static"
–extra-cflags="-IKaTeX parse error: Undefined control sequence: \ at position 28: …build/include" \̲ ̲--extra-ldflags…HOME/ffmpeg_build/lib" \

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值