本文主要参考:https://www.cnblogs.com/lidabo/p/7324568.html
1.在windows下需要安装MinGw环境。直接在https://sourceforge.net/projects/mingw/files/中点击
就行。下载完成之后点击安装,一路默认即可。直到配置安装选项这里,在BasicSetup中全部选中吧(左键点击弹出菜单)。 然后在All Packages 中选中 Perl,因为我们编译 openssl 需要Perl环境。
完成之后点击Installation,然后Apply。稍等片刻。完成之后在 C:\MinGW\msys\1.0 下新建home\username 目录存储来放我们需要的第三方库(也可以不放在这里主要是为了方便)。
1、librtmp2.3 下载地址 http://rtmpdump.mplayerhq.hu/
下载rtmpdump-2.3.tgz版本,这个版本中有源码和Makefile。稍后我们进行编译,因为librtmp依赖于zlib和openssl,所以要先编译两个库。
2、zlib 1.2.11 下载地址 http://zlib.net/
解压完成之后运行 C:\MinGW\msys\1.0\ 下的 msys.bat 切换到zlib源码目录。如图:
然后一次运行:
make -f win32/Makefile.gcc
cp -iv zlib1.dll /mingw/bin
cp -iv zconf.h zlib.h /mingw/include
cp -iv libz.a /mingw/lib
cp win32/Makefile.gcc Makefile.gcc
ffmpeg编译参数:–enable-zlib
2、OpenSSl1.0.1 下载地址 http://www.openssl.org/
OpenSSL可能需要管理员身份进行解压不然会报错。 解压完成之后切换到OpenSSL源码目录。如图:
然后
./configure mingw --prefix=`pwd`/win32libs -DL_ENDIAN -DOPENSSL_NO_HW
make -j 8
make install
ffmpeg编译参数:–enable-nonfree --enable libopenssl
make的时候报错了:
../libssl.a(tls_srp.o):tls_srp.c:(.text+0xdb0): undefined reference to `BN_clear_free'
../libssl.a(tls_srp.o):tls_srp.c:(.text+0xdbc): undefined reference to `BN_clear_free'
../libssl.a(tls_srp.o):tls_srp.c:(.text+0xe03): undefined reference to `BN_num_bits'
../libssl.a(tls_srp.o):tls_srp.c:(.text+0xe31): undefined reference to `RAND_bytes'
../libssl.a(tls_srp.o):tls_srp.c:(.text+0xe4b): undefined reference to `BN_bin2bn'
../libssl.a(tls_srp.o):tls_srp.c:(.text+0xe61): undefined reference to `OPENSSL_cleanse'
../libssl.a(tls_srp.o):tls_srp.c:(.text+0xe83): undefined reference to `SRP_Calc_A'
../libssl.a(tls_srp.o):tls_srp.c:(.text+0xed4): undefined reference to `SRP_check_known_gN_param'
../libssl.a(t1_reneg.o):t1_reneg.c:(.text+0xe8): undefined reference to `ERR_put_error'
../libssl.a(t1_reneg.o):t1_reneg.c:(.text+0x198): undefined reference to `ERR_put_error'
../libssl.a(t1_reneg.o):t1_reneg.c:(.text+0x1d8): undefined reference to `ERR_put_error'
../libssl.a(t1_reneg.o):t1_reneg.c:(.text+0x358): undefined reference to `ERR_put_error'
../libssl.a(t1_reneg.o):t1_reneg.c:(.text+0x4b8): undefined reference to `ERR_put_error'
../libssl.a(t1_reneg.o):t1_reneg.c:(.text+0x508): more undefined references to `ERR_put_error' follow
../libssl.a(t1_reneg.o):t1_reneg.c:(.text+0x54c): undefined reference to `OpenSSLDie'
../libssl.a(t1_reneg.o):t1_reneg.c:(.text+0x57c): undefined reference to `OpenSSLDie'
../libssl.a(t1_reneg.o):t1_reneg.c:(.text+0x5e8): undefined reference to `ERR_put_error'
collect2.exe: error: ld returned 1 exit status
make[2]: *** [link_app.] Error 1
make[2]: Leaving directory `/home/guo/openssl-1.0.1/openssl-1.0.1/apps'
make[1]: *** [openssl.exe] Error 2
make[1]: Leaving directory `/home/guo/openssl-1.0.1/openssl-1.0.1/apps'
make: *** [build_apps] Error 1
一大堆未定义的引用错误。
1、修改MakeFile,将
build_all: build_libs build_apps build_tests build_tools
修改为:
build_all: build_libs
将
DIRS= crypto ssl engines apps test tools
修改为:
DIRS= crypto ssl engines
2、在mysys命令行中输入 mingw-get upgrade “w32api<5.0.2” 命令。然后重新编译即可。
以次输入:
make SYS=mingw
make SYS=mingw install
1、下载ffmpeg源码, git clone git://source.ffmpeg.org/ffmpeg.git, 可能会比较慢。
2、ffplay显示需要SDL2,下载SDL2库(MinGW版本)。
我在编译的过程中SDl库一直自动检测不到,因此手动指定下。将SDL的include目录下的SDL2目录和SDL的lib目录拷贝到C:\MinGW\msys\1.0\local\ 对应的include和lib目录。
配置FFmpeg:
./configure --enable-static --disable-shared --arch=x86 --target-os=mingw32 --pkg-config=pkg-config --disable-debug --enable-gpl
--enable-zlib --enable-openssl --enable-librtmp --enable-nonfree --extra-ldflags=-L/local/lib --extra-cflags=-I/local/include
--extra-libs='-lwsock32 -lrtmp -lssl -lcrypto -lws2_32 -lgdi32 -lcrypt32 -lm -lz -lpsapi -lwinmm -lSDL2 -lSDL2main' --enable-ffplay
可能会报错: ERROR: librtmp not found using pkg-config
修改下configure文件:注释掉 enabled librtmp (不知道为啥通过pkconfig就是找不到,注释掉吧)
重新配置,配置时间有点长,完成之后查看一下ffmpeg源码目录下的ffbuild目录下的config.mak文件,查看配置结果:
!CONFIG_SDL2=yes
...
!CONFIG_FFPLAY=yes
...
CONFIG_LIBRTMP_PROTOCOL=yes
CONFIG_LIBRTMPE_PROTOCOL=yes
CONFIG_LIBRTMPS_PROTOCOL=yes
CONFIG_LIBRTMPT_PROTOCOL=yes
CONFIG_LIBRTMPTE_PROTOCOL=yes
可以看到librtmp找到并配置完成了,但是SDL2找不到,这样是没法生成ffplay的。
解决办法:
官网下载源码,自己编译: https://www.libsdl.org/download-2.0.php
./configure
make -j 8
make install
编译完成之后将 libSDL2.a libSDL2.dll.a libSDL2main.a 拷贝到C:\MinGW\mingw32\lib下重新配置:
./configure --enable-gpl --enable-version3 --enable-static --disable-shared --arch=x86 --target-os=mingw32 --pkg-conf
ig=pkg-config --disable-debug --enable-gpl --enable-zlib --enable-openssl --enable-librtmp --enable-nonfree --extra-ldf
lags=-L/local/lib --extra-cflags=-I/local/include --extra-libs='-lwsock32 -lrtmp -lssl -lcrypto -lws2_32 -lgdi32 -lcryp
t32 -lm -lz -lpsapi -lwinmm' --enable-ffplay
之后
make -j 8
又报错了( ╯□╰ )
ffbuild/common.mak:174: *** missing separator. Stop.
输入以下指令
Git config --global core.autocrlf false
git rm --cached -r .
git reset --hard
然后重新配置下,记得注释掉:
#enabled librtmp && require_pkg_config librtmp librtmp librtmp/rtmp.h RTMP_Socket
configure完成之后 make -j 8
make install
编译过程过还可能遇到错误:
...
In file included from c:\mingw\include\windows.h:80:0,
from libavutil/time.c:33:
c:\mingw\include\winsock2.h:109:8: error: redefinition of 'struct timeval'
struct timeval {
^~~~~~~
In file included from libavutil/time.c:27:0:
c:\mingw\include\sys\time.h:55:8: note: originally defined here
struct timeval
...
修改ffmpeg源码文件 time.c 包含
#if HAVE_UNISTD_H
#include
#endif
#if HAVE_WINDOWS_H
#define WIN32_LEAN_AND_MEAN
#include
#endif
至此编译安装完成。可以在/usr/local/bin/ 目录下查看生成文件。
文章中使用的资源下载链接:https://download.csdn.net/download/a844651990/10580422