vs2013編譯ffmpeg之二十五 Openssl、rtmpdump

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都刪除後重新編譯。

發佈了49 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章