Openssl
對應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規則裏面。
rtmpdump
對應ffmpeg configure選項–enable-librtmp。
下載rtmpdump-2.3.tgz,其源代碼裏面沒有MSVC工程,由於其依賴openssl,本來想用msys編譯rtmpdump,並鏈接vs2013編譯出來的openssl庫,但發現二者鏈到一起比較困難,缺了很多符號。所以直接建立rtmp的MSVC工程。
建立librtmp的工程
先建立librtmp的工程,選靜態庫,將librtmp目錄下的5個文件:amf.c、hashswf.c、log.c、parseurl.c、rtmp.c加到工程裏面。
rtmp_sys.h裏面,將
#ifdef _XBOX
#include <xtl.h>
#include <winsockx.h>
#define snprintf _snprintf
#define strcasecmp stricmp
#define strncasecmp strnicmp
#define vsnprintf _vsnprintf
#else /* !_XBOX */
#include <winsock2.h>
#include <ws2tcpip.h>
#endif
改成:
#ifdef _XBOX
#include <xtl.h>
#include <winsockx.h>
#define snprintf _snprintf
#define strcasecmp stricmp
#define strncasecmp strnicmp
#define vsnprintf _vsnprintf
#else /* !_XBOX */
#include <winsock2.h>
#include <ws2tcpip.h>
#define snprintf _snprintf
#define strcasecmp stricmp
#define strncasecmp strnicmp
#define vsnprintf _vsnprintf
#endif
代碼默認是支持openssl的,工程裏面加上openssl、zlib的頭文件路徑。將rtmp.c裏面與netstackdump文件相關的代碼都註釋掉,避免後續編譯ffmpeg的時候找不到符號。
建立rtmpdump的工程
然後建立rtmpdump工程,選console程序:
加入根目錄下的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都刪除後重新編譯。