对应ffmpeg configure选项–enable-openssl。
Openssl是从https://github.com/ShiftMediaProject上下载的。
ffmpeg-3.3在configure的时候遇到下面这个错误:
libcryptod.lib(cryptlib.obj) : error LNK2019: 无法解析的外部符号 impGetProcessWindowStation@0,该符号在函数 _OPENSSL_isservice 中被引用
libcryptod.lib(cryptlib.obj) : error LNK2019: 无法解析的外部符号 impGetUserObjectInformationW@20,该符号在函数 _OPENSSL_isservice 中被引用
libcryptod.lib(cryptlib.obj) : error LNK2019: 无法解析的外部符号 impMessageBoxW@16,该符号在函数 _OPENSSL_showfatal中被引用
libcryptod.lib(rand_win.obj) : error LNK2019: 无法解析的外部符号 impCreateCompatibleBitmap@12,该符号在函数 _readscreen 中被引用
libcryptod.lib(rand_win.obj) : error LNK2019: 无法解析的外部符号 impDeleteObject@4,该符号在函数 _readscreen 中被引用
libcryptod.lib(rand_win.obj) : error LNK2019: 无法解析的外部符号 impGetDeviceCaps@8,该符号在函数 _readscreen 中被引用
libcryptod.lib(rand_win.obj) : error LNK2019: 无法解析的外部符号 impGetDIBits@28,该符号在函数 _readscreen 中被引用
libcryptod.lib(rand_win.obj) : error LNK2019: 无法解析的外部符号 impGetObjectW@12,该符号在函数 _readscreen 中被引用
libcryptod.lib(rand_win.obj) : error LNK2019: 无法解析的外部符号 impGetDC@4,该符号在函数 _readscreen 中被引用
libcryptod.lib(rand_win.obj) : error LNK2019: 无法解析的外部符号 impReleaseDC@8,该符号在函数 _readscreen 中被引用
这些符号在user32.lib Gdi32.lib里面,将这两个库加到openssl.pc的Libs规则里面。
对应ffmpeg configure选项–enable-librtmp。
下载rtmpdump-2.3.tgz,其源代码里面没有MSVC工程,由于其依赖openssl,本来想用msys编译rtmpdump,并链接vs2013编译出来的openssl库,但发现二者链到一起比较困难,缺了很多符号。所以直接建立rtmp的MSVC工程。
先建立librtmp的工程,选静态库,将librtmp目录下的5个文件:amf.c、hashswf.c、log.c、parseurl.c、rtmp.c加到工程里面。
rtmp_sys.h里面,将
#ifdef _XBOX
#include
#include
#define snprintf _snprintf
#define strcasecmp stricmp
#define strncasecmp strnicmp
#define vsnprintf _vsnprintf
#else /* !_XBOX */
#include
#include
#endif
改成:
#ifdef _XBOX
#include
#include
#define snprintf _snprintf
#define strcasecmp stricmp
#define strncasecmp strnicmp
#define vsnprintf _vsnprintf
#else /* !_XBOX */
#include
#include
#define snprintf _snprintf
#define strcasecmp stricmp
#define strncasecmp strnicmp
#define vsnprintf _vsnprintf
#endif
代码默认是支持openssl的,工程里面加上openssl、zlib的头文件路径。将rtmp.c里面与netstackdump文件相关的代码都注释掉,避免后续编译ffmpeg的时候找不到符号。
加入根目录下的rtmpdump.c、thread.c。设置好头文件路径,宏定义里面加上RTMPDUMP_VERSION=”2.3”,不能定义成数字,不然编译会有问题,运行的时候rtmpdump也会直接退出。依赖的外部库文件里面加入:
libcryptod.lib
libssld.lib
librtmp.lib
zlibstat.lib
ws2_32.lib
mingwex.lib
gcc.lib
后面3个库是从ffmpeg里面取的,也就是MinGW+msys环境里面的。
同理,建立rtmpgw、rtmpsrv、rtmpsuck等工程,rtmpdump工程里面的代码要编译成C++,不然改起来比较麻烦,如下图所示:
MSVC2013+ffmpeg-3.3,编译的时候出现下面的错误:
libavformat.a(allformats.o) : error LNK2001: 无法解析的外部符号 _ff_ffrtmpcrypt_protocol
libavformat.a(allformats.o) : error LNK2001: 无法解析的外部符号 _ff_ffrtmphttp_protocol
libavformat.a(allformats.o) : error LNK2001: 无法解析的外部符号 _ff_rtmp_protocol
libavformat.a(allformats.o) : error LNK2001: 无法解析的外部符号 _ff_rtmpe_protocol
libavformat.a(allformats.o) : error LNK2001: 无法解析的外部符号 _ff_rtmps_protocol
libavformat.a(allformats.o) : error LNK2001: 无法解析的外部符号 _ff_rtmpt_protocol
libavformat.a(allformats.o) : error LNK2001: 无法解析的外部符号 _ff_rtmpte_protocol
libavformat.a(allformats.o) : error LNK2001: 无法解析的外部符号 _ff_rtmpts_protocol
ffmpeg config.h里面的宏定义是正确的,已经加入了librtmp支持,前面没有加–enable-librtmp编译过ffmpeg。解决的办法是将libavformat下面的.d、.o都删除后重新编译。