Windows下编译FFmpeg链接第三方库libRtmp,生成FFplay

PS: 前段时间一直在研究ffmpeg的编译,网上也是各种方法(其实大部分都只是编译了FFmpeg),但是能够链接成功libRtmp并生成FFplay的方法却很少能行的通。踩了好多坑,记录下,希望对大家有所帮助。

  本文主要参考:https://www.cnblogs.com/lidabo/p/7324568.html

一、安装环境准备

  1.在windows下需要安装MinGw环境。直接在https://sourceforge.net/projects/mingw/files/中点击 Windows下编译FFmpeg链接第三方库libRtmp,生成FFplay_第1张图片
就行。下载完成之后点击安装,一路默认即可。直到配置安装选项这里,在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源码目录。如图:
Windows下编译FFmpeg链接第三方库libRtmp,生成FFplay_第2张图片
然后一次运行:
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源码目录。如图:
Windows下编译FFmpeg链接第三方库libRtmp,生成FFplay_第3张图片
然后
./configure mingw --prefix=`pwd`/win32libs -DL_ENDIAN -DOPENSSL_NO_HW
make -j 8
make install

注意: pwd需要加`,编译完成后,把当前目录的win32libs子文件夹下的include和lib分别拷贝到C:\MinGW\mingw32\下,以供后面librtmp使用

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” 命令。然后重新编译即可。

编译libRtmp

以次输入:
make SYS=mingw
make SYS=mingw install

编译FFmpeg

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目录。
Windows下编译FFmpeg链接第三方库libRtmp,生成FFplay_第4张图片
Windows下编译FFmpeg链接第三方库libRtmp,生成FFplay_第5张图片

配置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

ps: make install如果保存找不到bin文件夹,手动挡创建一下。

编译完成之后将 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

注意:此时我们不需要手动指定SDL库了。

之后
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/ 目录下查看生成文件。

PS: 如果没有别的要求,尽量使用我文章中使用的第三方库的版本。

文章中使用的资源下载链接:https://download.csdn.net/download/a844651990/10580422

你可能感兴趣的:(ffmpeg)