目录
背景
配置编译环境
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不依赖任何库先编译
-
configure指令
./configure --disable-static --enable-shared --toolchain=msvc --arch=x86_64
-
make -j4
这里编译会遇到问题:
找不到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代码
-
下载 git clone https://code.videolan.org/videolan/x264.git
-
configure
./configure --enable-shared --host=x86_64-w64-mingw64 静态链接方式: ./configure --enable-static --host=x86_64-w64-mingw64
-
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进行编译,成功。 -
make install
-
修改 /usr/local/lib/pkgconfig 下的x264.pc,
ln -s /usr/local/lib/libx264.dll.a libx264.lib
-
-
x265
- 下载:https://bitbucket.org/multicoreware/x265/downloads/
- 运行 x265_3.2.1\build\vc15-x86_64\make-solutions.bat 生成 VC 工程
- 打开工程编译 64 位 Release
- 拷贝 x265.pc 到 /usr/local/lib/pkgconfig 下
拷贝 libx265.lib 到 /usr/local/lib 下
拷贝 x265.h, x265_config.h 到 /usr/local/include 下
-
nv硬件加速
- 下载: git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
- 下载 SDK 并解压
2.1 拷贝 include 目录下的文件到 /usr/local/include
2.2 拷贝 lib\x64 下的文件到 /usr/local/lib - make -j4
- make install
-
mp3lame
- 下载 https://sourceforge.net/projects/lame/files/lame/ 3.100版本
- ./configure --prefix=/usr/local/
- make 这个时候会报错
去frontend目录下将lametime.c的第139行注释掉再编译。 - 注意在编译FFmpeg时启用了–enable-libmp3lame的话会报错
处理方法是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
- 下载
- 使用visual studio 2013编译后将文件移动到/usr/local/bin 和 /usr/local/lib目录下
- 按照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}
- configure 加入 --enable-sdl2这样就能编译出ffplay了。
-
opencore-amr
- 下载:https://sourceforge.net/projects/opencore-amr/files/
- 编译 configure --prefix=/usr/local, make -j4, make install。
- 将.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
- 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
- configure加入–enable-libopencore-amrnb --enable-libopencore-amrwb --enable-vsersion3
-
openjpeg
- 下载:https://github.com/uclouvain/openjpeg
- 使用cmake进行工程配置,编译,将编译好的openjp2.lib openjp2.dll移动到/usr/local/lib 和/usr/loca/bin下面。头文件也对应移动过去(编译INSTALL工程,直接拷贝即可)
- 查看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" \